Sida 1 av 3

Är detta rätt tänkt angående CCP module, PWM läge.

Postat: 19 april 2009, 17:17:07
av PopUnoNkoK
Jag ska göra en IR fjärrkontroll till min Nikon Systemkamera.
Använder PIC16F628A

IR dioden ska pullsera i ca 40Khz. Sedan ska den följa denna pulssekvens.
http://www.bigmike.it/ircontrol/images/ML-L3.r2.png

Jag håller på att läsa på om PWMlägen på CCPmodulen och undrar om detta är rätt tänkt.

Jag tänkte att man använder CCPModulen till att generera 40Khz pulsen som ständigt ska gå när dioden här "Hög" och sedan tex tmr0 eller tmr1 till att generera den sekvens som diagrammet ovan visar.

Kan jag använda CCP MOdulen på det sättet?

MVH Peter F

Edit: Bilden var alllllldeles för stor så det blev en länk i stället

Re: Är detta rätt tänkt angående CCP module, PWM läge.

Postat: 19 april 2009, 17:17:36
av Meduza
BILDSTORLEK!

Sen har du någon speciell anledning att bygga själv (speciella funktioner eller så) då 3djeparts-fjärrkontroller är asbilliga på eBay?

tex denna: http://cgi.ebay.com/ws/eBayISAPII.dll?V ... 0394931371

Re: Är detta rätt tänkt angående CCP module, PWM läge.

Postat: 19 april 2009, 17:36:12
av bearing
Ja, det går. Det är bara att göra så att timer-interruptet ändrar duty till 0 i pauserna och sedan till önskad styrka i de aktiva perioderna.

Du kanske t.o.m. kan använda TMR2-interruptet med lämplig postscaler.

Re: Är detta rätt tänkt angående CCP module, PWM läge.

Postat: 19 april 2009, 18:48:29
av PopUnoNkoK
Meduza: Jo jag har ett par anledningar till att göra en själv, bla "TimeLaps", alltså ta kort med jämna mellanrum.

Bearing: Låter bra, jag började skriva koden med att bara "Pulsa" med Tmr0 men det kändes väldigt fort "tjorvigt" när det både var 40Khz pulsen OCH den oregelbundna sekvensen.

Re: Är detta rätt tänkt angående CCP module, PWM läge.

Postat: 19 april 2009, 19:00:42
av sodjan
Det är helt rätt att låta PWM modulen generera grundsignalen (40 KHz).
Sedan kan man slå den av/på enligt det protokol som mottagaren vill ha.
Det ska/brukar finnas någon bit i ett register som startar/stoppar PWM modulen.

Re: Är detta rätt tänkt angående CCP module, PWM läge.

Postat: 19 april 2009, 20:17:22
av Meduza
PopUnoNkoK: Ja då är det mycket mer förståeligt om du ska köra time-lapses :)

Re: Är detta rätt tänkt angående CCP module, PWM läge.

Postat: 20 april 2009, 12:46:54
av PopUnoNkoK
Nu tror jag att min lysdiod (fortfarande en vanlig) blinkar i 38,4Khz. Men 50% DutyCycle. Den lyser i alla fall med 50% styrka av en heltänd diod som jag har bredvid. (Överflödigt med ett osiloscop :D )
Jag tror att siffrorna stämmer så det booorde vara 37,4Khz.

Laddat PR2 med 25
Laddat CCPR1L med 12 (detta är jag lite osäker på, hittade i en exempelkod att de använt en ett tal här som motsvarade 25% av det värdet de laddat i PR2 och det stod att dutycykeln skulle ligga på 25%)

Jag har dock bara den interna Oscillatorn på 4Mhz så precisionen är kanske inte perfekt. Men jag ska i alla fall testa och se om det funkar, eller kanske främst om jag fixar att skriva koden.

Mitt problem nu är att välja sätt att hålla koll på de olika pulslängderna. Alltså vilken upplösning jag ska ha.
Så här ser sekvensen ut:

Bild
Ändrade bildstorlek så ni skulle slippa klicka på länk.

