CCPR1L:CCP1CON<5:4> = ???
Re: CCPR1L:CCP1CON<5:4> = ???
Det är helt riktigt, MC avrundat genom att rotera åt höger och maska bort lika mycket till vänster.
Vilket ger att den andra någorlunda lätt tillgängliga upplösningen, bredvid tio bitar (vilket är åtta bitar rent praktiskt), är... sex bitar. För där kan man någorlunda enkelt swapf nibblarna - eller tänka 0-F redan från början.
Fem bitar ser sedan iofs mer ut som typ fem och en halv bitar, när den förfaller maxa på 0x0A och inte på 0x07.
Nå, det går framåt. Tack.
Vilket ger att den andra någorlunda lätt tillgängliga upplösningen, bredvid tio bitar (vilket är åtta bitar rent praktiskt), är... sex bitar. För där kan man någorlunda enkelt swapf nibblarna - eller tänka 0-F redan från början.
Fem bitar ser sedan iofs mer ut som typ fem och en halv bitar, när den förfaller maxa på 0x0A och inte på 0x07.
Nå, det går framåt. Tack.
Re: CCPR1L:CCP1CON<5:4> = ???
> MC avrundat genom att rotera åt höger och maska bort
> lika mycket till vänster.
Kan du visa ett exempel på vad du menar? Vad är "MC"?
Varför ska något "avrundas"?
Varför är 10 bitar "8 bitar rent praktiskt"? För att två ligger
i ett annat register? Vad (vilket register) ska man SWAPF'a?
> Fem bitar ser sedan iofs mer ut som typ fem och en halv bitar,
Ja, bit-beräkningen (enligt databladet) går ju inte alltid jämt ut.
Jag tror att jag skrev att det med dina parametrar blir lite drygt
5 bitar, vilket betyder att max period inte är en jämn potens av 2.
> lika mycket till vänster.
Kan du visa ett exempel på vad du menar? Vad är "MC"?
Varför ska något "avrundas"?
Varför är 10 bitar "8 bitar rent praktiskt"? För att två ligger
i ett annat register? Vad (vilket register) ska man SWAPF'a?
> Fem bitar ser sedan iofs mer ut som typ fem och en halv bitar,
Ja, bit-beräkningen (enligt databladet) går ju inte alltid jämt ut.
Jag tror att jag skrev att det med dina parametrar blir lite drygt
5 bitar, vilket betyder att max period inte är en jämn potens av 2.
Re: CCPR1L:CCP1CON<5:4> = ???
Så om jag vill använda en variabel som är lätt att bearbeta, dvs åtta bitar,
att stoppa in i en PWM duty cycle som rullar på sex bitar så borde följande kod/macro kunna funka...?
¹Fltrixnosse anställt ock arbetsivragnde.
Fungerar denna del?
Dvs till att stoppa in Power<7:4> i CCPR1L<3:0> och Power<3:2> i CCP1CON<5:4>?
Hur kan den förkortas...?
att stoppa in i en PWM duty cycle som rullar på sex bitar så borde följande kod/macro kunna funka...?
Kod: Markera allt
; - - - - - - - - - - - - - - - -
; Power is a six bit PWM Duty Cycle value set as
; an eight bit shifted two left for easier running adjustment.
; From this the high nibble is put in CCPR1L -> b'----HHHH',
; bits <3:2> is put into CCP1CON<5:4> -> b'--LL----', thus
; giving the active six bits forming CCPR1L:CCP1CON<5:4>.
exec_Power MACRO
; Power b'HHHHLLUU'
swapf Power,W ; Swap nibbles into W.
andlw b'00001111' ; Mask to MSB.
; b'----wwww' (w = write bit)
movwf CCPR1L ; Write MSB of PWM into CCPR1L.
rlf Power,W ; Rotate W left once...
rlf W,W ; ...and twice.
xorlw b'00110000' ; Mask and invert to LSB.
; b'--ii----' (i = inverted write bit)
xorwf b'00110000' ; Revert, mask and write...
movwf CCP1CON ; ...LSB of PWM into CCP1CON.
ENDM
; - - - - - - - - - - - - - - - -
¹Fltrixnosse anställt ock arbetsivragnde.
Fungerar denna del?
Dvs till att stoppa in Power<7:4> i CCPR1L<3:0> och Power<3:2> i CCP1CON<5:4>?
Hur kan den förkortas...?
Re: CCPR1L:CCP1CON<5:4> = ???
Det är ju lite gungor och karuseller...
(Jag tror att parametern till XORWF är fel...)
Genom att ha ett värde i formen b'HHHHLLUU' så blir kanske
just denna rutin lite enklare, men å andra sidan så fungerer inte
INCF/DECF längre direkt för att öka/minska "power". Med två
shift före INCF/DECF och två efter så fungerar det kanske.
Men du kan lika gärna börja med 2 shift i macrot och ha ett
mer normalt värde för övriga koden att jobba med.
(Jag tror att parametern till XORWF är fel...)
Genom att ha ett värde i formen b'HHHHLLUU' så blir kanske
just denna rutin lite enklare, men å andra sidan så fungerer inte
INCF/DECF längre direkt för att öka/minska "power". Med två
shift före INCF/DECF och två efter så fungerar det kanske.
Men du kan lika gärna börja med 2 shift i macrot och ha ett
mer normalt värde för övriga koden att jobba med.
Re: CCPR1L:CCP1CON<5:4> = ???
Kan ju vara att han vill att UU ska vara "decimaler". Skulle kunna minska avrundningsfelen om programmet gör beräkningar med registret som grund.
Det är för mig obegripligt hur det kan ha skett. Och jag vet inte hur mycket tid jag spenderat på att fundera på vad du menat. Faktiskt startade jag till och med MPLAB igår, och spenderade säkert en timme på att skriva ett program och testa hur registrena hänger ihop. Allt visade sig fungerar precis som jag hade för mig sedan innan, och som jag skrivit i tråden.
Angående din kod ovan. CCPR1L = 0b1111 : CCP1CON<5:4> = 0b11 ska alltså motsvara 100% duty?
Om jag räknar rätt innebär det en switchfrekvens på 125kHz vid 8Mhz om du inte använder prescaler. Är det tanken?
Du har alltså hela tiden talat om ditt hemsnickrade register "power", när du i tråden använt namnet CCPR1L och pratade om vänsterjustering och liknande?; Power b'HHHHLLUU'
Det är för mig obegripligt hur det kan ha skett. Och jag vet inte hur mycket tid jag spenderat på att fundera på vad du menat. Faktiskt startade jag till och med MPLAB igår, och spenderade säkert en timme på att skriva ett program och testa hur registrena hänger ihop. Allt visade sig fungerar precis som jag hade för mig sedan innan, och som jag skrivit i tråden.
Angående din kod ovan. CCPR1L = 0b1111 : CCP1CON<5:4> = 0b11 ska alltså motsvara 100% duty?
Om jag räknar rätt innebär det en switchfrekvens på 125kHz vid 8Mhz om du inte använder prescaler. Är det tanken?
Re: CCPR1L:CCP1CON<5:4> = ???
> Kan ju vara att han vill att UU ska vara "decimaler".
"Undefined" gissade jag...
> Angående din kod ovan. CCPR1L = 0b1111 : CCP1CON<5:4> = 0b11 ska alltså motsvara 100% duty?
Det förutsätter en PWM frekvens så att det blir ett mer eller mindre jämt antal bitar
i "upplösning". Med de tidigare givna parametrerna så "toppar" det någonstans mellan
5 och 6 bitar, d.v.s innan power når "111111UU" men efter "011111UU"...
> Du har alltså hela tiden talat om ditt hemsnickrade register "power", när du i tråden
> använt namnet CCPR1L och pratade om vänsterjustering och liknande?
Ja, tyvärr har det varit otydligt i många inlägg. I det första inlägget så var "Power"
bara en extra definition för CCPR1L. Nu är det alltså en separat variabel/register.
"Undefined" gissade jag...

