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?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.