PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bascom, Timer-Problem



Thomas U.
17.05.2004, 12:14
Ich hab mir vor ein paar Wochen das AVR- Buch und Experimentierboard von R. W. zugelegt, und will mir nun den Umgang mit dem Mega8 damit beibringen. Leider hatte ich vorher nicht wirklich Programmierkenntnisse (lediglich eine Ausbildung zum Energieelektroniker vor ca. 10 Jahren.). Obwohl ich Mittlerweile nun aber doch schon mit Interrupt und Timer ein bisschen was anfangen, hab ich nun ein Problem, wo ich selbst nicht mehr weiter komme.
Ich denke aber, dass mir da bestimmt von euch jemand weiterhelfen kann.


Also,

es sollen 2 LED`s abwechselnd blinken, und zwar 10 mal. Danach soll sich`s mit der Blinkerei aufhören, und erst nach Tastendruck soll das Ganze wieder von vorne beginnen.

Über Timer2 gebe ich den Blinktakt vor, und Timer0 arbeitet als Zähler. Das funktioniert auch alles sehr gut. Auch habe ich es noch geschafft, daß beide LED`s nach 10-maligem Blinken dauerhaft aus sind. Dies machte ich entweder über „Disable Timer“ bzw. „Stop Timer“. Allerdings schaffe ich es nicht, daß das Programm nach einem Tastendruck wieder zu laufen beginnt.

Im angehängeten Listing ist mein letzter Versuch zu sehen: in der Hauptschleife sollten die beiden Timer mit ‚Stop Timer’ angehalten werden, und in der Sub Neustart, welche über PD2
aktiviert wird, soll mit ‚Start Timer’ die Timer wieder zu laufen beginnen. Funktioniert so aber nicht.

Vielleicht kann sich ja von euch jemand kurz die Zeit nehmen, und mir dabei weiterhelfen.

Gruss, Thomas

Und hier ist noch das Bascom-Listing dazu:


'Einfache Anwendung mit Timer0 als Zähler und Timer2 als Taktgeber
'Timer2 gibt Zähltakt vor
'Timer0 zählt bis 10, und lässt LED`s an PD5 und 6 (invertiert zu 5) den Status wechseln
'----------------------------------------------------------
'
$regfile = "m8def.dat" 'ATmega8-Deklarationen
$crystal = 3686400 'Quarz: 3,6864 MHz
Declare Sub Neustart

On Timer0 Timer0ein 'Interruptroutine für Timer0-Overflow
On Timer2 Timer2ein 'Interruptroutine für Timer2-Overflow

Dim Y As Integer 'Variable Y definieren
Y = 0 'Startwert von Y definieren

Ddrd = &B11101000 'Pin PD3, 5, 6, 7 sind Ausgänge
Portd.4 = 1 'Pull up von PD4/T0 aktivieren(externer Takt)
Portd.2 = 1 'Pull up von PD2 aktivieren


Config Timer2 = Timer , Prescale = 256 'Timertakt Timer2 = Quarz/256

Tccr0 = &B00000110 'Timer0 extern, fallende Flanke

Enable Timer0 'Timer0-Overflow-Interrupt ein
Enable Timer2 'Timer2-Overflow-Interrupt ein

Enable Interrupts 'Interrupts global einschalten

'Hauptschleife--------------------------------------------

Tcnt0 = 245 'Timer0 voreinstellen

Do

Debounce Pind.2 , 0 , Neustart , Sub 'Taster an PD2 entprellen, und die Sub Neustart definieren

If Tcnt0 = 255 Then
Stop Timer0 'Wenn der Zähler voll ist (bis 10), sollen die Timer inaktiv werden
Stop Timer2 'und PD5 und 6 (LED`s) Low werden.
Portd.5 = 0
Portd.6 = 0
End If

Loop


'Sub------------------------------------------ 'Sollte die Timer wieder aktivieren, und die Led`s wieder von vorne 10 mal blinken lassen.
Sub Neustart

Start Timer0
Start Timer2

Toggle Portd.7 'Dient nur zum anzeigen, ob überhaupt die Sub funktioniert

End Sub





'Timer0(Zähler)-Interrupt-Routine----------------------------------

Timer0ein:

Tcnt0 = 246 'Timer0 erneut voreinstellen

Return


'Timer2-Interrupt-Routine----------------------------------

Timer2ein:

If Y = 50 Then
Toggle Portd.3
Toggle Portd.5
'Toggle Portd.6
Y = 0
Else
Y = Y + 1
End If



If Portd.5 = 1 Then 'If-Anseisung, um PD6 gegenüber PD5 zu invertieren
Portd.6 = 0
Else
Portd.6 = 1
End If

Return

End

Dino Dieter
17.05.2004, 13:28
Hallo

Ändere mal dein

Tccr0 = &B00000110 'Timer0 extern, fallende Flanke

in

Config Timer0 = Counter , Edge = Falling

Beim Neustart des Timers kann Bascom ansonsten die Einstellungen des Timers anscheinend nicht speichern.

MFG
Dieter

18.05.2004, 12:06
Hallo

Ändere mal dein

Tccr0 = &B00000110 'Timer0 extern, fallende Flanke

in

Config Timer0 = Counter , Edge = Falling

Beim Neustart des Timers kann Bascom ansonsten die Einstellungen des Timers anscheinend nicht speichern.

MFG
Dieter
Hallo

Ändere mal dein

Tccr0 = &B00000110 'Timer0 extern, fallende Flanke

in

Config Timer0 = Counter , Edge = Falling

Beim Neustart des Timers kann Bascom ansonsten die Einstellungen des Timers anscheinend nicht speichern.

MFG
DieterHallo,

hab den Vorschlag von Dieter ausprobiert.
Funktioniert aber auch nicht.

Dino Dieter
18.05.2004, 12:27
Hallo

Dann schauen wir mal.

TCNT0 = 255 also Ende der Blinkerei
Damit wird Timer0 gestoppt.

Wenn du jetzt die Timer neu startest, steht in TCNT0 immer noch 255 drin.
Damit wird der Timer0 aber ein paar Schritte weiter wieder gestoppt.

Timer0 Overflow dürfte normalweiser nur mal zufäälig aufgerufen werden.

Probier mal so

Sub Neustart
TCNT0 = 246
Start Timer0
Start Timer2

Toggle Portd.7 'Dient nur zum anzeigen, ob überhaupt die Sub funktioniert

End Sub

MFG
Dieter

19.05.2004, 12:05
@ Dieter

Jetzt haut`s hin!

Vielen Dank für die schnelle Hilfe.


Gruss, Thomas