Einfache DTMF-Schleife erkennt log.10 nicht

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Einfache DTMF-Schleife erkennt log.10 nicht

      Hallo Community,
      beim Test meiner Decoderboards ist mir aufgefallen, daß im DTMF-Frame die 10 nicht decodiert wird.
      Den Zweizeiler hänge ich mal unten ran.
      Die Boards laufen im Betrieb mit einer anderen Applikation aber fehlerfrei. Dort wird der Frame von einem Encoder HT9200A erzeugt.
      Hat jemand eine Idee, was dahintersteckt?
      Gruß Rudi
      Files
      • DTMF 1-15.JPG

        (70.92 kB, downloaded 37 times, last: )
      Vielleicht fällt mir noch etwas ein...
    • Da der Ausgang des MC für jede Ziffer ein Tongemisch aus 2 Frequenzen ist, ist es nicht einfach diese mit dem Scope zu messen. Ich habe deshalb einen DTMF Decoder nachgeschaltet und der zeigt mir die 4Bit über LED's an. Die zeigen wie folgt BCD an:
      0001
      0010
      0011
      0100
      0101
      0110
      0111
      1000
      1001
      1011 <erwartet wäre 1010
      1100
      1101
      1110
      1111
      Decodiert werden hier nur 14 Steps.
      Daß der Decoder in einer anderen Applikation fehlerfrei bis 15 arbeitet, lässt mich vermuten, daß mit der Frequenzaufbereitung im MEGA8 etwas nicht ganz funktioniert.
      Vielleicht fällt mir noch etwas ein...
    • Kommt was aus dem Ausgang raus? 10 entspricht nach bascom-Hilfe dem *.

      du verwendest ja den internen rc-Takt, spiel doch mal an der Anweisung $crystal bisschen rum, mal 2% nach oben oder unten ändern.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Ich meinte, dass vielleicht dein RC-Oszillator von den vermuteten 8 Mhz zu stark abweicht und dadurch die erzeugten Frequenzen nicht mehr passen. Mit $crystal kannst du dein Programm ja auf die tatsächliche Taktfrequenz justieren.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Wenn es um den internen Oszillator geht, kann man evtl. mit OSCCAL herumspielen.
      Wenn es eine externe Taktquelle ist, dann sollte die m.E. auch stimmen. Es sei denn, man hat eine falsche Kondensatorbeschaltung oder falsche Kapazitäten durch Aufbau auf einer Experimentierplatine oder zu weite Abstände.
      Mit $crystal würde ich eher nicht herumspielen. Das kann zwar helfen, ist aber m.E. ein falscher Weg, einen Fehler weiter vorn auszubügeln.
    • stefanhamburg wrote:

      Mit $crystal würde ich eher nicht herumspielen. Das kann zwar helfen, ist aber m.E. ein falscher Weg, einen Fehler weiter vorn auszubügeln.
      da gebe ich dir Recht, es war von mir nur mal als ein Test gedacht, ob es an einer falschen Taktfrequenz liegt. Und da ist das Ändern von $crystal einfacher, als an den fuses zu stellen.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Hallo Community,
      danke für die rege Beteiligung.
      Mit $crystal zu variieren war nicht zielführend. Jetzt ist der 12MHz Quarz in Betrieb und so läuft es reproduzierbar :
      Ich habe mal die For-Next Schleife so verändert, dass sie den Wert für DTMF-out mittels read-Anweisung aus Data-Einträgen lesen muss.
      Dabei hat sich ergeben, daß die log. 0 von dem Decoder als 10 erkannt wird.
      Die Data Einträge 1,2,3,4,5,6,7,8,9,0,11,12,13,14,15 ergeben am Decoder dann 1 bis15.
      Warum das bei BASCOM so ist, erschließt sich mir momentan noch nicht so.
      Gruß Rudi
      Vielleicht fällt mir noch etwas ein...
    • Hallo Community,
      ergänzend zum letzten Eintrag noch folgendes:
      Das Lesen der Werte mittels read funktioniert nicht so wie erwartet.
      Sobald in der Schleife die DTMFout Anweisung aktiv ist, werden die Werte ab log.2 aus dem Data-Pool als FF(255) gelesen.
      Das kann der DTMF-Decoder natürlich nicht verarbeiten.
      Ist der DTMFout Befehl auskommentiert, sieht man in der Simulation, dass die Datawerte korrekt gelesen werden.
      Was steckt dahinter?
      Gruß und schönen Sonntag noch,
      Rudi
      Files
      Vielleicht fällt mir noch etwas ein...
    • Framesize zu klein. Vergleiche mal, was der code-explorer anzeigt und berücksichtige das
      The calculated stack settings are based on the program call tree and local variables. This is just a tool to give you an idea about stack usage. Not taken into account is the stack required by the assembler routines. This means that you need to add a certain amount to the calculated values. When your code uses interrupts you need to increase the calculated $HWSTACK by 32. Otherwise increase it by 16. The $FRAMESIZE should have a minimum value of 24. Add a value of 16 to $SWSTACK.
      Applications using AVR-DOS should use a minimum of 128 for all stacks.
      A future version will also take the assembler code into account.
      avrhelp.mcselec.com/view_code_explorer.htm
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • New

      Hallo Rudi_Einstein,

      vorab: es ist schwer, dir zu helfen, wenn du Text als Graik einbindest.
      Man kann es nicht kopieren für die eigene Umgebung, um selber zu testen.
      Das Bild braucht ein eigenes Fenster und ist als jpg unscharf.

      In deinem Programm steht die Anweisung $sim, was dazu führt, dass Wartezeiten nicht korrekt eingehalten werden
      Die Anweisung $prog ist auch nicht nötig, wenn du nicht in Serie produzierst ;)
    • New

      Hallo Michael,
      danke für deine Einschätzung und stimme dir zu.
      Ich werde künftig das Programm aus dem Editor mit copy & paste in meinen Beitrag einfügen.
      So hat es der Interessierte natürlich leichter das mal kurz auszuprobieren; hab ich verstanden.
      Ich hab mal gelesen, daß es eine Funktion im Editor gibt, die das mit Zeilennummern kann. Du kennst sie bestimmt.

      Bezüglich $sim: Bislang habe ich das so verstanden, daß $sim immer dort stehen muß, wenn ich das Programm mit dem Simulator ansehen will. Ist das nicht nötig?
      Den Simulator habe ich verwendet, um nachzusehen was in der Schleife gelesen wird, denn mein Decoder erkannte nur die log.1
      Nach auskommentieren der dtmfout- Anweisung konnte man die Data-Werte als richtig gelesen erkennen.

      $prog ist nach dem Ändern der FuseBits automatisch eingefügt worden, nachdem ich tschoeatsch's Vorschlag, mit dem Takt Veränderungen vorzunehmen, ausprobiert habe. (4MHz RC; 8MHz RC; 12MHz ext Quarz).

      Die Notwendigkeit die einzelnen Werte mit einer Data- Anweisung zu verarbeiten ergab sich aus der Tatsache, daß der verwendete Decoder die log.0 als log.10 und log.16 als log.0 erkennt.

      Nachfolgendes Programm decodiert das Board ab log.2 nicht, weil "wert" dann immer 255 ist :

      'DTMF out 1-15 auf MT8870 Decoder-Board von LC Technology
      'PORTB.1 OC1A output pin 15 ATMEGA8A
      '-----------------------------------------------------------------------------------------
      $regfile = "m8adef.dat"
      $crystal = 12000000
      $hwstack = 32
      $swstack = 40
      $framesize = 40

      Enable Interrupts
      Dim wert As byte
      Dim q As Byte
      Do

      Restore Adressen
      For q = 1 To 16
      Read wert
      Print q;" ";wert
      Dtmfout wert , 50
      Waitms 30

      Next
      Loop

      End

      Adressen:

      Data 1,2,3,4,5,6,7,8,9,0,10,11,12,13,14,15

      ******************************************************************************************

      Nachfolgendes Programm decodiert das Board einwandfrei:

      'DTMF out 1-9,0,10-15 auf MT8870 Decoder-Board von LC Technology
      'PORTB.1 OC1A output pin 15 ATMEGA8A for 50 mS
      'Zählabfolge bis 9 konform,ab 10 wie kommentiert proprietär
      '-----------------------------------------------------------------------------------------
      $regfile = "m8adef.dat"
      $crystal = 12000000
      $hwstack = 32
      $swstack = 40
      $framesize = 40

      Enable Interrupts

      Dim Pause as byte
      Pause=2

      do
      Dtmfout 1 , 50 ' Decoder dedected 1 0001
      Wait Pause

      Dtmfout 2 , 50 ' Decoder dedected 2 0010
      Wait Pause

      Dtmfout 3 , 50 ' Decoder dedected 3 0011
      Wait Pause

      Dtmfout 4 , 50 ' Decoder dedected 4 0100
      Wait Pause

      Dtmfout 5 , 50 ' Decoder dedected 5 0101
      Wait Pause

      Dtmfout 6 , 50 ' Decoder dedected 6 0110
      Wait Pause

      Dtmfout 7 , 50 ' Decoder dedected 7 0111
      Wait Pause

      Dtmfout 8 , 50 ' Decoder dedected 8 1000
      Wait Pause

      Dtmfout 9 , 50 ' Decoder dedected 9 1001
      Wait Pause

      Dtmfout 0 , 50 ' Decoder dedected 10 1010
      Wait Pause

      Dtmfout 10 , 50 ' Decoder dedected 11 1011
      Wait Pause

      Dtmfout 11 , 50 ' Decoder dedected 12 1100
      Wait Pause

      Dtmfout 12 , 50 ' Decoder dedected 13 1101
      Wait Pause

      Dtmfout 13 , 50 ' Decoder dedected 14 1110
      Wait Pause

      Dtmfout 14 , 50 ' Decoder dedected 15 1111
      Wait Pause

      Dtmfout 15 , 50 ' Decoder dedected 0 0000
      Wait Pause
      Loop
      end

      Hier ist die Wahrheitstabelle des DTMF Decoders, STQ ist das Bit für gültige Daten gefunden bei:

      4.bp.blogspot.com%2F-DoLiHuYfa1k%2FVcC3hZ8FXWI%2FAAAAAAAABuI%2FmjdaE5Op0eA%2Fs1600%2FDTMF%252BModule%252BOutput.jpg

      DTMF Board Wahrheitstabelle.JPG
      Vielleicht fällt mir noch etwas ein...

      The post was edited 1 time, last by Rudi Einstein ().

    • New

      Hallo Rudi, also das ist ein harter Knochen. Ich hab das mal auf einen Arduino Nano (Mega328p) aufgespielt und bekomme auch eine verrückte Print-Ausgabe. Selbst das Umkopieren der gelesenen Werte und DTMF Ausgabe über eine eigene Variable bringt nichts. Ich vermute eine Mehrfachbenutzung eines Registers, was den Read-Zeiger angeht. Vielleicht kann ein ASM-Spezialist da mal drüber schauen.
    • New

      Oder das Programm mit datas, aber
      ....
      pushall
      Dtmfout wert , 50
      popall
      ...

      dann sollte es auch gehen, wenn's an einer Doppelbelegung liegt.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • New

      Das geht, zumindest im Simulator

      BASCOM Source Code

      1. 'DTMF out 1-15 auf MT8870 Decoder-Board von LC Technology
      2. 'PORTB.1 OC1A output pin 15 ATMEGA8A
      3. '-----------------------------------------------------------------------------------------
      4. $regfile = "m8adef.dat"
      5. $crystal = 12000000
      6. $hwstack = 32
      7. $swstack = 40
      8. $framesize = 40
      9. '$sim
      10. Enable Interrupts
      11. Dim wert As byte
      12. Dim q As Byte
      13. Do
      14. Restore Adressen
      15. For Q = 0 To 15
      16. Wert = Lookup(q , Adressen)
      17. Print q;" ";wert
      18. Dtmfout wert , 50
      19. Waitms 30
      20. Next
      21. Loop
      22. End
      23. Adressen:
      24. Data 1,2,3,4,5,6,7,8,9,0,10,11,12,13,14,15
      Display All
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------