Timer i PIC
TMR1 är en inbyggd tidtagare i processorn. För varje klockcykel som tickas så adderas värdet i TIMR1 med "1".
Man kan om man är lite flink använda en TMR för att få ut väldigt exakta tidtagningar om hur lång tid saker i processorn tog, exempelvis hur länge ett ben var 1 o.s.v. till obegränsade möjligheter typ.
Man kan om man är lite flink använda en TMR för att få ut väldigt exakta tidtagningar om hur lång tid saker i processorn tog, exempelvis hur länge ett ben var 1 o.s.v. till obegränsade möjligheter typ.
Senast redigerad av mrhedin 27 september 2005, 21:30:48, redigerad totalt 1 gång.
mrhedin skrev:Ho ho! Niciga grejer. Astrofoto på G eller? =)
Mindre än månen lär det nog inte bli även om jag kommer upp i 800mm tele.
http://www.cabbala.net/photo/rubinar500.html
Sedan är det sällan vi ser några stjärnor här i Stockholm på¨grund av att det ska vara så mycket belysning överallt.
Det var väl det med radiolänk som var av största intresse för ir-styrningen måste man peka på kameran med.
> vadför fungerar det då inte som utlovat.
Vad är det som är utlovat ?
> Kan man skriva assemblerkod i PicBasic?
Även om PICBasic inte stöder inline asm, så brukar alla register i alla fall vara definierade, så att man kan skriva TMR1 = h'20', eller något i den stilen. D.v.s inte "ren" assembler, men close enough...
> Vad är TMR1 som du skrev om "Konfigurera TMR1 utan prescaler och nollställ den".
Jag hoppa att du har databladet för din processor !!
Om du läser på där om TMR1, så blir meningen ovan ganska tydlig...
Om du inte redan har gjort det, så bör du ta ett par timmar och plöja igenom databladet. Läs allt. Även om en del kan vara lite oklart nu, så har du igen det senare.
Vad är det som är utlovat ?
> Kan man skriva assemblerkod i PicBasic?
Även om PICBasic inte stöder inline asm, så brukar alla register i alla fall vara definierade, så att man kan skriva TMR1 = h'20', eller något i den stilen. D.v.s inte "ren" assembler, men close enough...
> Vad är TMR1 som du skrev om "Konfigurera TMR1 utan prescaler och nollställ den".
Jag hoppa att du har databladet för din processor !!
Om du läser på där om TMR1, så blir meningen ovan ganska tydlig...
Om du inte redan har gjort det, så bör du ta ett par timmar och plöja igenom databladet. Läs allt. Även om en del kan vara lite oklart nu, så har du igen det senare.
Nu är jag inte helt 100% säker när det gäller PicBasic, men i PicBasic Pro kan man stoppa in asm efter behag utan problem.
Saxat från PicBasic Pro manualen:
Saxat från PicBasic Pro manualen:
Kod: Markera allt
ASM
bsf PORTA, 0 ; Set bit 0 on PORTA
bcf PORTB, 0 ; Clear bit 0 on PORTB
ENDASM
Har laddat ner demon av PBP Prof och testkört PAUSE på en 16F628 med 4 Mhz kristall. Jag använder BLINK.BAS i demo katalogen :
Jag har testat med flera olika periodtider (även 60000), och får alltid exakta tider. Jag har kollat oscillioskopet med 50 Hz från nätet, och det stämmer mycket bra.
Avvikelsen ligger på ca 0.05%
Så, så vitt jag kan se, fungerar i alla fall PAUSE som dokumenterat.
Kod: Markera allt
'loop: High 0 ' Turn on LED connected to PORTB.0
Pause 15000 ' Delay for .5 seconds
Low 0 ' Turn off LED connected to PORTB.0
Pause 15000 ' Delay for .5 seconds
Goto loop ' Go back to loop and blink LED forever
End
Avvikelsen ligger på ca 0.05%
Så, så vitt jag kan se, fungerar i alla fall PAUSE som dokumenterat.
Provade detta program http://www.picbasic.co.uk/forum/attachm ... hmentid=84 och det håller inte heller tiden så det blir en sväng upp till Elfa för ny kristall.
Hoppas det hjälper.
Hoppas det hjälper.
Jag är ingen expert på PicBasic, men skulle tro att de flesta Pause, Delay funktioner där bygger på "simpla" delayloopar och därmed kan bli lite inexakta under längre tider. Dessa kommandon används oftast för pulsgenerering och liknande under sekunden där felen inte är så tydliga/stora.
Dessutom så är de flesta högnivåspråk till PIC och liknande microcontrollers ganska bantade på inbyggda funktioner just tack vare att avancerade funktioner tar stort utrymme och utrymme är väldigt begränsat i dessa microcontrollers. Därför överlåts en hel del innovativitet till programmeraren.
Att du skaffar en ny extern kristall kanske tyvärr inte hjälper så mycket i detta fallet (kan dock vara värt att prova).
Som jag ser det finns det två sätt att gå vidare. Det enklaste är att du själv "kalibrerar" rätt delayvärde så det stämmer med den tid du vill. Om vi säger att du testar dig fram till t.ex värdet 62543 för att pausa i 60 minuter och du vill ha en upplösning på en minut är det ju bara att dela 62543 med 60 (vilket blir ~1042.38 ), så har du det värde som du kan multiplicera med antalet minuter användaren ställer in.
Vill du göra "rätt" och vara petig så skulle jag ha köpt en klockkristall och använt som extern oscillator till timern (OBS! Inte det samma som den oscillator som du använder för att klocka PIC:en). Då måste du dock lära dig att programmera en av de inbyggda timers som finns i PIC:en, vilket borde gå att göra utan assembler. Tyvärr så lär du då också använda dig av databladet för att veta hur du skall gå tillväga, och det blir ju då problem om du har svårt med engelskan. Det finns dock , i databladen, en hel del diagram och tabeller över alla registren som du kanske kan få ut något av ändå.
mvh Mats
Dessutom så är de flesta högnivåspråk till PIC och liknande microcontrollers ganska bantade på inbyggda funktioner just tack vare att avancerade funktioner tar stort utrymme och utrymme är väldigt begränsat i dessa microcontrollers. Därför överlåts en hel del innovativitet till programmeraren.
Att du skaffar en ny extern kristall kanske tyvärr inte hjälper så mycket i detta fallet (kan dock vara värt att prova).
Som jag ser det finns det två sätt att gå vidare. Det enklaste är att du själv "kalibrerar" rätt delayvärde så det stämmer med den tid du vill. Om vi säger att du testar dig fram till t.ex värdet 62543 för att pausa i 60 minuter och du vill ha en upplösning på en minut är det ju bara att dela 62543 med 60 (vilket blir ~1042.38 ), så har du det värde som du kan multiplicera med antalet minuter användaren ställer in.
Vill du göra "rätt" och vara petig så skulle jag ha köpt en klockkristall och använt som extern oscillator till timern (OBS! Inte det samma som den oscillator som du använder för att klocka PIC:en). Då måste du dock lära dig att programmera en av de inbyggda timers som finns i PIC:en, vilket borde gå att göra utan assembler. Tyvärr så lär du då också använda dig av databladet för att veta hur du skall gå tillväga, och det blir ju då problem om du har svårt med engelskan. Det finns dock , i databladen, en hel del diagram och tabeller över alla registren som du kanske kan få ut något av ändå.
mvh Mats
Kaggen har i princip rätt, så klart.
PAUSE är en helt programvarubaserad loop.
Min mätning av PAUSE funktioner visar att de har lyckats ganska bra med den.
Problemet är att eventuell *annan* kod mellan PAUSE anropen ställer till det, och är väldigt svår att beräkna. Så blir t.ex 60 st PAUSE 1000 efter varandra säkert en del mer en ett PAUSE 60000.
Däremot var de avvikelser som tusse såg onormalt stora, Man ska inte behöva
sätta PAUSE 62000 för att komma till 60 sek.
En klockkristall på TMR1 osc är helt rätt väg.
> Tyvärr så lär du då också använda dig av databladet...
"Tyvärr" ?
Hur klarar man sig alls utan det ?
PAUSE är en helt programvarubaserad loop.
Min mätning av PAUSE funktioner visar att de har lyckats ganska bra med den.
Problemet är att eventuell *annan* kod mellan PAUSE anropen ställer till det, och är väldigt svår att beräkna. Så blir t.ex 60 st PAUSE 1000 efter varandra säkert en del mer en ett PAUSE 60000.
Däremot var de avvikelser som tusse såg onormalt stora, Man ska inte behöva
sätta PAUSE 62000 för att komma till 60 sek.
En klockkristall på TMR1 osc är helt rätt väg.
> Tyvärr så lär du då också använda dig av databladet...
"Tyvärr" ?

Hur klarar man sig alls utan det ?