DTMF-Ausgabe mit undefinierten Pausepegeln

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

    • 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
      Files
      Vielleicht fällt mir noch etwas ein...
    • 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

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

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

      The post was edited 1 time, last by 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:

      Source Code

      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.
      Kaum macht man es richtig - und schon geht's!
    • 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 Source Code

      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
      Display All
      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?
      Files
      • Terminal.png

        (15.38 kB, downloaded 4 times, last: )
      Kaum macht man es richtig - und schon geht's!
    • 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.
      Files
      Kaum macht man es richtig - und schon geht's!

      The post was edited 1 time, last by 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?
      Files
      Kaum macht man es richtig - und schon geht's!

      Post by Pluto25 ().

      This post was deleted by the author themselves: unnötig ().
    • Pluto25 wrote:

      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 Source Code

      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.
      Kaum macht man es richtig - und schon geht's!
    • 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 Source Code

      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
      Display All
      Files
      Kaum macht man es richtig - und schon geht's!
    • Michael wrote:

      Mitch64 wrote:

      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.
      Kaum macht man es richtig - und schon geht's!

      The post was edited 2 times, last by Mitch64 ().