Sida 1 av 2

PIC Timer - Har jag tänkt rätt här?

Postat: 31 januari 2016, 13:51:11
av Erik M
Vad jag vill ha gjort med en PIC12F683 och denna bit kod är förutsättningarna för en timer (TMR0) att rulla efter 50µs.

Tanken är att vid Fosc 8MHz ges en uppräkning av TMR0 per 500ns, dvs TMR0 rullar var 128e µs.
Omvänt blir TMR0 uppräknad var 500e ns .

Kod: Markera allt

; - - - - - - - - - - - - - - - - - / - - - - - - - - - - - - - - - - - /	
	BANKSEL	OPTION_REG	    ; 1_1_1_1 1_111	
	MOVLW  	b'01011000'   	; 0_X_0_X 1_000 - WPU & WDT 1:1	
	MOVWF  	OPTION_REG	

; /GPPU<0> WPU On  #  INTEDG<(1)>°  #  T0CS<0> Fosc/4  #  T0SE<(1)>  # #  PSA<1> WDT  #  PS<000> 1:1	

; 8 MHz & Fosc/4 & WDT 1: 1  »  Ttimer = 500ns  »  TMR0 @ 128µs (= 256 × 500ns)  »	

;  »  T @ 50us  »  TMR0 @ 156 (=(1- 50 / 128) × 256)	

; - - - - - - - - - - - - - - - - - / - - - - - - - - - - - - - - - - - /	
	BANKSEL	OSCCON        	; U_110 R_R_R_0	
	MOVLW  	b'01111001'   	; 0_111 1_0_0_1 - 8MHz	
	MOVWF  	OSCCON	
; b7<(0)>  #  IRCF<111> 8MHz  #  <OSTSS[1]>°° <HTS[0]> <LTS[0]>  #   SCS<1> Internal	
; - - - - - - - - - - - - - - - - - / - - - - - - - - - - - - - - - - - /

° irrelevant X<(n)>
°° read only <X[n]>
Om jag då startar TMR0 på d'156', när det är 50 av 128 µs kvar, så borde T0IF slå till efter 50µs... Eller...?

Typ...

Kod: Markera allt

; - - - - - - - - - - - - - - - - - / - - - - - - - - - - - - - - - - - /	
MOVLW  	b'10100000'	; enable T0IE & disable other IE's -
MOVWF  	INTCON  	   ; - and clear all IF's
MOVLW  	d'156'        ; restart timer zero with -
MOVWF  	TMR0      	 ; - 50µs left to run til T0IF
; - - - - - - - - - - - - - - - - - / - - - - - - - - - - - - - - - - - /	
(Jo, jag vet - det hoppar lite när man skriver till TMR0.
Men det spelar, i detta fall, ingen roll. Alternativt - bortse från det.)


...eller? :humm:

Re: Har jag tänkt rätt här?

Postat: 31 januari 2016, 16:10:55
av Icecap
Jag minns inte om man måste stoppa TMR0 innan man preloader räknarvärdet - men annars har du rätt.

Re: Har jag tänkt rätt här?

Postat: 31 januari 2016, 16:45:48
av Erik M
Bra! :mrgreen: ...och tack! :tumupp:

Kan man alls stoppa TMR0?

Annars är det att den är inhibited två räknesteg när man skriver till den.
Vilket väl betyder att den ska startas på 0x2 för att få en hel cykel...?
Dvs den startas inte på noll vid CLRF TMR0, utan har då redan gjort de två första räknestegen.

Re: Har jag tänkt rätt här?

Postat: 31 januari 2016, 20:25:34
av Icecap
Om den inhibiterer 2 steg när man skriver blir det som: 100 (om man skriver det värde) - 100 - 100 - 101 - 102 - 103...

Re: Har jag tänkt rätt här?

Postat: 31 januari 2016, 20:49:14
av Erik M
Du menar att den hänger å väntar två räknesteg, så en full cykel blir 258, inte 256, räknesteg?
Dvs som jag skrev ovan... Startas TMR0 på 0x2 så blir cykeln 256 räknesteg lång.
inget inget 0x2 0x3 0x4 0x5 ...
Eller klev vi förbi varandra?

Kan man alls stoppa/pausa TMR0?

Re: Har jag tänkt rätt här?

Postat: 31 januari 2016, 21:00:02
av Magnus_K
Du ska kunna stoppa TMR0 genom att toggla T0CS (bit 5) i OPTION_REG.
Mindre bra borde vara att man får låta bli att använda pinne 5 (T0CKI) under den tiden.

Re: Har jag tänkt rätt här?

Postat: 1 februari 2016, 10:29:33
av Erik M
Hm... Jag kan nog inte stoppa, dvs pausa, på det viset, Magnus.
Det enda som händer är att TMR0 inte reagerar på T0CKI.
Eller... Kanske... :humm: :humm: :humm:


Om jag -
- växlar från Internal instruction cycle clock till Transition on T0CKI pin -
- och (som du säger) inte gör något på T0CKI (som får TMR0 att räkna upp) -
- så har vi en pausad TMR0.

Doh! :mrgreen:

