Hallo, ich habe mit der Programmierung eines ATMega32 angefangen. Dabei ist mir folgendes aufgefallen: Ich lasse den Timer0 hochlaufen mit einem Vorteiler von 1024 (der uC läuft mit 1MHz interner Takt) Bei Überlauf toggle (Bascom) ich den Ausgang. Wenn ich das Programm dann ablaufen lasse, blinkt die LED ein paar Mal regelmäßig. Zwischendurch ist sie ein wenig länger aus oder auch länger an. Weiß einer woran das liegen könnte? Gruß Andreas
zu 99.99% an der Software von dir. Die wir leider nicht kennen.
$regfile = "m32def.dat" $framesize = 32 $swstack = 32 $hwstack = 32 $crystal = 1000000 'Eingänge Config Pina.0 = Input 'Ein Pin (PA0) wird als Eingang definiert Porta.0 = 1 'Interner Pullup Widerstand ein Taster Alias Pina.0 Config Pina.1 = Input 'Ein Pin (PA1) wird als Eingang definiert Porta.1 = 1 'Interner Pullup Widerstand ein Impulse Alias Pina.1 Config Pina.2 = Input 'Ein Pin (PA2) wird als Eingang definiert Porta.2 = 1 'Interner Pullup Widerstand ein Tuer Alias Pina.2 'Ausgänge Config Portc.0 = Output 'Ein Pin wird als Ausgang konfiguriert PC0 (also Pin0 von Port C) Config Portc.4 = Output 'Ein Pin wird als Ausgang konfiguriert PC4 (also Pin4 von Port C) Config Portc.1 = Output 'Ein Pin wird als Ausgang konfiguriert PC1 (also Pin1 von Port C) Pumpe Alias Portc.0 'Alias zuordnen Lampe Alias Portc.4 'Alias zuordnen Ventil Alias Portc.1 'Alias zuordnen Pumpe = 1 Lampe = 1 Ventil = 1 'Variablen Dim Liter As Integer 'Liter als zähler für Impulse Liter = 0 'auf 0 setzen Dim Takt As Bit 'Blinktakt Dim Anz_imp_1_liter As Integer 'Vorwahl Impulse pro Liter Anz_imp_1_liter = 1000 'Timer Config Timer0 = Timer , Prescale = 1024 'Konfiguriere Timer1 Enable Timer0 'schalte den Timer1 ein On Timer0 Isr_von_timer0 'verzweige bei Timer1 überlauf zu Isr_von_Timer1 Enable Interrupts Timer0 = 0 Do If Taster = 0 Then If Tuer = 0 Then Pumpe = 0 End If End If If Tuer = 0 Then ' wenn Tür offen If Pumpe = 1 Then 'und die Pumpe aus Lampe = 0 'Lampe einschalten End If Else Lampe = 1 End If If Pumpe = 0 Then While Liter <= Anz_imp_1_liter Lampe = Takt Dim Flag As Bit If Impulse = 0 Then If Flag = 0 Then Liter = Liter + 1 Flag = 1 End If Else Flag = 0 End If If Tuer = 1 Then 'Wenn die Tür vorzeitig geschlossen wird Liter = 32767 'Liter in Überlauf End If Wend If Liter >= Anz_imp_1_liter Then Pumpe = 1 Liter = 0 End If End If '----------------------------------------------------------- 'VENTIL ABREINIGUNG Debounce Tuer , 1 , Abspruehen , Sub Debounce Tuer , 0 , Abspruehenende , Sub '----------------------------------------------------------- Loop End Isr_von_timer0: 'ISR von Timer0 Timer0 = 0 'Timer0 soll wieder von 0 wegzählen Toggle Takt 'schaltet LED Return Abspruehen: Dim X As Integer While X <= 2 Pumpe = 1 Lampe = 1 Ventil = 0 X = X + 1 Waitms 300 If Tuer = 0 Then X = 10 End If Wend Ventil = 1 Return Abspruehenende: X = 0 Ventil = 1 Return
Habe mal das waitms rausgenommen, weil ich vermutet hab, das würde alles anhalten, aber da springt das prog. gar nicht rein.
Andreas, - wo hängt da eine LED dran? - wie hängt da die LED dran? - Was zeigt das Oszi, als Du die Ansteuerung der LED gemessen hast? - In welcher Sprache hast Du programmiert? - Wie sieht die Software dazu aus? - Wie die Einstellungen der Register für Timer0? - Wie kommst Du drauf, dass der Timer0 unregelmäßig kommt? - Wie hast Du das gemessen? Michael
Habe doch den Code oben eingefügt? Ist in Bascom programmiert.
toggle mal direkt in der ISR die LAMPE, die ganze IF und Debounce kann man nicht mal schnell ebend überblicken, ich denke aber das dort der fehler liegt. Dort steht z.b. ein "Waitms 300" in der Zeit wird dann auch die Lampe nicht umgeschaltet.
Andreas schrieb: > Habe doch den Code oben eingefügt? Ist in Bascom programmiert. Ja, das war auch fast zur selben Zeit. Aber die anderen Fragen sind unbeantwortet. Was siehst Du denn am Oszi, wenn Du am Pin Deiner LED misst? Ist da die Frequenz Deiner Timer0 Einstellung zu erkennen? Nur mit raten wirst Du den Fehler recht schwer finden können.
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.