PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timer 1 stoppen...?



BASTIUniversal
03.01.2006, 20:11
Hallo!
Ich möchte für einen US-Sender 16 Impulse bei 40kHz Ausgeben. Die 40kHz ausgeben ist kein Problem, aber die 16 Impulse nach einen Tastendruck zu beginnen und dann nach den 16 Impulsen Automatisch abschalten...das bereitet mir Sorgen!

Hier mal das Programm:

$regfile = "m8def.dat"
$crystal = 3686400

Dim A As Integer

Tccr1a = &B01000000
Tccr1b = &B00001001
Compare1a = 45

Stop Timer1

Config Int0 = Low Level

Ddrb.1 = 1

Ddrd.2 = 0
Portd.2 = 1

Ddrb.0 = 0
Portb.1 = 1

On Compare1a X1
On Int0 X2

Enable Interrupts

Do

If A = 16 Then
Stop Timer1
End If

Loop

X2:

Start Timer1

Return


X1:

Incr A

Return

Kann mir vllt. jemand sagen wo da der Fehler liegt? Ich hab schon einiges probiert (Clock abgeschaltet, Timer in Normal-Modus versetzt, etc...)

Wäre nett wenn ihr mir helfen könntet!

MfG
Basti

codejoker
04.01.2006, 01:12
Mal eine Frage (kenne mich da auch noch nicht so aus mit Bascom):


„A“ hat keinen Anfangswert, also keinen definierten Zustand
(hab aber keine Ahnung ob man das in Bascom überhaupt voraussetzt)

Und dann:
Wer/Wann/Wo inkrementiert „A“?

Demnach kommst Du in die Schleife und wirst dort versauern, denn die
Bedingung zum verlassen wird nie eintreffen.

Aussagen ohne Gewähr – ich habe keine Ahnung von Bascom ;-)

Gruß
Codejoker

BlueNature
04.01.2006, 01:13
Servus Basti!

Versuchs doch einfach anders zu lösen. Ich würde den Int0 beibehalten wenn du den so willst und das Ganze einfach als Pattern machen ohne Compare. So in etwa:



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

Dim AnzBursts As Byte

PinB.1 = 1 ' Burst-Ausgang

DdrD.2 = 0 ' Start-Taste mit internem Pull-Up
PortD.2 = 1 ' INT0

DdrB.0 = 0 ' Echo-Eingang mit internem Pull-Up
PortB.1 = 1

Config Int0 = Low Level
On Int0 Int_StartTaste

Enable Interrupts
Do
' Dein Programm oder sonst noch was....
If PinB.1 = 0 Then
' Das was bei Echo passieren soll...
End If
Loop
End

' Interrupt-Laufzeit ca. 400µs (1 Burst)
Int_StartTaste:
For AnzBursts = 1 To 32 ' 16xHigh + 16xLow
Toggle PortB.1
WaitUs 12
Next AnzBursts
Return


Have much fun!

Grüße Wolfgang

H.A.R.R.Y.
04.01.2006, 11:29
Um dem Ausgang das Toggeln abzugewöhnen kannst Du nach den erforderlichen Burst-Impulsen das TCCR1A auf 0b10000000 umstellen. Beim nächsten Timeout wird dann OC1A auf '0' gehalten bis wieder der Toggle-Modus aktiviert wird. An OC1A erscheint dann der Burst. Geht natürlich auch mit '1' an OC1A. Und im Gegensatz zum Anhalten des Timers läuft das alles schön synchron mit 40kHz, so das auf dem Burst auch keine Störungen auftauchen.

BASTIUniversal
04.01.2006, 17:45
Hallo!
Danke für eure Tips, es lag am "Enable"...wer weiß denn schon das man den "Compare"-Interrupt extra dazuschalten muss *grrr*. Jetzt tut's auch mit Start/Stop Timer1!
Jetzt muss ich es nurnoch schaffen den Port B1 vor und nach dem Burst auf High zu legen.

H.A.R.R.Y.
05.01.2006, 12:29
wer weiß denn schon das man den "Compare"-Interrupt extra dazuschalten muss

Jeder der im Datenblatt nachgesehen hat. Die Register sind wirklich alle deutlich beschrieben - halt in Englisch, aber was soll's.