µC för nybörjare
Re: µC för nybörjare
> istället för att kanske justera frekvensen?
Hela idén med PWM (Pulse Width Modulation) är att justera pulsbredden.
FM (Frequency Modulation) är något helt annat...
Det normala är att man väljer en lämplig frekverns för det aktuella fallet.
Det beror på vad det är man ska göra. Notera också att olika grundfrekvens
även påverkar upplösningen man kan få, se tabellerna 11-2 och 11-3.
Generellt så ger lägre PWM-frekvens högre PWM-upplösning.
> Fick för mig att jag var tvungen att skriva PWM-bitarna till porten men det går ju givetvis inte...
Lite oklart vad du menar med "PWM-bitarna". Men PWM modulen är ju självständig
efter att den har initierats och startats. Sen behöver man enbart justera CCPR1L
för att ändra pulsbredden. Att skriva till I/O pinnen sköter den om själv.
Om du kör PWM modulen så har den helt hand om PA1/RC5, du ska
aldrig skriva till den pinnen själv från koden!
> Stämmer det att när jag skrivit PR2=0x65 så har jag förminskat PWM-periodens längd.
Eller det som också kallas, ökat frekvensen.
Hela idén med PWM (Pulse Width Modulation) är att justera pulsbredden.
FM (Frequency Modulation) är något helt annat...
Det normala är att man väljer en lämplig frekverns för det aktuella fallet.
Det beror på vad det är man ska göra. Notera också att olika grundfrekvens
även påverkar upplösningen man kan få, se tabellerna 11-2 och 11-3.
Generellt så ger lägre PWM-frekvens högre PWM-upplösning.
> Fick för mig att jag var tvungen att skriva PWM-bitarna till porten men det går ju givetvis inte...
Lite oklart vad du menar med "PWM-bitarna". Men PWM modulen är ju självständig
efter att den har initierats och startats. Sen behöver man enbart justera CCPR1L
för att ändra pulsbredden. Att skriva till I/O pinnen sköter den om själv.
Om du kör PWM modulen så har den helt hand om PA1/RC5, du ska
aldrig skriva till den pinnen själv från koden!
> Stämmer det att när jag skrivit PR2=0x65 så har jag förminskat PWM-periodens längd.
Eller det som också kallas, ökat frekvensen.

- Magnus_K
- EF Sponsor
- Inlägg: 5854
- Blev medlem: 4 januari 2010, 17:53:25
- Ort: Skogen mellan Uppsala-Gävle
Re: µC för nybörjare
Du förstod mig rätt sodjan.
Och jag hade bestämt mig för att jag på något sätt var tvungen att skriva ut PWM-modulens registervärde(?) på I/O pinnen, vilket alltså inte behövdes.
Väldigt spännande det här. Vilken skön känsla det måste vara att känna att man har full koll på detta och kan utan vidare bestämma frekvensen, duty_cycle och upplösning.
Ett mål är uppsatt!
Och jag hade bestämt mig för att jag på något sätt var tvungen att skriva ut PWM-modulens registervärde(?) på I/O pinnen, vilket alltså inte behövdes.
Väldigt spännande det här. Vilken skön känsla det måste vara att känna att man har full koll på detta och kan utan vidare bestämma frekvensen, duty_cycle och upplösning.
Ett mål är uppsatt!
Re: µC för nybörjare
Kul! 
Ja, jag förstår att det var rörigt om du trodde att du själv skulle hantera
själva I/O pinnen...
Det måste ju ha blivit helt uppåt väggarna... 
Som sagt, "set-and-forget" som det kallas. Ställ in PR2, CCPR1L
och CCP1CON så snurrar det på av sig självt efter det. Du behöver
inte göra någonting alls förrens t.ex pulsbredden ska justeras.

Ja, jag förstår att det var rörigt om du trodde att du själv skulle hantera
själva I/O pinnen...


