Hallo,

ik ben pas nieuw met microcontrollers en wil om te starten om een digitaal klokje te maken met 1 pic16f84a. Ik ben dat in assembler aan 't schrijven en dat lukt me aardig.

Ik zit enkel met het probleempje da ik niet weet hoe ik met een interrupt kan werken. De bedoeling is dat om de seconde er een interrupt optreedt zodat mijn seconden met 1 kunnen verhogen en dan moet mijn programma verder bollen.

Hoe stel ik nu in dat de pic net dan een interrupt oproept?

Met een atmel is me dit al gelukt, iccavr geeft dan ook al de basis.

Mvg
Peter

Je gebruikt de code CALL interrupt.
Dan zet je op het einde van je interrupt stukje RETURN. Dan gaat ie terug waar ie vandaan kwam

Hoi Otra,

Onderstaande heb ik zelf een keer met succes gedaan, wellicht heb je er iets aan. Als je wilt mag je ook de complete source hebben, moet je me even een mailtje sturen.

1. De PIC moet geconfigureerd worden om interrupts te genereren op basis van een TMR0 overflow en TMR0 moet geconfigureerd zijn om op basis van clockout te tellen:


; set timer clock source to CLKOUT
BSF STATUS, RP0
BCF OPTION_REG, T0CS					
; Enable global interrupts
BCF STATUS, RP0
BSF INTCON, GIE						
; Enable timer 0 interrupts
BSF INTCON, T0IE				

2. De TMR0 overflows zijn niet netjes 1x per seconde. De exacte tijd hangt o.a. af van je kloksnelheid en kun je eventueel aanpassen met de prescaler. Ik zou je aanraden om in de interrupt service routine een optelling bij het TMR0 register te doen zodanig dat het aantal keren dat een overflow optreedt een net getal is ten opzichte van een seconde. Buiten de standaard dingen over het opslaan van W en STATUS die je in de datasheet kunt lezen, doe je iets als het volgende in de handler:


MOVLW   D'256' - clocks_in_tick 
ADDWF	TMR0, F
BCF     INTCON, T0IF
INCF	tick_buffer_lo, F
BTFSC	STATUS, Z
INCF	tick_buffer_hi, F

3. De tick_buffer is nu dus een 16 bit teller die bijhoudt hoe vaak er een overflow heeft opgetreden. Buiten je interrupt (in je main loop) kun je die weer "leegmaken" en aan de hand daarvan je klok een seconde vooruit zetten.

Hoop dat je er iets aan hebt,

Groeten,
Frans

Merci
Ma hoelaat je die na een seconde interrupten? Da kan toch overal in het programma zijn wanneer hij moet interrupten in principe?
Of zit ik zo mis

http://www.mikroelektronika.co.yu/english/product/books/PICbook/2_01ch…
interrupts en daar staat het redelijk uitgeschreven, heb ook nog een voorbeeldje van een binaire teller met interrupts als je wil van in de klas.

Je krijgt die interrupts niet precies 1 per seconde. Je kunt er wel voor zorgen dat je ze een goed gedefinieerd aantal keer per seconde krijgt (b.v. 1000x, 1 per milliseconde). Dan tel je gewoon totdat je bij duizend bent.

Merci

ik snap waar je naar toe wilt Frans. Ik ga het eens proberen.
Alvast bedankt
mvg

In mijn blauwe 4.0" blauwe LEDklokken gebruik ik een Xtal van 4.096MHz.
Met een TMR0-prescaler van 8 heb ik dan exact om de 2msec een interrupt (op de 30ppm-precisie van het kristal na).
In mijn klokroutine is er een teller die om de 500 (250x2x2msec=1sec) de seconden ophoogt.
Waarom 250x2?
Om de multiplexing van mijn LEDdiplays hoog genoeg te houden (2msec=500Hz -> 500/6=83.3Hz voor het 6-digits display) doe ik update van het display om de 2msec, en klokupdate om de 4msec (1 op 2 interrupts).

Je kan ook gewoon de TMR0-prescaler op 16 zetten (interrupt om de 4msec) en dan je teller laten tellen tot 250 (250x4msec=1sec).

CD :)

PS: Ik gebruik altijd kristallen met frekwenties van machten van 2, is gemakkelijker om 24u-klokken van te maken. Daarbij is 4.096MHz een courante waarde.