PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Tonerzeugung



mikron
31.07.2011, 12:37
Hallo!

Ich bin AVR-Einsteiger und habe folgendes Problem:

Mit dem unten aufgeführten Programm erzeuge ich einen Dauerton.
Durch die Verwendung von Timer1 wird dazu kein weiterer Programmschritt
benötigt, der AVR ist arbeitslos (siehe Roland Walters Lehrbuch S.114).

Nun möchte ich aber den Ton im weiteren Programm ein- und ausschalten
können, z.B. im Takte von Morsezeichen. Bis jetzt habe ich noch keine
saubere Lösung gefunden, wie ich dies realisieren kann.

Habe bisher versucht, zum ausschalten den PIN PB1 zum ausschalten als
Eingang zu definieren, aber das funktioniert leider nicht so wie
gewünscht.

Frage an die Freaks: Wie kann ich das lösen?

Danke im voraus,
Bernd


'================================================= ===================
' BASCOM - ATMega 8-16 - Tonausgabe mit Timer 1 (1,0017391 ... kHz)
' Speaker an Pin PB1
'================================================= ===================

$Refile = "m8def.dat"
$Crystal = 3686400

DDRB.1 = 1 ' Pin PB1 auf Ausgang

TCCR1A = &B01000000 ' Pin PB1 togglen, Kein PWM
TCCR1B = &B00001010 ' Timer-Reset bei Compare, Clock/8

Compare 1A = 230 ´ Vergleichswert setzen

Do 'Der AVR ist vorerst arbeitslos
nop 'hier soll später der Ton
Loop 'ein-aus getastet werden

End

Besserwessi
31.07.2011, 13:41
Wenn man den PIN als Eingang definiert, bleibt der Pullup-Widerstand um eine schwaches Signal zu erzeugen. Um den Ton abzuschalten könnte man z.B. das Tooglen in PCCR1A abstellen.

mikron
31.07.2011, 13:46
Hallo Besserwessi,

danke für den Tip. Habe inzwischen eine Lösung:
Löschen desganzen TCCR1A-Registers schaltet den Ton ab.
Neues Setzen des 6.Bits des Registers schaltet den Ton
wie gewüsncht wieder ein.

Gruss,
Bernd

radbruch
31.07.2011, 14:09
Hallo

Grundsätzlich gibt es wohl zwei Möglichkeiten:

1.: Der Timer darf den Ausgang nicht ansteuern. Um das Einzustellen muss man im TCCRA1A die Bits 7 und 6 (Zählung beginnt rechts mit 0!) richtig setzen. Deine Einstellung ist 01 und bedeutet, Ausgang umschalten (toggeln) beim Compare-Match. Mit 00 wird der Ausgang entkoppelt und nicht mehr vom Timer angesteuert. Deshalb funktioniert deine Lösung mit TCCR1A=0.

2.: Den Timer anhalten. Bit 0 bis 2 im TCCR1B-Register ist die Auswahl des Vorteilers (Perscaler), in deinem Fall 010, also Kontrollertakt/8. Wenn mit 000 kein Prescaller gewählt wird, bleibt der Timer stehen. Ein TCCR1B=&B00001000 sollte deshalb den Ton auch stoppen (die verbliebene 1 bedeutet CTC-Mode)

Gruß

mic

mikron
31.07.2011, 14:40
Hallo Mic,

herzlichen Dank für die Super-Erläuterung. So nach und nach fange ich an, die Details zu verstehen. Habe erst vor Kurzem begonnen, mit einem Experimentierboard auf Lötpunkt-Raster-Platine, Roland Walters Lehrbuch durchzuarbeiten, um in die AVR-Technik "hineinzuschüffeln" Wollte damit feststellen, ob mir das Ganze Spass machen würde. Bis jetzt bin ich hoch begeistert, das Thema gefällt mir ausgesprochen gut, und ich habe wohl ein neues Hobby-Kapitel aufgeschlagen. Mittlerweile wage ich mich auch schon an eigene kleine Aufgaben oder Änderungen an den Übungen im Lehrbuch.
Und im Internet finde ich immer wieder neue Anregungen und zahllose interessante Beiträge.

Grüsse,
Bernd