PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timer0 stoppen und weiterlaufen lassen?



TobiasBlome
24.10.2006, 18:05
Hallo,
ich gebe über den Timer0 einen Wert für die PWM vor.
Nun möchte ich, wenn der Zähler den Wert 255 erreicht hat, das der Wert für 1 Sekunde auf 255 bleibt und dann normal wieder runter zählt. Wenn der Zähler den Wert 0 hat, soll auch eine Sekunde gewartet werden:

Es wird damit eine LED angesteuert: dunkel - 1 sekunde warten - langsam hoch dimmen - 1 sekunde warten - und wieder runter dimmen.

Wer kann mir sagen wie ich diese sekunde wartezeit hinbekomme?

vielen Dank, Tobias

Der Timer0 wird im Unterprogramm Ledcount aufgerufen:
Config Timer0 = Timer , Prescale = 256 'Teiler
Enable Timer0 'timer einschalten
On Timer0 Ledcount 'Unteprogramm aufrufen
Enable Interrupts 'interrupts einschalten


Unterprogramme:
'_______________

Ledcount: 'Farbwechsel über Timer1

Timer0 = 150 'LED´s wechseln die Farbe mit ca 2 Hz



If Led1 = 255 Then 'Wenn Led1 100% dann Merker zum hochzählen setzen
Led1m = 0
End If

If Led1 = 0 Then 'Wenn Led1 0% dann Merker zum runterzählen setzen
Led1m = 1
End If

'Zähler1 hoch/runter
If Led1m = 1 Then
Incr Led1 'Wenn Merker Led1m = 1 -> um 1 hochzählen
End If

If Led1m = 0 Then
Decr Led1 'um 1 runterzählen
End If


'-------
If Led2 = 255 Then
Led2m = 0
End If

If Led2 = 0 Then
Led2m = 1
End If

'Zähler1 hoch/runter
If Led2m = 1 Then
Incr Led2 'um 1 hochzählen
End If

If Led2m = 0 Then
Decr Led2 'um 1 runterzählen
End If


Return

TobiasBlome
24.10.2006, 18:28
Hab noch etwas vergessen:
Den Timer1 kann ich nicht mehr benutzen, da er schon für PWM genutzt wird

Vitis
24.10.2006, 22:19
wait 1 ;)
oder halt mit Timer2

TobiasBlome
26.10.2006, 16:26
wenn ich den wait befehl nehme stoppt doch der ganze µC oder? Und der µC kann keine anderen Dinge mehr erledigen oder?

Wie würde es denn mit dem Timer2 gehen?

Vitis
27.10.2006, 13:11
richtig, beim wait steht das Programm an dem Punkt,
bis eben die Zeitspanne durch ist.
Interrupts wie Timer Uart oder Int0 Int1 sind davon allerdings nicht betroffen,
es seidenn der Wait ist in der Interruptroutine selbst drinne.
Bei Verwendung von 8-Bit-Timern kannste ja in der Interruptroutine
selbst ne Variable hochzählen lassen und die somit einen 16 oder 24-Bit Timer selbst softwaremäßig erzeugen. Das Hochzählen selbst ist keine
groß zeitkritische Geschichte.

TobiasBlome
30.10.2006, 16:27
Hallo Vitis,
ich war über Wochenende nicht da, aber nun:

Also: Für die PWM bunutze ich 2 Variablen die immmer gleichzeitig hoch- und runtergezählt werden: Led1 und Led2. Ich denke es würde ausreichen, wenn Led1 = 255, dann soll ein Merker z.B. Led1merker auf 1 gesetzt werden. Und solange der auf 1 ist, soll der restliche Teil vom Unterprogramm Ledcout übersprungen werden (mit goto?) und natürlich muss eine weitere Variable hochgezählt werden(Led2merker?). Wenn diese einen bestimmten Wert erreicht hat, muss Led1merker wieder auf 0 gesetzt werden. Habe ich das richtig verstanden?

Hier noch das "alte" Unterprogramm:



'Unterprogramm
Ledcount: 'Farbwechsel über Timer1

Timer0 = 150 'LED´s wechseln die Farbe mit ca 2 Hz



If Led1 = 255 Then 'Wenn Led1 100% dann Merker zum hochzählen setzen
Led1m = 0
End If

If Led1 = 0 Then 'Wenn Led1 0% dann Merker zum runterzählen setzen
Led1m = 1
End If

