Forum: Mikrocontroller und Digitale Elektronik Timer0 eines ATMega32 unregelmäßig


von Andreas (Gast)


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

von Peter (Gast)


Lesenswert?

zu 99.99% an der Software von dir. Die wir leider nicht kennen.

von Sven (Gast)


Lesenswert?

Ja.

von Andreas (Gast)


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

von Andreas (Gast)


Lesenswert?

Habe mal das waitms rausgenommen, weil ich vermutet hab, das würde alles 
anhalten, aber da springt das prog. gar nicht rein.

von Michael S. (captain-stone)


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

von Andreas (Gast)


Lesenswert?

Habe doch den Code oben eingefügt? Ist in Bascom programmiert.

von Thomas B. (escamoteur)


Lesenswert?

Schon mal mit externen Takt probiert?

von Andreas (Gast)


Lesenswert?

Ja, genau das selbe Phänomen

von Peter (Gast)


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.

von Michael S. (captain-stone)


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.

von Andreas (Gast)


Lesenswert?

Ich habe hier keinen Oszi., deswegen kann ich nichts messen.

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
Noch kein Account? Hier anmelden.