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.