DTMF-Ausgabe mit undefinierten Pausepegeln

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • DTMF-Ausgabe mit undefinierten Pausepegeln

      Hallo Community,
      ein verwertbares DTMF ist nach der Änderung der mcs.lib nur insoweit möglich, daß innerhalb einer Schleife DTMF-Burst's am OCA1-Port meines MEGA8 generiert werden.
      Im kleinen Testprogramm (siehe Anhang) sieht man, daß innerhalb der Schleife 16 Burst's erzeugt werden.
      Schade nur, daß die Pegel zwischen denen nicht reproduzierbar, also rein zufällig sind. (siehe Anhang)
      Zwischen den Burst's möchte ich gerne noch reichlich Programmcode einfügen. Dazu ist es zwingend notwendig, daß die Pausen einen definierten Pegel haben, GND oder Vcc wäre erstmal unwichtig. Ich habe das mcs support vorgetragen und erfahren, dass die Timersteuerung das nicht zuläßt, doch mit einem Mega8A möglich wäre.
      Ich habe das mal ausprobiert und versucht, den OCA1-Port (B.1) des Mega 8A nach einem Burst auf low zu zwingen, doch ohne Erfolg.
      Die .DAT -Dateien der beiden Versionen habe ich mal verglichen und das Ergebnis ist im Anhang zu sehen.
      Kann damit von euch jemand vielleicht etwas verwertbares herausfinden?
      Gruß Rudi
      ------------------------------------------------------------------------------
      'Programmname: DTMF out 1-15 aus DATA lesen auf MT8870.bas
      '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
      Dtmfout wert , 50
      Waitms 400
      Next
      waitms 500
      Loop

      End

      Adressen:

      Data 1,2,3,4,5,6,7,8,9,0,10,11,12,13,14,15
      Dateien
      Immer Glück haben ist fast wie können..
    • ich weiß jetzt nicht, ob das wichtig ist, in der Hilfe zu dtmfout steht: The working range is from 4 MHz to 10 MHz system clock(xtal).

      Um da einen definierten Pegel hin zu kriegen, musst du den portpin von der OCA1-Funktionalität abtrennen und dann ist er wie ein port verwendbar. Steht im Datenblatt bei den verschiedenen PWM-Möglichkeiten. Ich such mal...

      OC1A-pin freigeben.PNG
      Raum für Notizen

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

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

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von tschoeatsch ()

    • Ich denke mal, die Töne werden mit PWM gemacht und nach der gewünschten Zeit wird der timer einfach gestoppt. Dabei bleiben die pins natürlich auf dem letzten Stand. Du kannst ja mal probieren, den timer nach dem dtmfout auf =0 oder auf =2^16 zu setzen. Ich habe aber die leise Befürchtung, dass das nicht den OC1A-pin beeinflusst. Wäre aber mal eine einfache Aktion
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Hallo Rudi

      Ich habe mal die Routine in der mcs.lib gesucht.
      Hier ein kleiner Ausschnitt der Routine:

      Quellcode

      1. *BASIC: enable timer1
      2. pop r25
      3. pop r24
      4. call _waitms ; call external routine
      5. *BASIC: disable timer1
      6. Clr r24
      7. * Out Tccr1b,R24 ; make it 0 to stop noise
      8. Pop R9 ; restore pointer register
      9. Ret
      Man sieht in Zeile 1, dass der Timer1-Interrupt zur Ausgabe des Burst zugelassen wird.
      Und in Zeile 5 wird der Interrupt wieder gesperrt.

      In Zeile 5 und 6 wird das Register TCCR1B mit 0 beschrieben.

      Vor dem Einsprung in die Routine DTMFOut wirden die Register TCCR1A und TCCR1B auf 0 gestanden.
      Ich vermute mal, dass man also das 2. Register auch auf 0 setzen kann.

      Versuch doch mal in deinem Basic-Programm nach "DTMFOut wert,50"
      eine Zeile mit "TCCR0A=0" einzufügen, ob das geht.

      Oder alternativ an gleicher Stelle das was @Pluto25 vorgeschlagen hat. Sollte eigentlich beides aufs gleiche Ergebnis kommen.

      Evtl den Ausgabe-Pin am Anfang in deinem Programm als Ausgang konfigurieren. Denn nach dem Löschen des Registers ist der Pin Tristate. Als Ausgang auf Low.
    • Ob der jetzt von DTFMOut auf Ausgang geschaltet wird habe ich nicht geschaut.
      Da hast du vielleicht recht.

      Ich war jetzt mal so frei und habe das Programm von Rudi mal auf einen Mega8 (ohne a) mit 8MHZ Quarz geändert.

      Ausgegeben wird in der Hauptschleife jetzt nur 1x ein Ton. Danach 1500ms Pause.
      Sonst passiert da nix.

      Mir fällt auf, dass da keine Pausen sind zwischen den Tönen ist. Habe also Dauerton mit ca. 15kHz.

      Damit ich merke ob das Programm abstürzt, habe ich am Anfang mal ein Wait 1 drin und gebe mir dann noch einen Text auf dem Terminal aus, um zu sehen, ob neu gestartet wird.

      Und siehe da, das Programm stürtzt ab.

      Hier noch das geänderte Programm:

      BASCOM-Quellcode

      1. '-------------------------------------------------------
      2. 'Programmname: DTMF out 1-15 aus DATA lesen auf MT8870.bas
      3. 'DTMF out 1-15 auf MT8870 Decoder-Board von LC Technology
      4. 'PORTB.1 OC1A output pin 15 ATMEGA8A
      5. '-------------------------------------------------------
      6. $regfile = "m8def.dat"
      7. $crystal = 8000000
      8. $hwstack = 40
      9. $swstack = 40
      10. $framesize = 40
      11. $Baud = 9600
      12. '$SIM
      13. Wait 1
      14. Print "Los geht's!"
      15. 'Config PortB.1 = Output
      16. Enable Interrupts
      17. 'Dim wert As byte
      18. 'Dim q As Byte
      19. Do
      20. Dtmfout 5 , 50
      21. waitms 1500
      22. Loop
      23. End
      Alles anzeigen
      Also Wait in Zeile 15 wird ausgeführt, waitms in Zeile 26 offensichtlich nicht.
      Zuden stürzt das Programm ca. alle 10s mal ab.

      Ich habe übrigens Version 2.0.8.2 und das in ein neues Verzeichnis installiert.

      Wo liegt jetzt das Problem?
      Dateien
      • Terminal.png

        (15,38 kB, 9 mal heruntergeladen, zuletzt: )
    • Kann ich mir nicht vorstellen.
      PWM Ausgang geht ja.
      Sobald der DTMFOut drin ist, wird der Waitms 1500 nicht gemacht.

      Lasse ich den Pin Toggeln ohne DTMFOut, geht 1500ms wieder anstandslos.

      Aber ich probiers aus. Von den Mega 8 habe ich mehrere da.

      So das Ergebnis:
      Mit fabrikneuem Mega8 - 16PU (gleicher Typ wie zuvor) habe ich exakt das gleiche Ergebnis.
      Anbei 2 Oszillogramme.
      Dateien

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Mitch64 ()

    • Ich habe mal Spaßeshalber die alte mcs.lib von 2.0.8.1 (aber IDE 2.0.8.2) verwendet.
      Und dann sieht das Signal so aus wie angehängt. Der Burst ist immer an den Flanken.

      Jetzt geht auch die Lause zwischen den Burst's wieder.

      Bist du sicher, dass du die MCS.lib 2.0.8.2 verwendest?
      Dateien
    • Pluto25 schrieb:

      Aus dem Waitms 1500 wurde 150?
      Es sind 500ms, hab das im Programm etwas beschleunigt.

      Das zufällige Verhalten ist geblieben.
      Mit der neuen mcs.lib gehts definitiv nicht.
      Alte lib geht, neue nicht, alles abdere 1:1 das gleiche.

      Das Problem in der mcs.lib habe ich nicht gefunden beim überfliegen. Es sind aber definitiv änderungen drin, wenn man die mit der alten vergleicht.

      Aber das Problem von Rudi ist gelöst.
      So wird nach der Burstausgabe das Signal immer 0:

      BASCOM-Quellcode

      1. ' Hauptschleife
      2. Do
      3. Dtmfout 5 , 50
      4. TCCR1A = 0
      5. waitms 500
      6. Loop
      Bleibt noch das Problem mit der neuen mcs.lib.
    • So, das Problem mit der neuen mcs.lib ist auch gelöst.

      Wenn ich die neue lib (nicht lbx) einbinde gehts.
      Mit neuer mcs.lbx nicht. Also liegt der Fehler in der LBX.

      Nachdem ich die mcs.lib neu compiliert habe, geht jetzt auch die neue mcs.lbx auch.

      Hier das finale Testprogramm mit Low-Pegel zwischen den Bursts.

      BASCOM-Quellcode

      1. '-------------------------------------------------------
      2. 'Programmname: DTMF out 1-15 aus DATA lesen auf MT8870.bas
      3. 'DTMF out 1-15 auf MT8870 Decoder-Board von LC Technology
      4. 'PORTB.1 OC1A output pin 15 ATMEGA8A
      5. '-------------------------------------------------------
      6. $regfile = "m8def.dat"
      7. $crystal = 8000000
      8. $hwstack = 40
      9. $swstack = 40
      10. $framesize = 40
      11. $Baud = 9600
      12. Wait 1
      13. Print "Los geht's!"
      14. Enable Interrupts
      15. 'Dim wert As byte
      16. 'Dim q As Byte
      17. Do
      18. Dtmfout 5 , 50
      19. TCCR1A = 0
      20. waitms 500
      21. Loop
      22. End
      23. Adressen:
      24. Data 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 , 10 , 11 , 12 , 13 , 14 , 15
      Alles anzeigen
      Dateien
    • Michael schrieb:

      Mitch64 schrieb:

      Der Burst ist immer an den Flanken.
      Bei einem 5V Digital-Signal?Hast du deinen Tastkopf abgeglichen?
      oszilloskope.net/tastkopf-abgleichen/
      Falsch Masse geholt?
      Ja, Tastkopf ist abgeglichen.
      Hängt wohl mit der Masse zusammen. (Steckbrett)

      Nachtrag:
      Lag an der 10:1 Tastkopf-Einstellung. Mit 1:1 ist alles perfekt.

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Mitch64 ()

    • Hallo Mitch64,
      ich denke, mit dem Einfügen von TCCR1A=0 nach Ausgabe des Burst ist das Problem gelöst. Da ich afk bin, werde ich das gleich morgen früh testen. Ich verwende noch 2.0.8.1 mit einer von mcs. support modifizierten mcs. lib, zu finden in einem vorigen DTMF.... Beitrag von mir.
      Allen Beteiligten erstmal Dank für die Lösungsansätze.
      Ich werde dann berichten.
      Gruß Rudi
      Immer Glück haben ist fast wie können..