mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC16F87x Timer und Interrupts (Anfängerfragen bitte nicht schlagen)


Autor: skork (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich grüße euch,

habe vor kurzem mit Microcontrollern angefangen, leider verstehe ich 
noch sehr wenig davon und habe einige Fragen...

Bevor ich anfange, arbeite mit einem PIC16F872 und mein Takt liegt (je 
nach vorhanden Bauteilen zwischen 4-10 MHZ. Arbeite in Assembler
Habe auch schon das DATA SHEET gewälzt, aber werde nicht ganz so schlau 
draus

Was möchte ich:

Mein Pic solle alle x Sekunden eine bestimmte aktion ausführen = port 
löschen ( habe ich bis jetz über warte routinen gemacht), da mein pic 
aber in der zwischenzeit weiterarbeiten und genug anderes zu erledigen 
erkennen und bearbeitet hat, wollte ich das über nen timer und nen 
interrupt machen. Grundüberlegung so machbar oder falsche 
herangehensweise?

wo ist der unterschied der Timer0-2, ist es egal, welchen timer ich für 
diese operation nehme?
gilt der prescaler nur den jeweiligen timer oder für alle oder 
verlangsamt der den ganzen pic dann? Was genau bedeutet oscillator mode 
und sync control bei timer 1? bzw rbpu und intedg bei timer 0?

was muss ich bei dem interrupt beachten?
wie sollte so etwas überhaupt aufgebaut sein (ein interrupt)?
reicht gie enable und t0ie enable im intcon?
woher weiß er welchen interrupt er ausführen soll? wie teste ich das, 
muss ich doch testen oder?

reicht
    MOVWF   W_TEMP
    SWAPF   STATUS,W
    CLRF    STATUS
    MOVWF   STATUS_TEMP
    MOVF    PCLATH, W
    MOVWF   PCLATH_TEMP
    CLRF    PCLATH        ; Bank 0

    ;meine aktionen

    MOVF    PCLATH_TEMP, W
    MOVWF   PCLATH
    SWAPF   STATUS_TEMP,W
    MOVWF   STATUS
    SWAPF   W_TEMP,F
    SWAPF   W_TEMP,W
    retfie 
reicht es wenn ich einfach im interrupt eine variable hochzähle bei 
jeder ausführung und dann teste wie weit er gezählt hat und bei 
bestimmter menge dann meine aktion ausführe?(so könnte ich meine 
mehreren sekunden hin bekommen oder?)

Autor: stephan_ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timer0 ist bei 4 MHz nur für kurze Zeiten zu empfehlen, bei 4 MHz ist 
die längste Timer-Zeit ca 65 msec, der Timer1 und Timer 2 sind im 
Sekunden-Bereich schon besser, ca 0.5 sec. Besonders interessant ist 
hier der Timer1, den kann man mit einem externen Uhrenquarz bestücken 
(unabhängig vom Oszillator des Prozessors), damit sind dann 16 Sekunden 
möglich und man kann den Prozessor währenddessen in den Schlaf schicken.

Lies mal http://www.sprut.de/electronic/pic/grund/timer/timer.htm durch, 
das steht alles über die PIC-Timer drin.

Autor: skork (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
möchte es über den internen tackt machen da alles sehr klein und 
möglichst einfach werden soll habe ich es richtig verstanden:

initialisierung

bank 0
MOVLW  B'1100000'
MOVWF  INTCON
bank1
BSF  PIE1,TMR1IE

und das flag bit welches ich zurück setzen muss (innerhalb des 
interrupts) ist :
bcf  PIR, TMR1IF

erstmal danke für die hilfe

Autor: skork (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe dann den interrupt so gemacht
  BCF    INTCON,7
  BCF    PIR1,TMR1IF
  MOVWF   W_TEMP
    SWAPF   STATUS,W
    CLRF    STATUS
    MOVWF   STATUS_TEMP
    MOVF    PCLATH, W
    MOVWF   PCLATH_TEMP
    CLRF    PCLATH        ; Bank 0
  
  INCF  timercounter
  MOVFW  timercounter
  XORLW  D'16'
  SKPZ
  BCF    LED
  SKPZ  
  CLRF  timercounter
   
    MOVF    PCLATH_TEMP, W
    MOVWF   PCLATH
    SWAPF   STATUS_TEMP,W
    MOVWF   STATUS
    SWAPF   W_TEMP,F
    SWAPF   W_TEMP,W
  BSF  INTCON,7
    retfie 

wären dann PI mal DAUMEN 3,2 s  bei 10 MHz und 1:8 prescaler oder?

oder habe ich jetz was wichtiges vergessen oder falsch gemacht?

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pi mal Daumen sind es genau 3,2 ms

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
quatsch 3,2 µs

Autor: skork (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oh, okay, wieso das?

dachte durch den 16 bit counter  und den prescaler von 8 müsste der alle 
200 ms in den interrupt springen
(habe den pic time calcutlator benutzt)

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja und da steht halt 3,2 µs.
Zeigt er doch an.

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.