PIC12F683 och tidsfördröjningar med TIMER och CCP
PIC12F683 och tidsfördröjningar med TIMER och CCP
Jag är helt ny på denna processorfamilj. Har tidigare hållit på med enbart Motorola/Freescale-processorer och MCU'er tillsammans
med assemblerprogrammering. Jag har valt ut 12F683 och 16F886 som lämpliga för mig att använda till de saker jag behöver MCU'er till
i mina projekt. Jag använder PICkit2 och har kommit igång med 12F683 på ett litet kopplingsdäck och blinkat en lysdiod i 1s ON och 1s OFF
på enklaste sätt med en "vanlig fördröjningsloop".
Till mitt nästa projekt kommer jag att behöva använda de inbyggda timers som finns samt CCP-modulen.
Jag har studerat databladet för PIC12F683 och det är en sak med Compare Mode som jag inte förstår.
Se pdf-sidan 79 i detta datablad
Datablad 12F683
Där beskrivs Compare Mode och i första stycket (11.2) står:
------------------------
When a match occurs, the CCP1 module may:
• Toggle the CCP1 output.
• Set the CCP1 output.
• Clear the CCP1 output.
• Generate a Special Event Trigger.
• Generate a Software Interrupt.
The action on the pin is based on the value of the CCP1M<3:0> control bits of the CCP1CON register.
------------------------
Det är det första alternativet i fetstil, dvs att CCP1-utgången kan/skulle kunna togglas som jag inte inser är möjligt.
På pdf-sidan 77 finns bitkombinationerna för CCP1M<3:0> i CCP1CON-registret men här tycker jag mig inte hitta någon
info om togglingsalternativet.
Att man kan toggla utgången genom att med programkod läsa av statusflaggor eller konfigurera så att interrupt erhålls och att man
i t.ex. ISR-rutinen togglar utgången är trivialt.
"Toggle the CCP1 output" tolkar jag som att det är en inbyggd hårdvarufunktion som automatiskt togglar CCP1-utgången
bara man konfigurerar de nödvändiga registren riktigt.
Kan någon förklara detta så vore jag tacksam!
med assemblerprogrammering. Jag har valt ut 12F683 och 16F886 som lämpliga för mig att använda till de saker jag behöver MCU'er till
i mina projekt. Jag använder PICkit2 och har kommit igång med 12F683 på ett litet kopplingsdäck och blinkat en lysdiod i 1s ON och 1s OFF
på enklaste sätt med en "vanlig fördröjningsloop".
Till mitt nästa projekt kommer jag att behöva använda de inbyggda timers som finns samt CCP-modulen.
Jag har studerat databladet för PIC12F683 och det är en sak med Compare Mode som jag inte förstår.
Se pdf-sidan 79 i detta datablad
Datablad 12F683
Där beskrivs Compare Mode och i första stycket (11.2) står:
------------------------
When a match occurs, the CCP1 module may:
• Toggle the CCP1 output.
• Set the CCP1 output.
• Clear the CCP1 output.
• Generate a Special Event Trigger.
• Generate a Software Interrupt.
The action on the pin is based on the value of the CCP1M<3:0> control bits of the CCP1CON register.
------------------------
Det är det första alternativet i fetstil, dvs att CCP1-utgången kan/skulle kunna togglas som jag inte inser är möjligt.
På pdf-sidan 77 finns bitkombinationerna för CCP1M<3:0> i CCP1CON-registret men här tycker jag mig inte hitta någon
info om togglingsalternativet.
Att man kan toggla utgången genom att med programkod läsa av statusflaggor eller konfigurera så att interrupt erhålls och att man
i t.ex. ISR-rutinen togglar utgången är trivialt.
"Toggle the CCP1 output" tolkar jag som att det är en inbyggd hårdvarufunktion som automatiskt togglar CCP1-utgången
bara man konfigurerar de nödvändiga registren riktigt.
Kan någon förklara detta så vore jag tacksam!
Re: PIC12F683 och tidsfördröjningar med TIMER och CCP
Ja, jag får samma "känsla" som dig. Jag antar att du menar de två alternativen :
Där saknas men ju ett "toggle output on match" alternativ. Hm...
Kan vara ett kreativt användande av begreppet "toggle".
Man skulle kunna köra lite tester i MPSIM om man bara kommer
på några bra tester att köra...
Det enda jag kommer på på rak arm är ett CCP1IF interrupt som
togglar CCP1M0...
Kod: Markera allt
1000 = Compare mode, set output on match (CCP1IF bit is set)
1001 = Compare mode, clear output on match (CCP1IF bit is set)
Kan vara ett kreativt användande av begreppet "toggle".

