niko4ever
04.04.2012, 11:31
Bongiorno!
Ich bin relativ neu in der Microcontroller Welt. Ich habe schon einige Sachen mit CMOS gebaut, Uhren und Stoppuhren und so... Mein erstes AVR-Projekt ist eine Uhr mit 4 7-Segmentanzeigen, Atmega8, 1MHz Quarzoszillator und einem 5er Lauflicht, das zu jeder vollen Stunde ein paar Spielereien macht. Bei Tastendruck soll es laufend Spielereien machen, solange bis die Taste erneut gedrückt wird.
Das Lauflicht befindet sich an Portb.0 - Portb.4. Dort sind LEDs mit Vorwiderstand gegen Masse...
Der Taster, der das auslöst ist gegen + und mit Kondensator entprellt...
Die Uhr ist modifiziert von http://blackstrom.derschwarz.de/avr/avr_uhr/index.shtml, Wolfgang Schwarz und funktioniert ganz ausgezeichnet!
Sie benutzt Timer0 für Multiplexing und Timer1 für die Sekundenimpulse der Uhr. Timer2 habe ich für das Lauflicht verwendet. Er steht vor der Hauptschleife:
Config Timer2 = Counter , Prescale = 1024 'Timer 2 wird für das Lauflicht verwendet
Enable Timer2 'Prescale 1024 bedeutet, der 1MHz Takt wird durch 1024 geteilt
On Timer2 Isr_von_timer2
'In die Hauptschleife habe ich das hier geschrieben:
Do
If Zl_minute = 0 And Zh_minute = 0 And Zl_sekunde = 0 And Zh_sekunde = 0 Then 'Lauflicht zu jeder vollen Stunde
A = 1 'Springt in die Lauflicht Routine
T = 0 'Timer für Lauflicht auf 0
I = Rnd(12) 'Erzeugt Zufallszahl zwischen 1 und 11 für verschiedene Programme
End If
und
If Pinb.5 = 1 Then 'Wenn Taster, der Pinb.5 gegen +5V schaltet gedrückt wird...
'dieser Taster ist wie auf dem Atmel Evaluation Board von Pollin
'mit 100nF entprellt und mit 33KOhm gegen Massen
'Toggle Taster, damit will ich eigentlich arbeiten 'Toggle Taster würde die Variable Taster (Bit) von 1 auf 0 oder von 0 auf 1 setzen
T = 0 'Timer für Lauflicht 0
A = 1 'Springt runter in Zeile 340
I = Rnd(12) 'Erzeugt Zufallszahl zwischen 1 und 11 für verschiedene Programme
Bitwait Pinb.5 , Reset 'Bitwait war im Testtool vom Atmel Evaluation Board
End If
Loop
End
'Weiter unten steht dann
Isr_von_timer2: 'ISR von Timer1
Timer2 = 3000 'Timer1 soll von 3000 wegzählen
Incr T 'Die Variable T wird dann jede halbe Sekunde oder so erhöht
If A = 1 Then
If I = 1 Then 'ähnlich wie 'Knightrider'
Select Case T 'auf T bezogen
Case 1 : Portb = &B00000001 'ab T = 1; schalte die Ports für das Lauflicht so
Case 3 : Portb = &B00000011 'ab T = 3; schalte die Ports dann so...
Case 5 : Portb = &B00000110
Case 7 : Portb = &B00001100
Case 9 : Portb = &B00011000 'Portb = &B00011000
Case 11 : Portb = &B00010000 'Portb. 43210
Case 13 : Portb = &B00011000
Case 15 : Portb = &B00001100
Case 17 : Portb = &B00000110
Case 19 : Portb = &B00000011
Case 21 : Portb = &B00000001
Case 23 : Portb = &B00000011
Case 25 : Portb = &B00000110
Case 27 : Portb = &B00001100
Case 29 : Portb = &B00011000
Case 31 : Portb = &B00010000
Case 33 : Portb = &B00011000
Case 35 : Portb = &B00001100
Case 37 : Portb = &B00000110
Case 39 : Portb = &B00000011
Case 41 : Portb = &B00000001
Case 43 : Portb = &B00000011
Case 45 : Portb = &B00000110
Case 47 : Portb = &B00001100
Case 49 : Portb = &B00011000
Case 51 : Portb = &B00010000
Case 53 : Portb = &B00011000
Case 55 : Portb = &B00001100
Case 57 : Portb = &B00000110
Case 59 : Portb = &B00000011
Case 61 : Portb = &B00000001
Case 63 : Portb = &B00000000
End Select
End If
If I = 2 Then
'Hier und weiter unten stehen noch 10 Spielereien, mit I zugeordnet
End If
End If
Return
So, das funktioniert so lala. Das Problem ist, dass es, wenn
If Zl_minute = 0 And Zh_minute = 0 And Zl_sekunde = 0 And Zh_sekunde = 0 Then
eine Sekunde lang flackert, es löst dann dauernd Zufallszahlen aus?
Ausserdem weiß ich nicht, wie der Sprung funktioniert, oder warum!? A ist eine Variable, die nie mehr auf 0 gesetzt wird, trotzdem löst es bei jedem Tastendruck sauber und zu jeder vollen Stunde nicht ganz so sauber aus. Ich bin schon die letzten Nächte am Knobeln und lesen, aber das ist bis jetzt meine beste Lösung! Wie könnte ich das sauber hinbekommen?
Ich bin relativ neu in der Microcontroller Welt. Ich habe schon einige Sachen mit CMOS gebaut, Uhren und Stoppuhren und so... Mein erstes AVR-Projekt ist eine Uhr mit 4 7-Segmentanzeigen, Atmega8, 1MHz Quarzoszillator und einem 5er Lauflicht, das zu jeder vollen Stunde ein paar Spielereien macht. Bei Tastendruck soll es laufend Spielereien machen, solange bis die Taste erneut gedrückt wird.
Das Lauflicht befindet sich an Portb.0 - Portb.4. Dort sind LEDs mit Vorwiderstand gegen Masse...
Der Taster, der das auslöst ist gegen + und mit Kondensator entprellt...
Die Uhr ist modifiziert von http://blackstrom.derschwarz.de/avr/avr_uhr/index.shtml, Wolfgang Schwarz und funktioniert ganz ausgezeichnet!
Sie benutzt Timer0 für Multiplexing und Timer1 für die Sekundenimpulse der Uhr. Timer2 habe ich für das Lauflicht verwendet. Er steht vor der Hauptschleife:
Config Timer2 = Counter , Prescale = 1024 'Timer 2 wird für das Lauflicht verwendet
Enable Timer2 'Prescale 1024 bedeutet, der 1MHz Takt wird durch 1024 geteilt
On Timer2 Isr_von_timer2
'In die Hauptschleife habe ich das hier geschrieben:
Do
If Zl_minute = 0 And Zh_minute = 0 And Zl_sekunde = 0 And Zh_sekunde = 0 Then 'Lauflicht zu jeder vollen Stunde
A = 1 'Springt in die Lauflicht Routine
T = 0 'Timer für Lauflicht auf 0
I = Rnd(12) 'Erzeugt Zufallszahl zwischen 1 und 11 für verschiedene Programme
End If
und
If Pinb.5 = 1 Then 'Wenn Taster, der Pinb.5 gegen +5V schaltet gedrückt wird...
'dieser Taster ist wie auf dem Atmel Evaluation Board von Pollin
'mit 100nF entprellt und mit 33KOhm gegen Massen
'Toggle Taster, damit will ich eigentlich arbeiten 'Toggle Taster würde die Variable Taster (Bit) von 1 auf 0 oder von 0 auf 1 setzen
T = 0 'Timer für Lauflicht 0
A = 1 'Springt runter in Zeile 340
I = Rnd(12) 'Erzeugt Zufallszahl zwischen 1 und 11 für verschiedene Programme
Bitwait Pinb.5 , Reset 'Bitwait war im Testtool vom Atmel Evaluation Board
End If
Loop
End
'Weiter unten steht dann
Isr_von_timer2: 'ISR von Timer1
Timer2 = 3000 'Timer1 soll von 3000 wegzählen
Incr T 'Die Variable T wird dann jede halbe Sekunde oder so erhöht
If A = 1 Then
If I = 1 Then 'ähnlich wie 'Knightrider'
Select Case T 'auf T bezogen
Case 1 : Portb = &B00000001 'ab T = 1; schalte die Ports für das Lauflicht so
Case 3 : Portb = &B00000011 'ab T = 3; schalte die Ports dann so...
Case 5 : Portb = &B00000110
Case 7 : Portb = &B00001100
Case 9 : Portb = &B00011000 'Portb = &B00011000
Case 11 : Portb = &B00010000 'Portb. 43210
Case 13 : Portb = &B00011000
Case 15 : Portb = &B00001100
Case 17 : Portb = &B00000110
Case 19 : Portb = &B00000011
Case 21 : Portb = &B00000001
Case 23 : Portb = &B00000011
Case 25 : Portb = &B00000110
Case 27 : Portb = &B00001100
Case 29 : Portb = &B00011000
Case 31 : Portb = &B00010000
Case 33 : Portb = &B00011000
Case 35 : Portb = &B00001100
Case 37 : Portb = &B00000110
Case 39 : Portb = &B00000011
Case 41 : Portb = &B00000001
Case 43 : Portb = &B00000011
Case 45 : Portb = &B00000110
Case 47 : Portb = &B00001100
Case 49 : Portb = &B00011000
Case 51 : Portb = &B00010000
Case 53 : Portb = &B00011000
Case 55 : Portb = &B00001100
Case 57 : Portb = &B00000110
Case 59 : Portb = &B00000011
Case 61 : Portb = &B00000001
Case 63 : Portb = &B00000000
End Select
End If
If I = 2 Then
'Hier und weiter unten stehen noch 10 Spielereien, mit I zugeordnet
End If
End If
Return
So, das funktioniert so lala. Das Problem ist, dass es, wenn
If Zl_minute = 0 And Zh_minute = 0 And Zl_sekunde = 0 And Zh_sekunde = 0 Then
eine Sekunde lang flackert, es löst dann dauernd Zufallszahlen aus?
Ausserdem weiß ich nicht, wie der Sprung funktioniert, oder warum!? A ist eine Variable, die nie mehr auf 0 gesetzt wird, trotzdem löst es bei jedem Tastendruck sauber und zu jeder vollen Stunde nicht ganz so sauber aus. Ich bin schon die letzten Nächte am Knobeln und lesen, aber das ist bis jetzt meine beste Lösung! Wie könnte ich das sauber hinbekommen?