mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Fragen zum Timer beim 8051 bzw. C515C


Autor: C515C (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich versuche per Timer ganze Sekunden zu zählen. Dafür hab ich für Timer 
1 M1 und M0 auf "M1=0 M0=1" gesetzt, so das ich einen 16 Bit-Zähler 
habe. TH1 und TL1 werden somit kaskadiert verwendet, so das ich bis 
65536 zählen kann.

Jetzt meine Rechnung:
Laut Angabe aus einem Datenblatt soll der C515C bei 10 MHz Taktfrequenz 
den Timer alle 0.6us inkrementieren.

Damit ich auf eine Sekunde komme, brauche ich also 1s/(0.6us)=1.666.667 
Zählschritte. Nach 65536 Zähl-Schritten bekomme ich jeweils einen 
Überlauf des Timers, also einen Interrupt.

D.h. nach ca. 1.666.667/65536 = 25 Interrupts ist eine Sekunde 
verstrichen.

Ist das soweit richtig?! Bei mir kommt der Interrupt viel zu oft, das 
sind im Leben keine Sekunden und ich finde den Fehler nicht...

Autor: Matthias Kölling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht ist das interrupt request flag von Hand zu löschen. Wenn man 
das dann vergisst, wir die ISR nach dem Verlassen sofort wieder 
angesprungen.

Autor: C515C (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daran kann es nicht liegen, da beim 8051/C515C das TF1 (Timer 1 Overflow 
Flag) automatisch von der Hardware resetted wird, wenn der Prozessor in 
die Unterruptroutine springt :-/

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ea ist einfach besser, wenn du das Programm postest.

Autor: Carlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
stell mal deinen Code ein, dann kam man vielleicht etwas mehr dazu 
sagen.

Gruß

Carlos

Autor: C515C (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay, also scheint es an meiner Rechnung ja erstmal nix auszusetzen zu 
geben. Programm ist in Assembler, hier die wesentlichen Auszüge:

Timer initialisierung (ja, gerade nicht schön I know)
InitTimer1:
  ; 
  ;  7 gate:  0 weil timer nicht vom gate sondern nur vom OSC abhängig sein soll
  ; 6 C/!T: muss 0 sein, damit der OSC als Timer dient und kein externer Pin 
  ; 5 4  M1M0-Combo:  0 1 -> 16 bit timer  TH1 und TL1 werden kaskadiert, so das länger gezählt werden kann
  mov tmod,#00010000b


  clr tr1   ; Timer anhalten, um neue Werte schreiben zu können

  ; Timer initalisieren, es soll immer von 0-65k gezählt werden
  mov th1,#0x00
  mov tl1,#0x00
  setb tr1  ; Timer 1 starten (Run)
  ret


Interrupt-Routine des Timers, die auch aufgerufen wird
g_Intr_Counter1:
  ; Akku wird normalerweise gesichert, genau wie die Registerbänke, hier gehts gerade ums testen
  push psw


  ; Eigentliche Interruptbehandlung
  ;--------------------------------  

  cjne r0,#0x19, bla  ; 25 Dezimal,d.h. erst nach 25 Interrupts a inkrementieren

   inc a

  call serout  ; Akkuinhalt auf serieller Schnittstelle ausgeben

  call InitTimer1  ; Timer wieder neu initialisieren (Methode von oben)
  bla:
   inc r0
 
  ;--------------------------------
  pop psw
  reti

Autor: C515C (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Natürlich wird r0 auch wieder auf 0 gesetzt, die Zeile hab ich 
unterschlagen sorry

Autor: Matthias Kölling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Punkt1: Du brauchst den Timer nicht neu zu initialisieren, da er 
weiterrennt.
Punkt2: R0 wir bei erreichen der 25 nicht genullt.

Autor: schudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

der C515C teilt laut Datenblatt die Oszillatorfrequenz durch 6.
Bei 10 MHz Taktfrequenz ergibt sich dann eine Taktzykluszeit von 0,6 µs 
wie Du richtig geschrieben hast. Weil bei einem 16 Bit-Timer bis 65536 
Interrupts gezählt werden können, bis er überläuft, ergibt sich daraus 
eine maximale Verzögerungszeit von 39,3216 ms. Willst du mehr (z.B. 1 s) 
mußt du bei jedem Timerinterrupt eine zusätzliche Variable hochzählen 
und abfragen!

mfg

Lothar

Autor: Matthias Kölling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deswegen zählt er bis 25

Autor: schudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich hatte meine Antwort schon formuliert, als der Codeausschnitt
noch nicht sichtbar war :-(

Aber meines Wissens ist der Timer-Counter ein Abwärtszähler und löst den 
Interrupt aus, wenn er 0 erreicht. In diesem Beispiel müsste er meines 
Erachtens deshalb auf auf 65535 initialisiert werden.

Wird er auf 0 initialisiert macht er immer sofort einen Interrupt.

Kein Wunder, daß dann die Zeit zu kurz ist, weil nur 25 Takte auf r0 
gezählt werden, wobei r0 aber in der Tat nirgendwo resettet wird!

mfg

Lothar

Autor: schudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry, ich habe Müll geschrieben!

Der Timer wird natürlich bis zum Überlauf hochgezählt (nicht runter) und 
macht den Interrupt, wenn er 0 wird.

Schäm....

mfg

Lothar

Autor: APW (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sagt mal, ist der C515C was Anderes als ein C515 ?
Ich programmiere hier gerade auf einem C535 und hier ist der Timertakt
F_Osz/12.

Aber dann müsste der Int weniger oft kommen als berechnet, und bei dir 
kommt er ja zu oft.
Wie lange dauert eigentlich deine programmierte Sekunde ?

Autor: C515C (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beim C515C ists tatsächlich 1/6. Meine programmierte Sekunde dauert 
so... 20ms ;-)?!

Autor: C515C (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay Problem gelöst: Es gab gar kein Problem.

Ich hab das nicht im realen Umfeld getestet sondern mit uVision. Dort 
läuft alles schneller ab, als in Wirklichkeit. Eine Sekunde entsprach 
dort ca 60 Sekunden. Also es passt alles, nach 1.0224s lande ich beim 
Breakpoint :-)

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.