'Zähler1 hoch/runter
If Led1m = 1 Then
Incr Led1 'Wenn Merker Led1m = 1 -> um 1 hochzählen
End If

If Led1m = 0 Then
Decr Led1 'um 1 runterzählen
End If


'-------
If Led2 = 255 Then
Led2m = 0
End If

If Led2 = 0 Then
Led2m = 1
End If

'Zähler1 hoch/runter
If Led2m = 1 Then
Incr Led2 'um 1 hochzählen
End If

If Led2m = 0 Then
Decr Led2 'um 1 runterzählen
End If


Return

TobiasBlome
31.10.2006, 16:57
Also ich habe mal das unterprogramm "umgebaut" aber nun leuchtet nur noch eine Farbe. Kann sein das ich die wartezeit zu hoch gesetzt habe.
Wer kann mir sagen, warum ich über UART keine Informationen bekomme? Mit anderen Programen geht es! Wo ist der Fehler in meinem Programm?

Tobias



'-------------------------------------------------------------------------------
'Konfiguration µC:
$regfile = "ATtiny2313.dat" 'ATtiny2313-Deklarationen
$crystal = 20000000 'Quarz: 20.0 MHz
$baud = 9600 'Baudrate der UART: 9600 Baud

'-------------------------------------------------------------------------------
'Ein- Ausgänge:
Ddrd = &B1000011 '1 Ausgang, 0 Eingang = Pin PD6,1+0 als Ausgang / PD5-2 als Eingang
Ddrb = &B11111111 '1 Ausgang, 0 Eingang = Pin PB7-0 als Ausgang
Portb = &B11111111 'PB0...PB7 auf High setzen

'-------------------------------------------------------------------------------
'Variablen auswertung FB
Dim Pulsbreite1 As Word 'Knüppelstellung Knüppel 1 '
Dim Pulsbreite2 As Word
Dim Pulsbreite3 As Word
Dim Pulsbreite4 As Word

Dim Kanal1o As Bit 'Speicher von Knüppel 1 OBEN
Dim Kanal1u As Bit 'Speicher von Knüppel 1 UNTEN
Dim Kanal2o As Bit
Dim Kanal2u As Bit
Dim Kanal3o As Bit
Dim Kanal3u As Bit

Dim Led1 As Byte
Dim Led1m As Byte 'LED1 Merker
Dim Led2 As Byte
Dim Led2m As Byte
Dim Led1pause As Word 'Als Pause zwischen den Lichteffekten für die UnterBodenbel.

Dim Portb3 As Byte 'PWM
Dim Portb4 As Byte 'PWM


'-------------------------------------------------------------------------------
'Konfiguration Timer:
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
Config Timer0 = Timer , Prescale = 256 'Teiler
Enable Timer0 'timer einschalten
On Timer0 Ledcount 'Unteprogramm aufrufen
Enable Interrupts 'interrupts einschalten


'-------------------------------------------------------------------------------
' HAUPTPROGRAMM
'-------------------------------------------------------------------------------
Led1 = 255 'PWM Startwert vorgeben
Led2 = 1 'PWM Startwert vorgeben



Do 'Do Loop Schleife

Print "Led1: " ; Led1
Print "Led2: " ; Led2
Print "Led1Pause: " ; Led1pause

'Hardware PWM mit Timer1 U N D
'FB auswerten: Umschaltung von normal auf PWM

If Portb3 = 0 And Portb4 = 0 Then

Compare1a = Led1 '=PB3 / max 255
Compare1b = Led2 '=PB4 / max 255

Else
If Portb3 = 0 Then
Compare1a = 255
Else
Compare1a = 0
End If

If Portb4 = 0 Then
Compare1b = 255
Else
Compare1b = 0
End If

End If




'FB auswerten:
'Umschaltung von normal auf PWM


'Kanal 1 LICHT HINTEN:
'____________________

