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


von skork (Gast)


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
1
    MOVWF   W_TEMP
2
    SWAPF   STATUS,W
3
    CLRF    STATUS
4
    MOVWF   STATUS_TEMP
5
    MOVF    PCLATH, W
6
    MOVWF   PCLATH_TEMP
7
    CLRF    PCLATH        ; Bank 0
8
9
    ;meine aktionen
10
11
    MOVF    PCLATH_TEMP, W
12
    MOVWF   PCLATH
13
    SWAPF   STATUS_TEMP,W
14
    MOVWF   STATUS
15
    SWAPF   W_TEMP,F
16
    SWAPF   W_TEMP,W
17
    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?)

von stephan_ (Gast)


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.

von skork (Gast)


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

von skork (Gast)


Lesenswert?

Habe dann den interrupt so gemacht
1
  BCF    INTCON,7
2
  BCF    PIR1,TMR1IF
3
  MOVWF   W_TEMP
4
    SWAPF   STATUS,W
5
    CLRF    STATUS
6
    MOVWF   STATUS_TEMP
7
    MOVF    PCLATH, W
8
    MOVWF   PCLATH_TEMP
9
    CLRF    PCLATH        ; Bank 0
10
  
11
  INCF  timercounter
12
  MOVFW  timercounter
13
  XORLW  D'16'
14
  SKPZ
15
  BCF    LED
16
  SKPZ  
17
  CLRF  timercounter
18
   
19
    MOVF    PCLATH_TEMP, W
20
    MOVWF   PCLATH
21
    SWAPF   STATUS_TEMP,W
22
    MOVWF   STATUS
23
    SWAPF   W_TEMP,F
24
    SWAPF   W_TEMP,W
25
  BSF  INTCON,7
26
    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?

von Stefan (Gast)


Lesenswert?

Pi mal Daumen sind es genau 3,2 ms

von Stefan (Gast)


Lesenswert?

quatsch 3,2 µs

von skork (Gast)


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)

von Stefan (Gast)


Lesenswert?

Ja und da steht halt 3,2 µs.
Zeigt er doch an.

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.