mikrocontroller.net

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


Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

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

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja.

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas (Gast)
Datum:

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

Autor: Michael Steinbauer (Firma: Steinbauer Electronics GmbH) (captain-stone)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe doch den Code oben eingefügt? Ist in Bascom programmiert.

Autor: Thomas Burkhart (escamoteur)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schon mal mit externen Takt probiert?

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, genau das selbe Phänomen

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael Steinbauer (Firma: Steinbauer Electronics GmbH) (captain-stone)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe hier keinen Oszi., deswegen kann ich nichts messen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.