Än en gång, nu skriver jag hur jag ser på problemet, kan vara många "fel tänk" i mina resonemang.
Vid första anblicken är det uppenbart att jag vill hitta ett "grundvärde" på 10uSec eftersom att det är mycket enkelt att räkna upp med 10uSec till alla de pulslängder som finns i sekvensen. Men om jag ska ha en Interrupt Service Rutine var 10 usec så känns det som om de kommer att bli för ofta. Till exempel känns det som om det kan störa 38,4kHz pulsen för ofta.
Sen tyckte jag att det skulle vara skönt med en bas på 400uSec och på annat sätt(vet inte riktigt vad det innebär än) räkna upp resterande tid till rätt pulslängd, men då skiter det sig med pulslängden som är 390uSec.

Någon som har ett bra förslag på hur jag ska uppnå denna typ av pulssekvens?

MVH Peter F

Re: Är detta rätt tänkt angående CCP module, PWM läge.

Postat: 20 april 2009, 12:55:53
av sodjan
> Till exempel känns det som om det kan störa 38,4kHz pulsen för ofta.

Så länge som du inte *stänger av* PWM modulen så kan den inte "störas".
Det struntar helt i vad du gör för övrigt i programmet.

Men sen så låter 10us väldigt kort, hade du tänkt dig ett interrupt vid varje ?
Eller bara som klocka in till en timer (det fungerar säkert OK).

> Någon som har ett bra förslag på hur jag ska uppnå denna typ av pulssekvens?

Du kan ställa in en timer så att du får de olika tiderna. Sedan håller
du reda på var du är i sekvensen och ändrar timervärdet alt eftersom.
Låt timern ge ett interrupt när den är klar och ladda om med nästa värde
in interruptrutinen. Låt interruptrutinen uppdatera en variabel som talar om
hur långt i sekvensen du har hunnit så at den vet vilket värde den ska
ladda timern med nästa gång (samt om PWM-signalen ska på eller av).

Slutligen så är nog inte tiderna så där jätte viktiga, det går antagligen bra med
5, kanske 10 % variation utifrån specen. Det skulle förvåna om det inte
fungerar lika bra med 3 st 400 us pulser instället för 390/410/400...

Re: Är detta rätt tänkt angående CCP module, PWM läge.

Postat: 20 april 2009, 13:26:42
av PopUnoNkoK
>Så länge som du inte *stänger av* PWM modulen så kan den inte "störas".
Det struntar helt i vad du gör för övrigt i programmet.

Hmmm, ja då har jag bestämt ställt in den på ett alldeles för bökigt sätt. :? Har läst i både Picens datablad PIC16F628a och i "Mid-Range MCU Family Reference Manual" och kör med ett modifierat exempel från den senare. Den koden använder sig inte av interrupts, istället håller jag koll på Timer2s Interrupt Flag. Och när den är hög så XorWf ar jag LED pinnen.
Jag kan riktigt höra hur ni stönar när ni läser det ovanstående stycket och tänker nåt i stil med "vad håller han på med". :)

Nu, sedan jag skrev ovanstående stycke, har jag flyttat LED ett till CCP1 pinnen och där lyser dioden mindre är den heltända dioden vilket får mig att tro att den också körs i 38,4kHz trots att den är helt oberoende av min "puckokod" som jag skrev om i ovanstående stycke. Skönt.
Den lyser dock starkare än den gjorde tidigare så min teori om att ett Osiloscop är heeelt överflödigt kanske var lite förhastat. ;) Men det får bli ett senare problem.


>Men sen så låter 10us väldigt kort, hade du tänkt dig ett interrupt vid varje ?
Eller bara som klocka in till en timer (det fungerar säkert OK).

Här förstår jag inte riktigt vad du menar, jag har ställt in timer0, denna gång utan prescaler och sedan vid varje interrupt så räknar jag ner från ett eget satt värde, typ "DecSz MittVärde".
Så när du skriver "Eller bara klicka in till en timer" så är jag inte riktigt med på noterna.


>Du kan ställa in en timer så att du får de olika tiderna. Sedan håller
du reda på var du är i sekvensen och ändrar timervärdet alt eftersom.

Menar du bara att ändra Tmr0 värdet istället för att låta det gå till 255 eller menar du även att ändra prescalern?

