sjors007
...
@JoWi
ik wil sowieso een extern kristal gebruiken!
maar hoe werkt het dan als je TMR2 gaat gebruiken? wat komt er anders te staan in je programma?
ieder geval bedankt voor deze informatie, ik had al meerder topics gelezen dat TMR0 eigenlijk niet helemaal de oplossing was omdat je prescaler weer moet resetten enzo.
MVG Sjors
Gewoon in de datasheet onder het kopje timer 2 kijken naar de nodige instellingen. Als timer0 lukt moet 2 ook lukken.
sjors007
...
ik heb gekeken maar ik kan niet echt iets duidelijk vinden over pre- en post- scaler! hoe ik dat moet instellen
Maximaal kan je tot 2^16 tellen. Dus 1 interrupt per seconde ga je niet redden. Dan is het zaak een waarde te kiezen die exact past in 1 seconde.
Bijvoorbeeld voor een 4MHz kristal (1usec/tick) kies je 40 milliseconden, dan heb je exact 25 interrupts per seconde. De prescaler zet je op 1:16, de periodecount op 250 en de postscaler op 10 (16*250*10 = 40.000 usec).
Je moet dus T2CON, PR2, INTCON enzo met de juiste bitjes laden, en in het datasheet staat welke bitjes dat zijn.
benleentje
Golden Member
Als je een klok wilt kan je de cpu gewoon op de interne iscilator van 4mHz laten lopen. Op de ra4 sluit je dan een kristal van 32.768Hz aan.
Ik zeg uit mijn hoofd ra4 maar kijk even voor de specifieke specs voor een low freq kristal aansluiten.
Het programma werkt dus op 4mhz en de timer ingang krijgt zijn pulzen van het kristal.
Klok-en-klepel verhaal ?
LP kristallen gebruik je in combinatie met TMR1 en sluit je aan op RB6&RB7. Je krijgt dan 1 interrupt per 2 seconden, niet per seconde (zonder reloads van de timer).
sjors007
...
hallo iedereen,;d
ik heb even in de datasheet gekeken en ik dacht misschien moet het zo:
T2CON<1:16> ;hiermee stel ik de prescaler in
helaas kom ik niet verder:S ik kom niks tegen over periode count of hoe je je postscaler moet instellen (welke commando's dat zijn)
en moet ik hier nog wat veranderen? (dit gebruikte ik voor timer0)
Symbol GIE = INTCON.7 ;global interrupt enable
Symbol T0IE = INTCON.5 ;TMR0 overflow interrupt enable
Symbol T0IF = INTCON.2 ;TMR0 overflow interrupt flag bit
Symbol PS0 = OPTION_REG.0 ;Prescaler ratio bit-0
Symbol PS1 = OPTION_REG.1 ;Prescaler ratio bit-1
Symbol PS2 = OPTION_REG.2 ;Prescaler ratio bit-2
Symbol PSA = OPTION_REG.3 ;Prescaler Assignment
Symbol T0CS = OPTION_REG.5 ;Timer0 Clock Source Select
...
TRISA = ???
TRISB = ???
...
On_interrupt GoTo Klok
GIE = 0 ;disable all global interrupts
PSA = 0 ;Assign the prescaler to oscillator
PS0 = 0 ;Set the prescaler
PS1 = 0 ;to increment TMR0
PS2 = 0 ;every 2nd instruction cycle
T0CS = 0 ;Assign TMR0 clock to internal source
T0IE = 1 ;TMR0 overflow interrupt enable
T0IF = 1 ;TMR0 overflow interrupt flag bit
GIE = 1 ;enable all global interrupts
TMR0 = 0 ;zet tmr0 op 0
GoTo loop
Klok:
...
T0IF=0
Context Restore
loop:
...
ieder geval bedankt voor de hulp
MVG Sjors
Je moet alles veranderen. Dat is voor timer0, jij hebt timer 2.
Pak de datasheet, kijk welke registers er gebruikt worden. Herschrijf het symbol gedeelte in je programma. Eigenlijk alles wat je nu hebt weg gooien en het goed in de plaats zetten.
symbol naam = register.bit
Dat haal je allemaal uit de datasheet.
Dan kijk je in de datasheet wat je allemaal in moet stellen om timer2 werkend te krijgen, er staat een lijstje in dat je moet volgen.
Al die instellingen doe je dan in je programma en klaar.
sjors007
...
@Bas Smit
als ik hier naar kijk, moet ik dan opgegeven de
Intcon
PIR
PIE
TMR2
T2CON
PR2
dat is alles? er moeten wel nog dingen bij maar in de grote lijnen is dit alles?
http://ww1.microchip.com/downloads/en/DeviceDoc/31013a.pdf hier is de datasheet die ik gebruik.
13.3 Timer Clock Source
Name Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
INTCON GIE PEIE T0IE INTE RBIE T0IF INTF RBIF
PIR TMR2IF
(1)
0 0
PIE TMR2IE
(1)
0 0
TMR2 Timer2 module’s register
0000 0000 0000 0000
T2CON — TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0
-000 0000 -000 0000
PR2 Timer2 Period Register
1111 1111 1111 1111
MVG Sjors
benleentje
Golden Member
FOei foei toch is dit nu de datasheet van je cpu. volgens mij niet dit is een family datasheet. haal de goede er eens bij.
Kijk eens bij 13.1 daar staat het blokschema.
links zie je Fosc/4. Dit is dus je kristal of interne klok / 4. Bv 4MhZ /4 = 1MhZ. Dit is dan het ingangs signaal. om nu niet 4000 int/ sec te krijgen kan je de prescaler aanzetten. Hoeft niet. Als de prescaller 1:1 staat komt der een 1MhZ signaal het TMR2reg binnen.
Verder zie je nog een pr2reg en comperator staan. de comperator vergelijkt continu de 2 registers tmr2 en pr2.
Zet je in pr2 het getal 250 dan geeft de comperator een uitgaande puls waarneer tmr2 ook 250 is. Je zal voor 1 sec 4000x een interrupt krijgen. zet je de postscaler op 16 dan krijgt je 250 int/sec. 250 past ook mooi in 1 byte.
[Bericht gewijzigd door benleentje op (55%)]
Je moet beginnen met de goede datasheet pakken. Pak de datasheet van de pic die je gebruikt, en niks anders.
Voorbeeld voor de 628a.
Eerst kijken we hoe de timer werkt. Dan zien we dat er 3 belangrijke dingen zijn. Prescaler, postscaler en het PR2 reg.
Op de volgende pagina staat de indeling van het T2CON register. Daarin kan je de pre/post scaler instellen, en kiezen of de timer aan staat. Kiezen of de timer aan/uit staat is handig dus die zetten we in de lijst met symbols, pre/post scaler stel je meestal maar 1x in.
Daaronder staat een lijst met alle registers die ingestel moeten worden.
GIE, PEIE, TMR2IF, TMR2IE, T2CON en PR2. Behalve de laaste 2 komen die ook bij de symbosl.
Dus
symbol GIE = INTCON.7
symbol PEIE = INTCON.6
symbol TMR2IF = doe de rest zelf
Daarna moeten we de registers instellen.
T2CON = %01111001 '1:16 post TMR2of 1:4 pre
TMR2IF = 0
PR2 = 127 'zelf kiezen
TMR2IE = 1
PEIE = 1
GIE = 1
TMR2ON = 1
En dan alles samenvoegen in een programma.
sjors007
...
Hallo,
ik lees in de datasheet dat je je postscaler alleen op 1:1, 1:4 en 1:16 kan zetten, maar een paar posts eerder vertelde Jowi dat je hem ook op 10 kan zetten, Kan dat of niet??
en eerlijk gezegd kom ik er nog niet uit:-(
[Bericht gewijzigd door sjors007 op (11%)]
De POST scaler kan je instellen op elke waarde tussen 1:1 en 1:16. Dat is dus hoeveel keer de teller rondloopt voordat hij een interrupt genereert. De PRE scaler kan je instellen op 1:1, 1:4 en 1:16.
[Bericht gewijzigd door JoWi op (15%)]
sjors007
...
ik kijk nu in de datasheet en daar zie ik dat tabelletje staan. dan kijk ik bij Intcon en zie daar allemaal dingen met een bit erboven, welke moet ik nou kiezen of moet ik ze allemaal?
en dat is hetzelfde als bij PIR1, PIE1, TMR2, T2CON en pr2 ik weet niet welke ik allemaal moet hebben en niet?|:(
In de datasheet bij timer2 staat een tabel met alle registers die je moet hebben.
Met een beetje logisch nadenken kom je er ook.
2bits uit PIE
bit 6 CMIE: Comparator Interrupt Enable bit
1 = Enables the comparator interrupt
0 = Disables the comparator interrupt
bit 5 RCIE: USART Receive Interrupt Enable bit
1 = Enables the USART receive interrupt
0 = Disables the USART receive interrupt
Je gebruikt de usart niet. Dus je hebt 2 opties. Je pakt alleen de bits uit PIE die nodig hebt (symbol TMR2IE = PIE1.1) of je zet alles wat je niet gebruikt op disable PIE1 = %00000010.
benleentje
Golden Member
bit 7 Unimplemented: Read as '0'
bit 6:3 TOUTPS3:TOUTPS0: Timer2 Output Postscale Select bits
0000 = 1:1 Postscale
0001 = 1:2 Postscale
-
-
-
1111 = 1:16 Postscale
bit 2 TMR2ON: Timer2 On bit
1 = Timer2 is on
0 = Timer2 is off
bit 1:0 T2CKPS1:T2CKPS0: Timer2 Clock Prescale Select bits
00 = Prescaler is 1
01 = Prescaler is 4
1x = Prescaler is 16Deze bedoel je dus. een register bestaat uit 1 byte. alleen heeft in dit byte elke bit of groep bits een andere betekenis.
bit7 wordt dus niet gebruikt.
bit6:3 is dus bit3, 4, 5 en 6. dit zijn4 bits waarmee je de postscaler mee instelt. 4 bits zijn dus 16 mogelijkheden.
post betekend na. waar pre dus voor betekend. deze nadeler kun je dus instellen tussen 1 en 16. dus ook op 10 of op 9.
de prescaler kan je maar op 1, 4 of 16 instellen omdat er hier maar 2 bits gebruikt worden en er dus max 4 mogelijkheden zijn
sjors007
...
ik snap alleen niet welke dingen je nodig heb en wat daar achter moet, zoals intcon.7 enzo.
kan iemand niet gewoon er eentje maken voor mij die zoveel interrupts per seconden geeft
ieder geval bedankt voor alle informatie
MVG Sjors
benleentje
Golden Member
Natuurlijk tegen 500,- /uur maak ik alles voor je. Maar dan zie je alleen een hexfile en geen broncode.
Intcon is een register. Een register is verder niets anders dan een geheugenplaats maar dan wel 1 met een speciale functie. Het zijneigenlijk schakelaars.
Intcon.7 = bit nr 7 of achste bit van het register daar kan enkel 0 of 1 in. Als je deze schakelaar aan wilt zet je er een 1 in.
Op 10 mei 2009 19:59:01 schreef sjors007:
ik snap alleen niet welke dingen je nodig heb en wat daar achter moet, zoals intcon.7 enzo.
Nog 1x dan. Je pakt http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en010210.
Je gaat naar het stukje timer 2 en dan naar de laatste pagina daarvan (53). Daar staat een tabel met alle registers die nodig zijn voor timer2. De bits die GRIJS zijn hoef je NIET te veranderen.
We zien
INTCON
PIR1
PIE1
TMR2
T2CON
TR2
Van intcon zijn bits 7 en 6 wit, de rest grijs. Dus we gaan naar paragraaf 4.2.2.3(24) en zien daar het intcon register.
bit 7 GIE: Global Interrupt Enable bit
1 = Enables all un-masked interrupts
0 = Disables all interrupts
bit 6 PEIE: Peripheral Interrupt Enable bit
1 = Enables all un-masked peripheral interrupts
0 = Disables all peripheral interrupts
We willen alleen die 2 veranderen, dus die zetten we bij de symbols zodat we die makkelijk kunnen veranderen.
DUS
SYMBOL GIE = INTCON.7 (incon register bit 7)
SYMBOL PEIE = INTCON.6
Dan naar het volgend register PIR1 4.2.2.5(26). Daarvan volgens de tabel alleen bit 1.
TMR2IF: TMR2 to PR2 Match Interrupt Flag bit
1 = TMR2 to PR2 match occurred (must be cleared in software)
0 = No TMR2 to PR2 match occurred
Omdat we er maar 1 willen veranderen en niet het hele register zetten we deze ook tussen de symbols. Dus
SYMBOL TMR2IF = PIR1.1
Hetzelfde doe je voor de rest van de registers. Een register zoals T2CON moet je in zijn geheel instellen dus die zet je niet tussen de symbols.
Nadat je ze allemaal af gegaan bent moet je ze instellen. Dat kan je uit de datasheet aflezen.
Bijvoorbeeld GIE die moet 1 zijn, anders staan de interrupts uit. Maar TMR2IF moet weer 0 zijn, want dat is de flag die geset wordt bij ene interrupt.
sjors007
...
Hallo iedereen,
ik heb deze week een beetje lopen stoeienen, en ben tot het volgende gekomen
SYMBOL GIE = INTCON.7
SYMBOL PEIE = INTCON.6
Symbol T0IF = INTCON.2
SYMBOL TMR2IF = PIR1.1
symbol TMR2ie = pie1.1dit zijn me registers
TMR2IF = 0
PR2 = 250
TMR2IE = 1
PEIE = 1
GIE = 1
dit zijn me instelingen, ik kom alleen nog niet uit die T2CON. Moet je bij T2CON bit0 t/m bit6 instellen..??
of moet je t2con eerst nog invoegen bij je symbols
dus
symbol T2CKPS0 = T2CON.0
symbol T2CKPS1 = T2CON.1
symbol TMR2ON = T2CON.2
enzo..
en dan nog bij je instellingen
TMR2ON = 1en de pre- en post scaler
MVG Sjors
sjors007
...
de postscaler hoe hoe reken je uit hoe die op 10 komt?
ik zie dat bij postscaler 1:1 = 0000 en bij 1:16 = 1111 hoe is ie dan bij 1:10 = ????
Iemand?
MVG Sjors
0000 = 0 -> 1:1
0010 = 2 -> 1:3
1111 = 15 -> 1:16
Dus. 1:10 is 9 -> binair, 1001.
T2CON kan je in een keer in stellen door T2CON = xxx. Of elk bit bij de symbols zetten en die dan appart instellen.