Als eerste, hoe stel ik het register CCP1CON in ?
(PIC16F876A)
Moet ik de pulsjes op pen RC0 aansluiten, en timer 1 als asynchron counter instellen ?
Wie moet de interrupt veroorzaken, de puls ingang, of timer 1 ?
'T staat precies beschreven in de datasheet!
RC2 is de inputpin van de CCP.
Timer 1 loopt continu.
Op het moment van de interruptpuls op RC2 wordt de dan actuele waarde van timer1 in de 2 CCPR1-registers overgenomen. Dat gebeurt automatisch (hardwarematig). Jij haalt dat 16bits getal eruit en zet timer1 weer op nul.
Zie ook Application note 594, capture-mode.
http://ww1.microchip.com/downloads/en/AppNotes/00594B.PDF
Timer 1 kan natuurlijk op verschillende snelheden lopen.
Weet je zo een gunstige timer 1 instelling, waarbij er een makelijk te berekenen waarde uit rolt ?
Ja, dat is even uitzoeken. Je moet een waarde zien te vinden waarbij timer1 zeker nog net niet overloopt bij het laagste motortoerental. Dan krijg je de grootste resolutie.
Dus zou je een schatting moeten maken van de lengte van de tijd tussen 2 pulsen. (bij stationair toerental?).
RC2 is de inputpin van de CCP.
Timer 1 loopt continu.
Op het moment van de interruptpuls op RC2 wordt de dan actuele waarde van timer1 in de 2 CCPR1-registers overgenomen. Dat gebeurt automatisch (hardwarematig). Jij haalt dat 16bits getal eruit en zet timer1 weer op nul.
De pulsjes zijn aangesloten op RC2.
Timer 1 is gestart (T1CON.0 = 1).
Wie moet er nu een interrupt veroorzaken.
Ik ben van alle kanten aan het lezen, maar wordt er nog niet echt wijs uit.
Elke keer als er een puls binnenkomt, wordt de CCPIF-flag geset (in PIR1-register).
Je kunt in je progje pollen op dit bit, of wat natuurlijk mooier is,
in je initiatialisatie het CCP1IE-bit setten (capture-compare interrupt enable) zodat er een interrupt komt bij elke puls. Dit bit zit in het PIE1-register.
[Bericht gewijzigd door Zonnepaneeltje op ]
Bit 2 (CCP1IE) van register PIE1 hoog gemaakt, maar er komt geen interrupt.
Waarschijnlijk is het probleem dat de PIC16F876A 2 CCP modules heeft.
Ik het de pulsjes op RC2 aangesloten, moet ik dan CCP2 gebruiken ?
Edit: als proef de pulsjes ook op RC1 aangesloten, maar ook dan komt er geen interrupt.
[Bericht gewijzigd door MMSoft op ]
Leuk he, die PICjes
, vooral als 't niet lukt 
Nee, op het pin-diagram staat dat RC2=CCP1,
RC1=CCP2
Heb je wel de nodige instellingen gemaakt?
TRISC
CCP1CON
GIE-bit
PEIE-bit
De CCPIF-flag moet ook elke keer in de int-routine gecleared worden.
Draai je een simulatie?
[Bericht gewijzigd door Zonnepaneeltje op ]
Geen simulatie, gewoon met een PIC.
In de Interrup routine wordt nu alleen een uitgang geset.
Deze uitgang wordt niet hoog, dus wordt de routine niet aangeroepen !
C2 is een Ingang, dat is dus goed
INTCON.7 = Hoog (GIE-Bit)
INTCON.6 = Hoog (PEIE-Bit)
Hoe ik CCP1CON precies moet instellen weet ik niet, nu is het '00000000'
[Bericht gewijzigd door MMSoft op ]
Bwaaaa, dan staat ie uit.
Kijk even in de datasheet, het gaat alleen om bit3-0 (van CCP1CON).
Je moet kiezen tussen pos. edge triggered en neg. flank triggered. Je kan ook nog kiezen elke 4e puls of elke 16e puls.
[Bericht gewijzigd door Zonnepaneeltje op ]
Ik was al met CCP1CON aan het rommelen geweest.
CCP1CON gewijzigd in 00000101 (Capture mode, every rising edge)
Helaas geen Interrupt.
Edit:
bij 00001011 krijg ik wel een interrupt, zelf al blijft de pin RC2 laag !
[Bericht gewijzigd door MMSoft op ]
jeetje wat een omweg..
zal wel naukeurig zijn, daar niet van..
maar ik zie meer heil in "pulsin low"
( zoals door arjanm geschreven )
een hele kleine progje waar je een exacte
telling uit voort krijgt waar je wat mee kunt..
als aanwijzer van de toeren zou je net als ik,
een stappenmotor kunnen nemen, en die als micro stepper
te gebruiken...
leds kunnen natuurlijk ook, 32 stuks direct gestuurd met een 16f877?
mischien beter om dan een one-shot circuit te gebruiken,
die na elke puls een condensator oplaad.
kun je daarvan de waarde uitlezen...evenredig met het toerental ( denk ik )
en uh.. de meeste moderne benzine motoren hebben geen verdeler meer....
In welke mode moet de CCP staan, Capture mode of Compare mode ?
Edit:
Capture mode dus.
Helaas werkt de CCP module nog niet...
[Bericht gewijzigd door MMSoft op ]
Op 21 januari 2007 19:11:53 schreef burner:
mischien beter om dan een one-shot circuit te gebruiken,
die na elke puls een condensator oplaad.
kun je daarvan de waarde uitlezen...evenredig met het toerental ( denk ik )
De Pic heeft voor dit soort metingen een speciale module aan boord. Dan is 't mijns inziens 't mooiste om zoiets ook in te zetten i.p.v. extra hardware erbij te plaatsen.
'T is ook de 'weg van de minste weerstand'.
Je moet 't toch minstens eerst geprobeerd hebben
.
@ MMSoft: draai 'm eens door MPSIM. Dan kun je zien wat er nog aan schort.
Alleen als ik CCP1CON wijzig in 00001011 krijg ik een interrupt, zelf al blijft de pin RC2 laag !
[Bericht gewijzigd door MMSoft op ]
Ja, dat klopt, want daarmee heb je hem in comparemode/special event trigger gezet.
Ken je de simulator van MPLAB?
[Bericht gewijzigd door Zonnepaneeltje op ]
Het is voor een deel in Basic gemaak.
Basic met een heel stuk ASM.
MPLAB kan hier niet mee overweg.
Heb je toevalling niet een klein voorbeeldje ?
[Bericht gewijzigd door MMSoft op ]
Ik ben nu bezig met het voorbeeld.
Wat is hier de truc van CCP1CON, CCP1M0 (Bit 0 dus) ?
Zie deze regels uit de voorbeeld code:
BTFSS CCP1CON, CCP1M0 ; Check for falling edge watch
BCF CCP1CON, CCP1M0 ; Now capture the trailing edge
BSF CCP1CON, CCP1M0 ; Re-set for trailing edge capture
Hij doet een pulsbreedte meting.
Dat trucje doet hij om de achterflank van de puls te kunnen detecteren.
Misschien een slecht voorbeeld wat dat betreft.
Misschien een slecht voorbeeld wat dat betreft.
Dat tref ik weer 
Edit1:
Ik ga een ASM progje maken, half basic, half ASM is niet echt een succes.
Geef mij maar ASM, en dan zie ik later wel hoe ik hierin met grotere getalen ga/kan werken...
Edit2:
Ik heb nu een ASM progje, de Interrupt wordt in iedergeval opgeroepen.
Nu nog uitzoeken of de CCP de interrupt oproept.
CCPR1L is en blijft 18 (Dec) en CCPR1H is en blijft 0.
[Bericht gewijzigd door MMSoft op ]
Hieronder de code die ik nu heb.
CCPR1L is en blijft 18 (Dec) en CCPR1H is en blijft 0, terwijl de freq. op de ingang wel wordt gewijzigd.
Wie ziet de fout ?
Init
----
BSF TRISB,3 ; CCP1 is an input.
BSF PIE1, CCP1IE ; Enable interrupts from CCP1
CLRF STATUS ; Back to BANK 0
MOVLW B'00000001' ; Enable Timer 1 1:1 Prescale (Timer 1 Aan)
MOVWF T1CON
MOVLW B'00000101' ; Capture mode rising edge
MOVWF CCP1CON
BSF INTCON, PEIE ; Enable Peripheral Interrupts
BSF INTCON, T0IE ; Enable Timer 0 to interrupt
BCF INTCON, T0IF ; Reset flag that indicates interrupt
BSF INTCON, GIE ; Enable interrupts
Interrupt
---------
(eerst W register en Status register bewaren)
MOVWF TEMP_W ;Backup van W-Register ( and STATUS )
MOVF STATUS,W ;Inhoud Status Reg naar W
MOVWF TEMP_S ;Backup van Status Register
BCF STATUS, RP0 ;Select bank 0
BCF STATUS, RP1 ; ' ' ' '
;----
BCF PIR1, CCP1IF ; Re-enable it
MOVF CCPR1L,W ; else store leading edge value
MOVWF Laag ; into 16 bit word LEADING
MOVF CCPR1H,W
MOVWF Hoog
BCF CCP1CON, CCP1M0 ; Now capture the trailing edge
CLRF TMR1L
CLRF TMR1H
;----
(W register en Status register terug zetten)
MOVF TEMP_S,W ;Restore W and STATUS
MOVWF STATUS ;
SWAPF TEMP_W,F ;
SWAPF TEMP_W,W ;
RETFIE ;Einde Interrupt Routine
[Bericht gewijzigd door MMSoft op ]
Op 21 januari 2007 16:50:04 schreef Zonnepaneeltje:
Je stelt hem eenmalig in.
Bij elke puls komt er een interrupt.
In de interrupt haal je de waardes uit de CCPR1L en CCPR1H registers en schrijft die naar je eigen 2 variabelen.
je reset de module en timer1 en verlaat de int-routine.
Hoe reset ik de module ?
Reset de timer.
Zo ?:
;Reset timer1
BCF T1CON,0 ;Stop Timer 1
CLRF TMR1L
CLRF TMR1H
BSF T1CON,0 ;Start Timer 1