Man skulle kunna köra lite tester i MPSIM om man bara kommer
på några bra tester att köra...
Det enda jag kommer på på rak arm är ett CCP1IF interrupt som
togglar CCP1M0...
Re: PIC12F683 och tidsfördröjningar med TIMER och CCP
Roade mig med att kolla 16F690 databladet och det är lika illa där..
Re: PIC12F683 och tidsfördröjningar med TIMER och CCP
Jag har lagt en fråga på PICLIST om detta.
Återkommer med resultatet...
Återkommer med resultatet...
Re: PIC12F683 och tidsfördröjningar med TIMER och CCP
Jag har jobbat vidare med detta och har tittat i databladet för PIC16F886.
se pdf-sidan 126 i detta datablad:
Datablad PIC16F886
-------------------------------------
CCP1M<3:0>: ECCP Mode Select bits
0000 = Capture/Compare/PWM off (resets ECCP module)
0001 = Unused (reserved)
0010 = Compare mode, toggle output on match (CCP1IF bit is set)
...
osv
-------------------------------------
Där ser man att bitkombinationen 0010 finns med som en giltig kombination med togglefunktionen! (samma gäller för PIC16F690...ToPNoTCH?)
Motsvarande bitkombination för PIC12F683 har betydelsen "Unused (reserved)"
PIC16F886 (och även PIC16F690) har en ECCP-modul medan PIC12F683 har en CCP-modul.
Jag har inte hunnit läsa in mig på vad skillnaden mellan dessa moduler är.
Undrar vad som gäller för PIC12F683?
Antingen stämmer textinformationen, dvs att den har kapacitet att "Toggle the CCP1 output" och att det är möjligt via något "knep"
som jag inte förstår eller har man i datablabladet glömt att ta bort denna textinformation och bitkombinationslistan och dess betydelse är korrekt.
Det skulle också kunna vara så att bitkombinationslistan och dess betydelse är felaktig, dvs att kombinationen 0010 faktiskt är en giltig kombination
även för PIC12F683. Jag får nog ta och göra ett experiment med den bikombinationen och se vad som händer!
sodjan: Tack för att du ställde frågan. Ska bli intressant att se om vi får några svar!
se pdf-sidan 126 i detta datablad:
Datablad PIC16F886
-------------------------------------
CCP1M<3:0>: ECCP Mode Select bits
0000 = Capture/Compare/PWM off (resets ECCP module)
0001 = Unused (reserved)
0010 = Compare mode, toggle output on match (CCP1IF bit is set)
...
osv
-------------------------------------
Där ser man att bitkombinationen 0010 finns med som en giltig kombination med togglefunktionen! (samma gäller för PIC16F690...ToPNoTCH?)
Motsvarande bitkombination för PIC12F683 har betydelsen "Unused (reserved)"
PIC16F886 (och även PIC16F690) har en ECCP-modul medan PIC12F683 har en CCP-modul.
Jag har inte hunnit läsa in mig på vad skillnaden mellan dessa moduler är.
Undrar vad som gäller för PIC12F683?
Antingen stämmer textinformationen, dvs att den har kapacitet att "Toggle the CCP1 output" och att det är möjligt via något "knep"
som jag inte förstår eller har man i datablabladet glömt att ta bort denna textinformation och bitkombinationslistan och dess betydelse är korrekt.
Det skulle också kunna vara så att bitkombinationslistan och dess betydelse är felaktig, dvs att kombinationen 0010 faktiskt är en giltig kombination
även för PIC12F683. Jag får nog ta och göra ett experiment med den bikombinationen och se vad som händer!
sodjan: Tack för att du ställde frågan. Ska bli intressant att se om vi får några svar!
Re: PIC12F683 och tidsfördröjningar med TIMER och CCP
Japp, det ser nu ut som att detta är en skillnad på CCP (com t.ex 12F683 har)
och ECCP modulen (som t.ex 12F1822/23 har).
Så om detta är kritiskt, så förslår jag ett byte till 12F1822/23.
De har en massa andra finesser jämfört med 12F683...
Svaren på PICLIST pekar för övrigt i samma riktning.
och ECCP modulen (som t.ex 12F1822/23 har).
Så om detta är kritiskt, så förslår jag ett byte till 12F1822/23.
De har en massa andra finesser jämfört med 12F683...
Svaren på PICLIST pekar för övrigt i samma riktning.

Re: PIC12F683 och tidsfördröjningar med TIMER och CCP
Jag har ett gäng 12F1840 (enda skillnaden mot 12F1822 är dubbelt med flashminne)
liggandes. Maila en adress så postar jag 2 st ifall du är intresserad...
liggandes. Maila en adress så postar jag 2 st ifall du är intresserad...
Re: PIC12F683 och tidsfördröjningar med TIMER och CCP
Den här togglingsfunktionen är inte på något sätt kritisk för det jag har tänkt använda 12F683 till men jag är ändå intresserad av 12F1840.
Jag mailar min adress till dig.
Tittade lite snabbt på Microchips "förstasida" för PIC12F1840 och PIC12F1822 för att se vilken typ av utrustning som krävs
för att programmera den. Där nämns "Debug and programming support is available via PICkit™ 3, and MPLAB® ICD 3".
Jag har bara en PICkit2 köpt år 2009. Frågan är om den går att använda tillsammans med PIC12F1840?
Jag mailar min adress till dig.
Tittade lite snabbt på Microchips "förstasida" för PIC12F1840 och PIC12F1822 för att se vilken typ av utrustning som krävs
för att programmera den. Där nämns "Debug and programming support is available via PICkit™ 3, and MPLAB® ICD 3".
Jag har bara en PICkit2 köpt år 2009. Frågan är om den går att använda tillsammans med PIC12F1840?
Re: PIC12F683 och tidsfördröjningar med TIMER och CCP
Ja. Se device support sidan för PICkit2 och sök efter "1840" :
http://www.microchip.com/stellent/idcpl ... e=en027813
http://www.microchip.com/stellent/idcpl ... e=en027813
Re: PIC12F683 och tidsfördröjningar med TIMER och CCP
Jaha se där....Jag fick för mig att alla comparemodes låg efter varandra i listan (som capture & PWM gör), men precis som du noterade fanns det med tydligen.Ronny skrev: Där ser man att bitkombinationen 0010 finns med som en giltig kombination med togglefunktionen! (samma gäller för PIC16F690...ToPNoTCH?)
Re: PIC12F683 och tidsfördröjningar med TIMER och CCP
Angående skillnader mellan ECCP och CCP.
--------------------------
The Enhanced CCP (ECCP), available on some of Microchip’s devices, differs from
the regular CCP module in that it provides enhanced PWM functionality – namely,
full-bridge and half-bridge support, programmable dead-band delay and enhanced
PWM auto-shutdown.
---------------------------
Ovanstående saxat från pdf-sidan 31 i detta dokument
Compiled Tips and Tricks Guide
Sedan kanske det finns ytterligare skillnader som inte betraktas som "enhanced features" och därför inte lyfts
fram. Möjligen skulle den där togglingsfunktionen vid Compare Mode kunna vara en sådan skillnad.
Jag har i alla fall vid mina sökningar inte sett något Microchipdokument där man nämner detta.
Har noterat att det på Microchips produktsida för PIC12F683
finns Errata för Timer1: Timer1 Module Data Sheet Errata (Last Updated: 03/08/2010)
med det innehåller inget som har med togglingsfunktionen att göra.
Det finns också en PIC12F683 Rev. A Silicon/Data Sheet Errata Last Updated: 05/07/2007)
I det dokumentet nämns ECCP (inte CCP??)....för en 12F683...
Databladet på Microchips produktsida för PIC12F683 är "Last Updated: 02/19/2007" och revision D.
Jag ska testa själv på min 12F683 med den icke, enligt databladet, implementerade bitkombinationen för att se om utgången togglar.
--------------------------
The Enhanced CCP (ECCP), available on some of Microchip’s devices, differs from
the regular CCP module in that it provides enhanced PWM functionality – namely,
full-bridge and half-bridge support, programmable dead-band delay and enhanced
PWM auto-shutdown.
---------------------------
Ovanstående saxat från pdf-sidan 31 i detta dokument
Compiled Tips and Tricks Guide
Sedan kanske det finns ytterligare skillnader som inte betraktas som "enhanced features" och därför inte lyfts
fram. Möjligen skulle den där togglingsfunktionen vid Compare Mode kunna vara en sådan skillnad.
Jag har i alla fall vid mina sökningar inte sett något Microchipdokument där man nämner detta.
Har noterat att det på Microchips produktsida för PIC12F683
finns Errata för Timer1: Timer1 Module Data Sheet Errata (Last Updated: 03/08/2010)
med det innehåller inget som har med togglingsfunktionen att göra.
Det finns också en PIC12F683 Rev. A Silicon/Data Sheet Errata Last Updated: 05/07/2007)
I det dokumentet nämns ECCP (inte CCP??)....för en 12F683...
Databladet på Microchips produktsida för PIC12F683 är "Last Updated: 02/19/2007" och revision D.
Jag ska testa själv på min 12F683 med den icke, enligt databladet, implementerade bitkombinationen för att se om utgången togglar.
Re: PIC12F683 och tidsfördröjningar med TIMER och CCP
Ja, det kan ju hända att funktionen var planerad men sedan inte visade
sig vara helt stabil eller något liknande och det hela slutade med en
motsägelse i databladet. Lite underligt att ingen har noterat detta
tidigare...
En annan sak är hur MPSIM reagerar på "toggle" inställningen...
sig vara helt stabil eller något liknande och det hela slutade med en
motsägelse i databladet. Lite underligt att ingen har noterat detta
tidigare...
En annan sak är hur MPSIM reagerar på "toggle" inställningen...