Att tiderna mest troligt inte behöver vara jätte exakta låter bra, ska dok försöka komma så nära som möjligt.

MVH Peter F

Re: Är detta rätt tänkt angående CCP module, PWM läge.

Postat: 20 april 2009, 13:47:04
av sodjan
> Hmmm, ja då har jag bestämt ställt in den på ett alldeles för bökigt sätt.

PWM modulen ? Den kan väl bara ställas in på ett sätt !?
Efter det så går den "av sig självt" tills man stänger av den igen.

> istället håller jag koll på Timer2s Interrupt Flag. Och när den är hög så XorWf ar jag LED pinnen.

Du menar att du kör programvaru-PWM ? Det är ju ganska onödigt
när du har en PWM-modul i processorn. Ställ bara in den och låt den göra jobbet...

> jag har ställt in timer0, denna gång utan prescaler och sedan vid varje interrupt så räknar
> jag ner från ett eget satt värde, typ "DecSz MittVärde".

OK, så då har du ganska täta interupt i så fall ?
Tja, det funegrar väl det också om du har räknat på det och
kollat att du har tid med det.

> Så när du skriver "Eller bara klicka in till en timer" så är jag inte riktigt med på noterna.

Vad jag menade var att du hade ställt in prescaler o.s.v så att timern
tickade fram med (ca) 10 us "ticks". Sedan laddar med timer-registren så att
man får ett interrupt när det har gått den tid man vill ha, 400, 2000, 3580
us eller vad det nu är. Då får man inget interrupt förrens det behövs, så att säga.

Det jag tyckte var att 10 us låter lite kort för att köra räknare i programvaran.

> Menar du bara att ändra Tmr0 värdet istället för att låta det gå till 255

Man ändrar (laddar) timern med ett startvärde som ger rätt tid t.o.m 255 (då
man ju får ett interrupt). Om du vill ha t.ex 400 us så laddar du tmr0 med
256 - (400/10) = 216, d.v.s om timer0 tickar fram med 10 us, annars får du
ändra beräkningen.

> ...eller menar du även att ändra prescalern?

Ja, om det behövs för att få den aktuella tiden.

Re: Är detta rätt tänkt angående CCP module, PWM läge.

Postat: 20 april 2009, 15:06:47
av PopUnoNkoK
PWM modulen var inställd rätt men jag använde en annan pinne till min lysdiod. Sedan höll jag koll på Timer 2s Interruptflag och blinkade LED den manuellt när den "flaggade". Det innebär alltså att jag hade ställt in PWM modulen rätt men valde ändå att programvaru-PWMa! Ja, det är galet hur illa jag kan lyckas skruva till det bland. :oops:

Ytterligare en fråga:
Hittar ingenstans hur man slår på och av PWM utan att resetta alla inställningar. Borde väl finnas en BIT som man kan ändra från hög till låg eller nåt liknande. Som Sodjan nämnde.

Re: Är detta rätt tänkt angående CCP module, PWM läge.

Postat: 20 april 2009, 15:19:40
av vfr
Om man anger PWM-värdet till 0 så borde den ge konstant låg ut. Sedan ändrar man värdet till 50% (128) när man vill ha fyrkantvåg ut. Det borde vara enkelt. Då ändrar du inga andra inställningar.

Re: Är detta rätt tänkt angående CCP module, PWM läge.

Postat: 20 april 2009, 15:21:49
av PopUnoNkoK
Det är juh helt suveränt när ni kommer med så enkla förslag... :) Det var juh dessutom nämnt tidigare i denna tråd. Jag ber om ursäkt Bearing.

Tackar och bockar samtidigt som jag skäms en aning för att jag inte tänkte på det.

MVH Peter F

Re: Är detta rätt tänkt angående CCP module, PWM läge.

Postat: 20 april 2009, 15:30:42
av sodjan
> Hittar ingenstans hur man slår på och av PWM utan att resetta alla inställningar.

Borde vara TMR2ON.

Re: Är detta rätt tänkt angående CCP module, PWM läge.

Postat: 20 april 2009, 15:33:24
av PopUnoNkoK
Jo men om jag bara stänger av Timer2, hur vet jag om IR dioden är på eller av? Alltså om CCP1 är hög eller låg?