> Angående din kod ovan. CCPR1L = 0b1111 : CCP1CON<5:4> = 0b11 ska alltså motsvara 100% duty?
Det förutsätter en PWM frekvens så att det blir ett mer eller mindre jämt antal bitar
i "upplösning". Med de tidigare givna parametrerna så "toppar" det någonstans mellan
5 och 6 bitar, d.v.s innan power når "111111UU" men efter "011111UU"...
> Du har alltså hela tiden talat om ditt hemsnickrade register "power", när du i tråden
> använt namnet CCPR1L och pratade om vänsterjustering och liknande?
Ja, tyvärr har det varit otydligt i många inlägg. I det första inlägget så var "Power"
bara en extra definition för CCPR1L. Nu är det alltså en separat variabel/register.
Re: CCPR1L:CCP1CON<5:4> = ???
Med 8Mhz oscillator och 17kHz blir det 8-9 bitar enligt formeln i databladet.Med de tidigare givna parametrerna så "toppar" det någonstans mellan
5 och 6 bitar, d.v.s innan power når "111111UU" men efter "011111UU"...
Om 15,625kHz duger blir det exakt 9 bitar. Vilket ger värdena PR2 = 0x7F och max duty blir CCPR1L = 0x7F : CCP1CON<5:4> = 0x3.
Om det är 17kHz som önskas är närmaste värdet PR2 = 0x75.
Re: CCPR1L:CCP1CON<5:4> = ???
Korrekt, jag använder vanligen Power som en beskrivande #define av CCPR1L.
I detta fallet är det den variabel som håller värdet som ska snurras runt och in till PWM.
Och med PWM menas CCPR1L & DC1B, kan vi nu koncentrera oss på vad som är?
Och här är det inte sagt annat än att upplösningen är sex bitar och Power är det åtta bitars GFR som håller och beräknas på vad som sedan, avrundat och knôtt över och in som sex bitars PWM. OK?
Jag tror DC1B måste köras med dubbel XOR för att få in det rätt.
Men jag kan ha tänkt i fel led vad gäller vad som blir preserved, 0 & 1 med AND och OR.
Har inte använt det så mycket ännu - ni får beakta att före april hade jag inte överhuvudtaget rört varken Assembler eller PIC/MicroChip (MC)...
I detta fallet är det den variabel som håller värdet som ska snurras runt och in till PWM.
Och med PWM menas CCPR1L & DC1B, kan vi nu koncentrera oss på vad som är?
Och här är det inte sagt annat än att upplösningen är sex bitar och Power är det åtta bitars GFR som håller och beräknas på vad som sedan, avrundat och knôtt över och in som sex bitars PWM. OK?
Jag tror DC1B måste köras med dubbel XOR för att få in det rätt.
Men jag kan ha tänkt i fel led vad gäller vad som blir preserved, 0 & 1 med AND och OR.
Har inte använt det så mycket ännu - ni får beakta att före april hade jag inte överhuvudtaget rört varken Assembler eller PIC/MicroChip (MC)...
Re: CCPR1L:CCP1CON<5:4> = ???
Kanske därför du skulle börja lyssna på de råd som lämnas här av de som hållit på längre, och inte hålla på att svamla med egna tolkningar om saker och ting.Har inte använt det så mycket ännu - ni får beakta att före april hade jag inte överhuvudtaget rört varken Assembler eller PIC/MicroChip (MC)...
Re: CCPR1L:CCP1CON<5:4> = ???
Så länge andras förmåga är att svamla är det svårt förstå hur du menar.
Om det var så att jag hade fel och inte lyckades och inte frågade och inte lyssnade på svaren - då hade du just nu inte... svamlat.
Om det var så att jag hade fel och inte lyckades och inte frågade och inte lyssnade på svaren - då hade du just nu inte... svamlat.
Re: CCPR1L:CCP1CON<5:4> = ???
Jo du håller på med svammel, gissningar och egna inkorrekta tolkningar.
Re: CCPR1L:CCP1CON<5:4> = ???
Det går inte ihop med koden du skickade i första inlägget, där det står att PWM-frekvensen ska vara 17kHz, oscillatorn 8Mhz, och ingen prescaler.Och här är det inte sagt annat än att upplösningen är sex bitar
Självklart går det att sänka upplösningen vid samma frekvens med hjälp av prescaler, men i mitt tycke är det dumt.
Kan du inte bara kommenterade detta? förklara var 6-bitar kommer ifrån?
Det finns ju inte något mer frustrerande när du helt ignorerar mycket relevanta frågor i tråden. Det är 16 år sedan jag första gången programmerade en PIC. Trots att jag inte sysslat med PIC på 5-10 år, kom jag tydligen ihåg mer än vad som krävs för att lösa detta problem, utan att ens öppna databladet. Under trådens gång har jag öppnat datablad och testat i kompilator, men det har varit helt bortkastad tid, då jag uppenbarligen inte har mints eller tänkt fel, utan endast tvivlat på min förmåga p.g.a dina kryptiska inlägg.
exec_Power ser ut att vara rätt tänkt, fast med slarvfel i slutet, vilket sodjan kommenterat. (Men som du i vanlig ordning inte svarat på, trots att det hade varit ytterst lämpligt.)
Re: CCPR1L:CCP1CON<5:4> = ???
Ursäkta, men jag går framåt bear~
Som jag sagt tidigare - använd vad som är, inte vad som inte är.
Du hade principiellt helt rätt om 17kHz i kommentaren långt tidigare dock.
Det var inte ett uträknat värde, det var måttat från oscilloskåpet.
Men det är helt olika kod, som gör helt olika saker, i helt olika situationer - så varför koppla ihop dem?
Det blir väldigt svårt hänga med i ditt resonemang om du inte håller isär olika företeelser.
Jag har svarat på "slarvfelet" angående XOR.
Men ingendera av er har bidragit med bättre sätt lösa just den delen...
Som jag sagt tidigare - använd vad som är, inte vad som inte är.
Du hade principiellt helt rätt om 17kHz i kommentaren långt tidigare dock.
Det var inte ett uträknat värde, det var måttat från oscilloskåpet.
Men det är helt olika kod, som gör helt olika saker, i helt olika situationer - så varför koppla ihop dem?
Det blir väldigt svårt hänga med i ditt resonemang om du inte håller isär olika företeelser.
Jag har svarat på "slarvfelet" angående XOR.
Men ingendera av er har bidragit med bättre sätt lösa just den delen...
Re: CCPR1L:CCP1CON<5:4> = ???
Ah, nu ser jag vilket slarvfel du menar!
Åsså har jag tagit bort allt runt koden i sig.
Power är den GFR som håller värdet som skall ges till CCP1 (dvs PWM duty cycle) när denna har upplösning på sex bitar .
Power är och beräknas på i åtta bitars form, när det skall ges till CCP1 skall det splittas så att
Power<7:4> hamnar i CCPR1L<3:0> (CCPR1L<7:4> ska vara '0000') och Power<3:2> hamnar i CCP1CON<5:4> (utan annan förändring av CCP1CON).
Ett Power på 10011011 ska alltså resultera i...
ett CCPR1L på 00001001 och...
ett CCP1CON på pp10pppp.
Med 'p' menas preserved, dvs, i detta fall, ej påverkat
Åsså har jag tagit bort allt runt koden i sig.
Power är den GFR som håller värdet som skall ges till CCP1 (dvs PWM duty cycle) när denna har upplösning på sex bitar .
Power är och beräknas på i åtta bitars form, när det skall ges till CCP1 skall det splittas så att
Power<7:4> hamnar i CCPR1L<3:0> (CCPR1L<7:4> ska vara '0000') och Power<3:2> hamnar i CCP1CON<5:4> (utan annan förändring av CCP1CON).
Kod: Markera allt
swapf Power,W
andlw b'00001111'
movwf CCPR1L
rlf Power
rlf Power,W
xorlw b'00110000'
xorwf CCP1CON
ett CCPR1L på 00001001 och...
ett CCP1CON på pp10pppp.
Med 'p' menas preserved, dvs, i detta fall, ej påverkat
Re: CCPR1L:CCP1CON<5:4> = ???
> Jag har svarat på "slarvfelet" angående XOR.
Du svarade: "Jag tror DC1B måste köras med dubbel XOR för att få in det rätt.",
vilket mycket väl kan vara rätt, men det var inte det som var felet, vilket du nog
har sett vid det här laget (japp, där kom det ett inlägg medan jag skrev...
)
Eller föresten, fungerar inte följande? Istället för:
så kan man nog göra:
AND och OR kan ibland vara lite lättare att läsa och följa.
(Skriv gärna ut ", F" efter "file" instruktionerna så att det framgår att
man inte bara har missat att ange ", W". Även om F är default...
)
Sen så kan man ju även titta på en lösning där man bara låter DC1B bitarna
vara och enbart styr via CCPR1L. Kanske med en lägra PWM frekvens. Jag vet
inte (eller har glömt) vad det hela ska användas till så jag vet inte mer om det.
Du svarade: "Jag tror DC1B måste köras med dubbel XOR för att få in det rätt.",
vilket mycket väl kan vara rätt, men det var inte det som var felet, vilket du nog
har sett vid det här laget (japp, där kom det ett inlägg medan jag skrev...

Eller föresten, fungerar inte följande? Istället för:
Kod: Markera allt
xorlw b'00110000'
xorwf CCP1CON
Kod: Markera allt
andlw b'00110000' ; Mask out bit 4 and 5 in W.
iorwf CCP1CON, F ; Update bit 4 and 5 in CCP1CON.
(Skriv gärna ut ", F" efter "file" instruktionerna så att det framgår att
man inte bara har missat att ange ", W". Även om F är default...

Sen så kan man ju även titta på en lösning där man bara låter DC1B bitarna
vara och enbart styr via CCPR1L. Kanske med en lägra PWM frekvens. Jag vet
inte (eller har glömt) vad det hela ska användas till så jag vet inte mer om det.