Som sagt, "set-and-forget" som det kallas. Ställ in PR2, CCPR1L
och CCP1CON så snurrar det på av sig självt efter det. Du behöver
inte göra någonting alls förrens t.ex pulsbredden ska justeras.
- Magnus_K
- EF Sponsor
- Inlägg: 5854
- Blev medlem: 4 januari 2010, 17:53:25
- Ort: Skogen mellan Uppsala-Gävle
Re: µC för nybörjare
Fin fint, nu börjar det här bli riktigt roligt! Jag har jobbat på den här inlägget i en timma nu för så fort jag skrivit en fråga och sen kontrollerat mig själv så har jag kommit på svaret själv. Dock så kvarstår det en undring.
Jag har riggat upp skopet och får upp en vacker PWM-period där. TIME/DIV inställt på 50us och perioden sträcker sig över 5,2 "rutor". Detta borde innebära att en period är uppmätt till 50us * 5,2 = 260us vilket i sin tur borde bli 3846 Hz (1'000'000 / 260).
Det där blev nog rörigt att läsa men jag vill få med all information då det kanske är fel redan vid det här skedet...
Enligt databladet ska jag använda mig av följande formeln för att räkna ut en periodlängd (frekvensen):
Här använde jag följande:
PR2 = 255
TOSC = 0,125 us (1/8'000'000)
Prescale = 1
Detta resulterar i 7812,5 Hz vilket jag räknar med är ca det dubbla. Kan inte vara mer precis för mitt gamla skop är lite "hoppigt".
Med tanke på formeln, tänker jag rätt att den handlar om att först "flytta upp" PR2 värdet ett steg då den börjar räkna med 0. Sedan multiplicera med tiden för en instruktionscycle för att slutligen multiplicera med prescalern, dvs skalar upp frekvens men minskar upplösningen.
Rätta mig hemskt gärna i allt tok.
Hmm, jag får en känsla av att jag räknat rätt och även mäter rätt men jag har missat något... Typ att jag inte kan få högre PWM frekvens utan att börja leka med "skalningen".
Om någon har tid och lust så får ni hemskt gärna peka mig i rätt riktning. Helst inte peka direkt på felet men kanske ge mig en hint.
Jag har riggat upp skopet och får upp en vacker PWM-period där. TIME/DIV inställt på 50us och perioden sträcker sig över 5,2 "rutor". Detta borde innebära att en period är uppmätt till 50us * 5,2 = 260us vilket i sin tur borde bli 3846 Hz (1'000'000 / 260).
Det där blev nog rörigt att läsa men jag vill få med all information då det kanske är fel redan vid det här skedet...
Enligt databladet ska jag använda mig av följande formeln för att räkna ut en periodlängd (frekvensen):
Kod: Markera allt
PWM Period = [(PR2) + 1] • 4 • TOSC • (TMR2 Prescale Value)
PR2 = 255
TOSC = 0,125 us (1/8'000'000)
Prescale = 1
Detta resulterar i 7812,5 Hz vilket jag räknar med är ca det dubbla. Kan inte vara mer precis för mitt gamla skop är lite "hoppigt".
Med tanke på formeln, tänker jag rätt att den handlar om att först "flytta upp" PR2 värdet ett steg då den börjar räkna med 0. Sedan multiplicera med tiden för en instruktionscycle för att slutligen multiplicera med prescalern, dvs skalar upp frekvens men minskar upplösningen.
Rätta mig hemskt gärna i allt tok.
Hmm, jag får en känsla av att jag räknat rätt och även mäter rätt men jag har missat något... Typ att jag inte kan få högre PWM frekvens utan att börja leka med "skalningen".
Om någon har tid och lust så får ni hemskt gärna peka mig i rätt riktning. Helst inte peka direkt på felet men kanske ge mig en hint.
Re: µC för nybörjare
Du får alltså ungefär halva förväntade frekvensen.
Notera att en 16F690 har en intern oscillator som *kan* gå i 8 MHz,
men om man inte ställer in något så är 4 MHz default efter power-on.
Se "REGISTER 3-1: OSCCON: OSCILLATOR CONTROL REGISTER".
Notera att en 16F690 har en intern oscillator som *kan* gå i 8 MHz,
men om man inte ställer in något så är 4 MHz default efter power-on.
Se "REGISTER 3-1: OSCCON: OSCILLATOR CONTROL REGISTER".
- Magnus_K
- EF Sponsor
- Inlägg: 5854
- Blev medlem: 4 januari 2010, 17:53:25
- Ort: Skogen mellan Uppsala-Gävle
Re: µC för nybörjare
Väldigt bra tanke men den var/är inställd på 8 MHz.
EDIT: Ska kolla upp detta mer idag så jag inte missar något. Det låter som en väldigt trolig orsak nämnligen...
EDIT: Ska kolla upp detta mer idag så jag inte missar något. Det låter som en väldigt trolig orsak nämnligen...
Re: µC för nybörjare
Det förutsätter att du någonstans ändrar i OSCCON.
Jag minns inte om det har varit med i det som visas.
Jag minns inte om det har varit med i det som visas.
- Magnus_K
- EF Sponsor
- Inlägg: 5854
- Blev medlem: 4 januari 2010, 17:53:25
- Ort: Skogen mellan Uppsala-Gävle
Re: µC för nybörjare
Du hade helt rätt!
Efter ställt in OSCCON registret så stämde frekvensen klockrent. Tack för det!
Nu är jag dock lite fundersam... När jag skapar projektet i MikroC så får jag där "ställa in" frekvensen. Configurationen ser ut som nedan. Nu ska jag sluta förutsätta så mycket men jag trodde dessa fuses och inställningar implementerades i hex-koden men utan att jag såg den i själva kod fönstret.
Sen om specifikt ställer in OSCCON-registret så körde den över dessa konfigureringar.
Hade tydligen helt fel så det får bli att läsa mer om det ikväll.
Men gott, nu ska här räknas och mätas!
Efter ställt in OSCCON registret så stämde frekvensen klockrent. Tack för det!
Nu är jag dock lite fundersam... När jag skapar projektet i MikroC så får jag där "ställa in" frekvensen. Configurationen ser ut som nedan. Nu ska jag sluta förutsätta så mycket men jag trodde dessa fuses och inställningar implementerades i hex-koden men utan att jag såg den i själva kod fönstret.
Sen om specifikt ställer in OSCCON-registret så körde den över dessa konfigureringar.
Hade tydligen helt fel så det får bli att läsa mer om det ikväll.
Men gott, nu ska här räknas och mätas!
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: µC för nybörjare
Inställningen i MikroC är *enbart* för att tala om för kompilatorn vilken hastighet
du *tänker* köra med så att den kan beräkna Delay_ms() korrekt. Delay_ms() tar
alltså inte tid så att säga, utan den kör en program-loop som tar angivet antal
millisekunder vid en viss antagen hastighet på processorn.
Om du sedan väljer att köra med en annan hastighet så blir ju dessa fel, så klart.
På samma sett som allt annat som förutsätter en viss hastighet på processorn,
t.ex PWM beräkningen som du gjorde.
du *tänker* köra med så att den kan beräkna Delay_ms() korrekt. Delay_ms() tar
alltså inte tid så att säga, utan den kör en program-loop som tar angivet antal
millisekunder vid en viss antagen hastighet på processorn.
Om du sedan väljer att köra med en annan hastighet så blir ju dessa fel, så klart.
På samma sett som allt annat som förutsätter en viss hastighet på processorn,
t.ex PWM beräkningen som du gjorde.
Re: µC för nybörjare
Magnus_K: de inställningar du gör som berör FUSE BITS (CONFIG) kommer att bli implementerat i hex-filen. Inget annat! Precis som sodjan skriver är den hastighet för att ange för de funktioner som finns i MikroC som är beroende av den hastighet, inget annat.
Senast redigerad av Icecap 5 mars 2014, 13:53:49, redigerad totalt 1 gång.
- Magnus_K
- EF Sponsor
- Inlägg: 5854
- Blev medlem: 4 januari 2010, 17:53:25
- Ort: Skogen mellan Uppsala-Gävle
Re: µC för nybörjare
Ville testa så jag förstått er rätt så jag försökte göra som man kanske normalt gör, att önska en frekvens och duty_cycle för att sen ställa in PWM-modulen utefter det.
Drog till med 125KHz och 25% duty_cycle (för synlighetens skull). Ändrade klockan till 2Mhz också för att röra till det lite mer.
Med lite matte så borde alltså en period ta 8us där duty_cycle är 2us.
Skopet inställt på 2us/DIV.
Resultatet (ursäkta kvalitén men jag får passa på i mörkret när ungarna sover...): Kanske inte märkvärdigt för er men jag tänker flina hela dagen!
Drog till med 125KHz och 25% duty_cycle (för synlighetens skull). Ändrade klockan till 2Mhz också för att röra till det lite mer.
Med lite matte så borde alltså en period ta 8us där duty_cycle är 2us.
Skopet inställt på 2us/DIV.
Resultatet (ursäkta kvalitén men jag får passa på i mörkret när ungarna sover...): Kanske inte märkvärdigt för er men jag tänker flina hela dagen!
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
- Magnus_K
- EF Sponsor
- Inlägg: 5854
- Blev medlem: 4 januari 2010, 17:53:25
- Ort: Skogen mellan Uppsala-Gävle
Re: µC för nybörjare
Hehe nja, den 2 veckor gamla kan jag inte riktigt styra sovmönstret på men sova i mörker kan hon få göra när hon väl behagar. Den andra fick hela natten förstörd pga den förstnämnda så hon får sova en liten snutt nu också. Lite OT men ja, så är det här!