Timer0 eines ATMega32 unregelmäßig

Gast #1514285
Lesenswert?

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
Gast #1514306
Lesenswert?

$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
#1514312
Lesenswert?

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
Gast #1514325
Lesenswert?

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.
#1514337
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren