Sida 1 av 1

timer interupt i pic12f675

Postat: 31 juli 2008, 20:06:11
av victor_passe
Hej, jag blev just klar med en 4*5 led matris som styrs av en pic12f675 som visar en text som är skriven i eeprom.
Den scrollar texten såklart men den gör det olika snabbt beroende på hur många pixlar som är på.
Jag målar nämligen upp bilden ca 1000 gånger och byter sedan till nästa bild.

Att använda en timer är såklart mycket bättre men jag vet inte hur dem funkar.

Hur skriver jag om jag vill ha en timer som triggar en interupt ca 3 gånger i sekunden?
Man ska hellst kunna själv ställa in hastigheten med en konstant i programmet om det ska gå något snabbare/saktare än 3 gånger per sek.
upplösningen behöver inte vara mer än 4 lägen eller något.

När timern är "klar" ska variabeln "next"bli 1.

Jag fattar grova drag hur det funkar, att man ska starta timern och ställa in en prescaler och enabla interupt eller något sådant. men hur det översätts till asm vet jag inte.

Det är alltså en 12f675 som kör på den interna 8Mhz.

Postat: 31 juli 2008, 20:21:14
av Micke_s
Din timer kan ju ha t.ex. 100hz update eller så.
det ger steg på 10ms, brukar vara vettigt.

sedan så är det bara att ha en variabel som säger vad den ska räkna upp/ner ifrån. 33 blir då t.ex. 330ms, 50=500ms osv..

Postat: 31 juli 2008, 20:26:34
av sodjan
> Att använda en timer är såklart mycket bättre men jag vet inte hur dem funkar.

Kanske lite onödigt att säga, men det står (surprice!) i databladet... :-)

> Hur skriver jag om jag vill ha en timer som triggar en interupt ca 3 gånger i sekunden?

Eller 6, 9, 12, 24 ggr/s eller något annat som enkelt delas ner till 3.
Nornalt har man an bas-timer som man sedan räknar för att få
sina andra delays som applikationen behöver. Som Micke_s beskrev...

> men hur det översätts till asm vet jag inte.

Exemplen i databladet brukar alltid vara i just assembler. Så det blir
inget att "översätta". Och en beskrivning nerskriven som
vanlig löpande text är i princip bara att skirva av som assembler
som gör samma sak som texten beskriver.

Men viktigast är att du sätter igång !!
Fråga sedan när du kör fast...

Postat: 31 juli 2008, 21:24:57
av Micke_s
jag hade använd timer1 till detta

Sätt
TMR1CS = 1
T1CKPS = 1

TMR1IE = 1

och glöm inte global interrupt enable

vid timer1 overflow ska TMR1 laddas om med 10 000 för få en tidsbas på 10ms

Det är trevligt att ha en vettig tidsbas att gå ifrån, t.ex. 10ms, 20ms, 1ms osv beroende på kravet på räknarna. Jag brukar välja 10ms vanligtvis så kan man snabbt återanvända kod.