Re: PIC12F683 och tidsfördröjningar med TIMER och CCP
Här är ett utdrag ur databladet för 12F683 och jag har testat bitkombinationen 0010 för att se vad som händer
på verklig hårdvara (har inte provat simulatorn). Använder en 12F683 inköpt samtidigt som min PICkit2 ungefär år 2009.
-----------------------------------------
CCP1M<3:0>: CCP Mode Select bits
0000 = Capture/Compare/PWM off (resets CCP module)
0001 = Unused (reserved)
0010 = Unused (reserved)
0011 = Unused (reserved)
0100 = Capture mode, every falling edge
0101 = Capture mode, every rising edge
0110 = Capture mode, every 4th rising edge
0111 = Capture mode, every 16th rising edge
1000 = Compare mode, set output on match (CCP1IF bit is set)
1001 = Compare mode, clear output on match (CCP1IF bit is set)
1010 = Compare mode, generate software interrupt on match (CCP1IF bit is set, CCP1 pin is unaffected)
1011 = Compare mode, trigger special event (CCP1IF bit is set, TMR1 is reset and A/D conversion is started if the ADC module is enabled. CCP1 pin is unaffected.)
110x = PWM mode active-high
111x = PWM mode active-low
-----------------------------------------
Jag provade först den giltiga bitkombinationen 1000 och därefter 1001 med några olika kombinationer av registerinnehåll i CCPR1 och TMR1 för att vara säker på att
programmet var OK. En lysdiod och strömbegränsningsmotstånd var i detta fall kopplad mellan GP2/CCP1 (pin5) och GND.
Interna oscillatorn (HFINTOSC) användes och postscaler/mux ställdes in så att INTOSC= 2 MHz -> 500 kHz system clock -> 2 us cykeltid
Timer1 prescaler inställd på division med 8 -> Timer1 stegar upp med 1 var 16:e mikrosekund.
Bitkombinationerna 1000 och 1001 gav program som fungerade helt enligt plan.
Bitkombinationen ändrades till 0010 (alltså den som är Unused (reserved) i databladet).
Nu blinkade LED med uppskattningsvis 0.5 Hz frekvens (kontinuerligt ca. 1 sekund ON / 1 sekund OFF k, 50% pulskvot)
Tidmätning med oscilloskop gav ON-tiden = 1.05 sekunder (samma för OFF-tiden).
Detta motsvarar tiden för en komplett 16-bitars genomlöpning av Timer1: 65536*2*8 us = 1.049 sekunder.
Det gick inte att påverka denna tid på något sätt genom att justera värdena i registrena CCPR1 och TMR1.
CCP1-utgången togglades inte under den första genomlöpningen av TMR1 (efter reset och uppstart av MCU'n) då den matchade innehållet i CCPR1 vilket borde vara
den normala funktionen.
Bitkombinationen 0010 gav alltså på mitt exemplar av 12F683 en toggling av CCP1-utgången men inte med riktig funktionalitet.
Det skulle också mycket väl kunna vara så att om man provade ovanstående på några olika "kiselrevisioner" av 12F683 kan man få ett annat resultat är det jag fick.
Min slutsats av detta experiment är att den där textinformationen "Toggle the CCP1 output." i databladet (första stycket avsnitt 11.2) borde tas bort, dvs. 12F683
har inte denna togglefunktionalitet och listan med bitkombinationer (CCP1M<3:0>: CCP Mode Select bits) är korrekt.
sodjan: Ja, jag tror att det kan hänga ihop på det sättet du beskriver.
på verklig hårdvara (har inte provat simulatorn). Använder en 12F683 inköpt samtidigt som min PICkit2 ungefär år 2009.
-----------------------------------------
CCP1M<3:0>: CCP Mode Select bits
0000 = Capture/Compare/PWM off (resets CCP module)
0001 = Unused (reserved)
0010 = Unused (reserved)
0011 = Unused (reserved)
0100 = Capture mode, every falling edge
0101 = Capture mode, every rising edge
0110 = Capture mode, every 4th rising edge
0111 = Capture mode, every 16th rising edge
1000 = Compare mode, set output on match (CCP1IF bit is set)
1001 = Compare mode, clear output on match (CCP1IF bit is set)
1010 = Compare mode, generate software interrupt on match (CCP1IF bit is set, CCP1 pin is unaffected)
1011 = Compare mode, trigger special event (CCP1IF bit is set, TMR1 is reset and A/D conversion is started if the ADC module is enabled. CCP1 pin is unaffected.)
110x = PWM mode active-high
111x = PWM mode active-low
-----------------------------------------
Jag provade först den giltiga bitkombinationen 1000 och därefter 1001 med några olika kombinationer av registerinnehåll i CCPR1 och TMR1 för att vara säker på att
programmet var OK. En lysdiod och strömbegränsningsmotstånd var i detta fall kopplad mellan GP2/CCP1 (pin5) och GND.
Interna oscillatorn (HFINTOSC) användes och postscaler/mux ställdes in så att INTOSC= 2 MHz -> 500 kHz system clock -> 2 us cykeltid
Timer1 prescaler inställd på division med 8 -> Timer1 stegar upp med 1 var 16:e mikrosekund.
Bitkombinationerna 1000 och 1001 gav program som fungerade helt enligt plan.
Bitkombinationen ändrades till 0010 (alltså den som är Unused (reserved) i databladet).
Nu blinkade LED med uppskattningsvis 0.5 Hz frekvens (kontinuerligt ca. 1 sekund ON / 1 sekund OFF k, 50% pulskvot)
Tidmätning med oscilloskop gav ON-tiden = 1.05 sekunder (samma för OFF-tiden).
Detta motsvarar tiden för en komplett 16-bitars genomlöpning av Timer1: 65536*2*8 us = 1.049 sekunder.
Det gick inte att påverka denna tid på något sätt genom att justera värdena i registrena CCPR1 och TMR1.
CCP1-utgången togglades inte under den första genomlöpningen av TMR1 (efter reset och uppstart av MCU'n) då den matchade innehållet i CCPR1 vilket borde vara
den normala funktionen.
Bitkombinationen 0010 gav alltså på mitt exemplar av 12F683 en toggling av CCP1-utgången men inte med riktig funktionalitet.
Det skulle också mycket väl kunna vara så att om man provade ovanstående på några olika "kiselrevisioner" av 12F683 kan man få ett annat resultat är det jag fick.
Min slutsats av detta experiment är att den där textinformationen "Toggle the CCP1 output." i databladet (första stycket avsnitt 11.2) borde tas bort, dvs. 12F683
har inte denna togglefunktionalitet och listan med bitkombinationer (CCP1M<3:0>: CCP Mode Select bits) är korrekt.
sodjan: Ja, jag tror att det kan hänga ihop på det sättet du beskriver.
Re: PIC12F683 och tidsfördröjningar med TIMER och CCP
Intressant test. Man lär sig väldigt mycket praktiskt av sådana där tester.
Jag har inte hunnit posta de två 12F1840 som jag lovade under helgen.
Fixar det på måndagen...
Jag har inte hunnit posta de två 12F1840 som jag lovade under helgen.
Fixar det på måndagen...
Re: PIC12F683 och tidsfördröjningar med TIMER och CCP
> Fixar det på måndagen...
Jahaja, det glömde jag så klart.
*Nu* är de packade och postas senare under e.m.
Jahaja, det glömde jag så klart.

*Nu* är de packade och postas senare under e.m.