Timer i PIC

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
mrhedin
Inlägg: 114
Blev medlem: 3 maj 2005, 19:46:24
Ort: Trollhättan/Kiruna
Kontakt:

Inlägg av mrhedin »

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.
Senast redigerad av mrhedin 27 september 2005, 21:30:48, redigerad totalt 1 gång.
mrhedin
Inlägg: 114
Blev medlem: 3 maj 2005, 19:46:24
Ort: Trollhättan/Kiruna
Kontakt:

Inlägg av mrhedin »

Ho ho! Niciga grejer. Astrofoto på G eller? =)
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

TMR1 är registret som ger värdet från timer1 (hårdvarutimer).

Min tanke var att någon annan som kan PicBasic vet hur man konfigurerar timer1.
Jag kan inte PicBasic därför kan jag bara bidra med "princip-kod".
jensa
Inlägg: 149
Blev medlem: 28 oktober 2003, 18:16:49
Ort: Umeå

Inlägg av jensa »

Hmm, vore inte en lösning att t.ex. låta en relativt exakt (dator) klocka pulsa ut en gång varje sekund eller motsv. och sedan spara TMR1 värdet i minnet, skicka tillbaka via comport/LCD... eller är det för avancerat/onödigt drygt?
Funderade med på hur man ska lösa RTC utan extern RTCmodul.
Användarvisningsbild
tusse
Inlägg: 1364
Blev medlem: 19 augusti 2003, 21:56:17
Ort: Järfälla

Inlägg av tusse »

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.
Användarvisningsbild
tusse
Inlägg: 1364
Blev medlem: 19 augusti 2003, 21:56:17
Ort: Järfälla

Inlägg av tusse »

TMR1 skulle man kunna nå med assemblerkod, skulle man då inte kunna skriva Chribbe76 basicförslag i assembler och få en port med 1 sek pulser.

En sak jag inte fattar, om man utvecklar ett program som ska användas för programering av pickretsar vadför fungerar det då inte som utlovat.
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

Kan man skriva assemblerkod i PicBasic?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> 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.
Pjoms
EF Sponsor
Inlägg: 644
Blev medlem: 24 maj 2004, 12:18:40
Ort: Ö-vik

Inlägg av Pjoms »

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:

Kod: Markera allt

ASM
bsf PORTA, 0 ; Set bit 0 on PORTA
bcf PORTB, 0 ; Clear bit 0 on PORTB
ENDASM
Användarvisningsbild
tusse
Inlägg: 1364
Blev medlem: 19 augusti 2003, 21:56:17
Ort: Järfälla

Inlägg av tusse »

sodjan>>>
vadför fungerar det då inte som utlovat.

Vad är det som är utlovat ?

Svar: det som står i manualen till Pic-Basic

Har du något datablad på svenska så ska jag läsa det.

Har du inget posetivt att tillföra denna tråd så:
någon skrev tidigare:
Som sagt, jag "backar ur" här...
Användarvisningsbild
tusse
Inlägg: 1364
Blev medlem: 19 augusti 2003, 21:56:17
Ort: Järfälla

Inlägg av tusse »

Chribbe76 skrev:Kan man skriva assemblerkod i PicBasic?
Ja det går bra men det har sinna begränsningar, max 8k text och det gäller aven förklaringar. Därimot så kan man ha flera block med 8 k text.

Bert
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

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 :

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
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.
Användarvisningsbild
tusse
Inlägg: 1364
Blev medlem: 19 augusti 2003, 21:56:17
Ort: Järfälla

Inlägg av tusse »

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.
Kaggen
Inlägg: 432
Blev medlem: 29 januari 2005, 03:06:02

Inlägg av Kaggen »

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
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

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 ?
Skriv svar