Pulsein Pulsbreite1 , Pind , 5 , 1 'Pulsbreite auslesen (1=High Impuls)
'Knüppel rastend OBEN
If Pulsbreite1 > 9 And Kanal1o = 0 Then 'wenn Knüppel oben und Kanal1oben=0 dann
Toggle Portb.1 'Pin 1 mal schalten (entweder auf Hi oder Low je nach vorherigem zustand)
Kanal1o = 1 'Variable Kanal1o setzen damit nicht neu getoggled werden kann
End If
If Pulsbreite1 < 9 Then 'Wenn Knüppel nicht oben dann
Kanal1o = 0 'Variable Kanal1o RÜCKsetzen damit neu getoggled werden kann
End If
'Knüppel rastend UNTEN
If Pulsbreite1 < 6 And Kanal1u = 0 Then
Toggle Portb.0
Kanal1u = 1
End If
If Pulsbreite1 > 6 Then
Kanal1u = 0
End If



'Kanal 2 UNTERBODEN:
'___________________

Pulsein Pulsbreite2 , Pind , 4 , 1 'Pulsbreite auslesen (1=High Impuls)
'Knüppel rastend OBEN
If Pulsbreite2 > 9 And Kanal2o = 0 Then
Toggle Portb3
Kanal2o = 1
End If
If Pulsbreite2 < 9 Then
Kanal2o = 0
End If
'Knüppel rastend UNTEN
If Pulsbreite2 < 6 And Kanal2u = 0 Then
Toggle Portb4 'ACHTUNG PB4!!! nicht PB2!!!
Kanal2u = 1
End If
If Pulsbreite2 > 6 Then
Kanal2u = 0
End If



'Kanal 3:
'________

Pulsein Pulsbreite3 , Pind , 3 , 1 'Pulsbreite auslesen (1=High Impuls)
'Knüppel rastend OBEN
If Pulsbreite3 > 9 And Kanal3o = 0 Then
Toggle Portb.5
Kanal3o = 1
End If
If Pulsbreite3 < 9 Then
Kanal3o = 0
End If
'Knüppel rastend UNTEN
If Pulsbreite3 < 6 And Kanal3u = 0 Then
Toggle Portb.2 'ACHTUNG PB2!!! nicht PB4!!!
Kanal3u = 1
End If
If Pulsbreite3 > 6 Then
Kanal3u = 0
End If



'Kanal 4 (Taster / Taster):
'________

Pulsein Pulsbreite4 , Pind , 2 , 1 'Pulsbreite auslesen (1=High Impuls)
'Knüppel tastend OBEN
If Pulsbreite4 > 9 Then 'Knüppel oben
Portb. 7 = 0 'Port PB 7 setzen
Else 'sonst
Portb. 7 = 1 'Port PB 7 zurücksetzen
End If
'Knüppel tastend UNTEN
If Pulsbreite4 < 6 Then 'Knüppel unten
Portb. 6 = 0 'Port PB 6 setzen
Else 'sonst
Portb. 6 = 1 'Port PB 6 zurücksetzen
End If



'Automatikfunktion für Scheinwerfer: GEPRÜFT MIT HARDWARE OK
'___________________________________

If Portb.0 = 0 Or Portb.1 = 0 Then 'Wenn PB0 oder PB1 Hi sind dann
Portd.6 = 0 ' PD6 setzen
Else 'sonst
Portd.6 = 1 'PD6 RÜCKsetzen
End If

Loop



'Unterprogramme:
'_______________

Ledcount: 'Farbwechsel über Timer1

Timer0 = 150 'LED´s wechseln die Farbe mit ca 2 Hz


While Led1pause > 1000 'wenn Led1Pause > 1000 dann Schleife bearbeiten
Incr Led1pause



If Led1 = 255 Then 'Wenn Led1 100% dann Merker zum hochzählen setzen
Led1m = 0
End If

If Led1 = 0 Then 'Wenn Led1 0% dann Merker zum runterzählen setzen
Led1m = 1
End If

'Zähler1 hoch/runter
If Led1m = 1 Then
Incr Led1 'Wenn Merker Led1m = 1 -> um 1 hochzählen
End If

If Led1m = 0 Then
Decr Led1 'um 1 runterzählen
End If


'-------
If Led2 = 255 Then
Led2m = 0
End If

If Led2 = 0 Then
Led2m = 1
End If

'Zähler1 hoch/runter
If Led2m = 1 Then
Incr Led2 'um 1 hochzählen
End If

If Led2m = 0 Then
Decr Led2 'um 1 runterzählen
End If



Wend


If Led1pause = 2000 Then
Led1pause = 0
End If

Return

TobiasBlome
31.10.2006, 19:27
Hat denn keiner eine Idee warum meine UART nicht will?