Diskussion och framgång i sitt esse! :bravo:

Men... Hur blir det om man samtidigt inte har satt vederbörlig port att vara just T0CKI?
Lyssnar då inte TMR0 på... Ingenting?
Dvs att oavsett vad som händer på den port som kan vara T0CKI så kan det inte läsas av TMR0 då T0CKI, i sig, inte existerar... :humm:

Re: Har jag tänkt rätt här?

Postat: 1 februari 2016, 12:28:19
av Swech
sid 39 i databladet visar hur det ser ut internt.
Saker kan inte sluta existera i processorn.

Swech

Re: Har jag tänkt rätt här?

Postat: 1 februari 2016, 13:24:18
av Erik M
Det är korrekt, men är det relevant här?

Dvs...

Om GP5 är satt som I/O, finns det då någon T0CKI för TMR0 att reagera på?
Det är T0CKI som påverkar TMR0, inte TMR0 som går å kollar hur T0CKI ser ut. Är det väl?

Samt, som det anges:
4.2.5.6GP5/T1CKI/OSC1/CLKIN
Figure 4-6 shows the diagram for this pin.
The GP5 pin is configurable to function as one of the following:
•a general purpose I/O
•a Timer1 clock input
•a crystal/resonator connection
•a clock input
Så är det "To Timer1 or CLKGEN" du syftar på skulle orsaka ett T0CKI från GP5 satt som I/O i kombination med INTOSC?

Re: Har jag tänkt rätt här?

Postat: 1 februari 2016, 18:14:51
av danwi
Men det är väl ändå GP2 som är T0CKI? GP5 är ju T1CKI.

Som jag läser bilden nedan (från sid 37 i databladet) så är pinnen kopplad till Timer0 så fort den inte är satt i analog-läge, allt enligt min toksnygga och mycket professionella röda linje :) Om pinnen är i analog-läge så kommer den interna signalen till Timer0 att vara konstant 0.
PIC16F683 GP2 diagram.png

Re: Har jag tänkt rätt här?

Postat: 1 februari 2016, 19:44:34
av Erik M
(Någon sa GP5, jag antog att vederbörande visste rätt.) :doh:

I övrigt tänker du som jag.
Dvs om T0CKI (vilken det nu är) inte "finns" (som i att porten används till något helt annat) då finns heller inget för TMR0 att erhålla från den.

Ergo...
Om man ställer över TMR0 till att reagera på T0CKI och T0CKI inte "finns", då har man pausat TMR0.

(Om man använder T0CKI är det ingen paus, utan då är det väntan på nästa impuls.
Om man i det läget "tar bort" T0CKI, exempelvis genom att sätta till I/O istället, så har man skapat en pausad TMR0, där med.)


Bra, tack, utklarat. :tumupp:

Re: Har jag tänkt rätt här?

Postat: 1 februari 2016, 20:17:33
av danwi
Nej, det var inte det jag sa. Om Timer 0 är satt att använda T0CKI och den porten inte är satt till analog-läge som kommer timern ticka på utifrån det som händer på pinnen, vare sig det är ditt eget pin-togglande inifrån processorn eller något som är anslutet på utsidan. Om den är satt till utgång så kommer klockningen ske när pinnen togglas inifrån processorn, om den är satt till ingång så kommer klockningen ske när något på utsidan togglar pinnen. Om ingen rör tillståndet på pinnen, då står timern stilla. (Jag bortser från eventuella effekter av att driva en utgång även utifrån, det är både dumt och överkurs :) ) Om du använder porten på annat (icke-analogt) sätt och timern är satt att gå på T0CKI så kommer saker hända i timern. Om du kollar på bilden i mitt förra inlägg så ser du att utgångsdrivaren är kopplad till den punkt mitt röda streck passerar samt att det enda hindret på vägen till "Timer 0"-signalen är grinden som styrs med "analog input mode"-signalen.

Som Swech skriver så kan inget sluta existera i processorn bara för att du ändrar ett register någonstans. Att säga "inte finns" är ett dåligt ordval, säg snarare att signalen inte växlar eller att den är kopplad till ett konstant värde.

Re: PIC Timer - Har jag tänkt rätt här?

Postat: 1 februari 2016, 20:30:32
av Erik M
(OK, användande och bruk av citattecken skiljer sig.)

Du har rätt såtillvida att jag slog ihop när det inte händer något som inte påverkar T0CKI alltför generellt.

Vad tycker MicroChip att de menar den stängda parallellvågen ska representera?

Re: PIC Timer - Har jag tänkt rätt här?

Postat: 1 februari 2016, 20:50:19
av danwi
Jag antar att du menar symbolen på grinden i bilden. Det är standardsymbolen för en Schmittrigger.

Re: PIC Timer - Har jag tänkt rätt här?

Postat: 1 februari 2016, 21:46:10
av Erik M
Jo, så långt var jag nog med.
Men då den är satt på en logikgrind utesluts det.
Nå, ytterligare ett av mysterierna. Månne MicroChip har ihop det med katolska kyrkan...? :yeahright:

Ämnet är besvarat.