Jag vet (faktist) nästan hur det funkar
Jag läste om det i en artikel i AoE för inte så många nummer sedan, tänkte sno en del inspiration från det projektet, men jag skulle ju vilja styra några kanaler med samma µC, borde inte det vara möjligt? Det är ju naturligtvis samma nollpunkt hos alla så det momentet kan ju inte vara något problem. Problemet är isåfall att överföra datan till denna µP om hur varje kanal ska dimmas (det ska ju styras från en annan µC).
Visst borde det heta PWM, frekvensen är ju väldigt konstant, 50Hz, och det är ju bara "duty cycle" man ändrar...
Nej, jag menar om man fixar en dimmer som styrs digitalt, och om man då har från 0-100% i 16 steg (4 bitar).
Det har inget att göra med den där dimmerkretsen.
Jag prövade att dela in min dimmer på väggen i 16 steg, och man kommer ju se stegskillnader när styrkan ökas eller minskas.
Tänkte att eftersom jag har bara 8 bitar att leka med per modul, så skulle det bli två kanaler per modul om de fick 4 bitar var.
Det går ju att fixa 2 kanaler med 7 bitar var, eller 4 kanaler med 6 bitar var (64 steg) men det kräver lite mer logik...
Ett sätt att kunna dimma 8 st lampor individuellt är såhär:
Man tar en pic/avr och kopplar en nollgenomgångsdetektor till en inport, sedan tar man åtta st optokopplare/triacs och kopplar dom till 8 utportar.
För att kunna styra det hela utifrån så har man lämpligen valt en pic/avr med inbyggd UART så man enkelt kan styra den seriellt. För att förenkla det hela skulle jag låta varje lampa styras i 95 steg med hjälp av ASCII-värden mellan 32 (mellanslag) och 127 (Del), eftersom dessa kan man komma åt direkt från ett tangentbord. För att slå på en lampa direkt efter nollgenomgången så att den lysar maximalt starkt skickar man det lägsta värdet 32 (mellanslag) , medelstarkt blir 79 (O), och helt släckt blir 127 (del).
För att förenkla det hela skulle jag göra så att man skickar nya värden för alla 8 lamporna på engång. Och för att synkronisera datorn med pic'en så skulle jag göra så att ett Enter (13) skulle betyda att "nu kommer första värdet".
Så för att slå på dom tre första lamporna max, sedan två st medel och de tre sista ganska svagt skulle man skicka:
ENTER MELANSLAG MELLANSLAG MELLASLAG P P h h
(h har värdet 104 och borde bli rätt svagt)
Programvaran skulle bli rätt enkel, något i stil med:
1: Vänta på nollgenomgång
2: Nollställ tidsräknaren
3: Kolla om tidsräknaren=värdet för lampa1, om så, aktivera utgång 1
4: Kolla om tidsräknaren=värdet för lampa2, om så, aktivera utgång 2
5: Kolla om tidsräknaren=värdet för lampa3, om så, aktivera utgång 3
6: Kolla om tidsräknaren=värdet för lampa4, om så, aktivera utgång 4
7: Kolla om tidsräknaren=värdet för lampa5, om så, aktivera utgång 5
8: Kolla om tidsräknaren=värdet för lampa6, om så, aktivera utgång 6
9: Kolla om tidsräknaren=värdet för lampa7, om så, aktivera utgång 7
10: Kolla om tidsräknaren=värdet för lampa8, om så, aktivera utgång 8
11: Vänta 0.1 mS
12: Slå av alla utgångar
13: Öka tidsräknaren med 1
14: Kolla om tidsräknaren <100?, om så, gå till rad 3
15: Kolla om det kommit in något på uarten, om inte, gå till rad 1
16: Är tecknet ett ENTER?, om så, nollställ lamppekaren och gå till rad 1
17: Lagra tecknet-32 i värdet för lampan utpekat av lamppekaren
18: Öka lamppekaren med 1
18: Gå till rad 1
hmm... ja PIC är ju bra, men nu har jag börjat med mitt LPT-styrda system, så det får blir som jag tänkt Och det räcker med en dimning i 16 steg, och 2 kanaler. Har eventuellt kommit på en mycket enkel dimmerlösning...
>> matseng (ny avatar? känner inte igen dig ju.. )
Hur går det om µC ska ta emot något den hittat på USARTen då? om den inte hinner få in alla data innan nästa nollgenomgång så kommer den missa att trigga triacarna...
Lite otäckt om en av de anslutna enheterna är en lampa och om den blinkar till bara för att µC måste uppdatera de andra kanalernas värde?
Eller har jag dålig uppfattning om vad en µC hinner på några ms?
[Jo, jag tröttnade på att se mig själv flina, så nu har jag lagt upp typ 20 st olika blåa M som den slumpmässigt använder en av...]
Så som pseudokoden är gjord nu så tar den bara in ett tecken åt gången per period (om 10 mS), så det är ingen större fara att missa en nollgenomgång.
Egentligen så skulle man i det här fallen kolla om tidsräknaren är <96 eftersom lampvärdena aldrig blig högra än så. Då har man ett bra tag på sig att processera tecknet innan nästa nollgenomgång.
Fast bäst vore förståss att ha UART'en interruptstyrd, kanske även nollgenomgången skulle trigga ett interrupt.
Men om man nu skulle missa en enstaka nollgenomgång (vilket skulle innbära att lamporna skulle vara släckta i 10 mS) så tror inte jag att man skulle märka något. Glödtråden har förmodligen en termisk tröghet som gör att den inte hinner kallna allt för många grader på 10 mS.
Skriver man i assembler så hinner cpu'm med att exekvera någon/några tusen rader kod på 1 mS. I C hinns nog 100 enklae instruktioner med. Picbasic har jag egentligen ingen uppfattning om, men något 10-tal borde ju inte vara omöjligt.
PICBasic görs om till asm och sedan till HEX... dvs den ända skillnaden är ju att man får med lite "skräp" asm som man kanske inte skulle haft om man skrivit det själv... så vad gäller exekverings hastighet ska det ju inte skilja...
Ok. Ja då bör det ju vara på ett ungefär samma som med C, ett antal 100 rader per mS beroende på komplexitet på instruktionerna och om det är en gammal 4MHz-häck eller en nyare cpu.
lär ju inte vara några problem att klara på 4Mhz. PICBasic och C till PIC har jag för mig är ganska effektiva. Det kan bli lite större problem med BS2 eller liknande.
matseng: Meningen med UART är väl på sätt och vis att den är interrupt styrd och lägger in datat automatiskt eller nåt? Har inte läst så mycket om UARTen? Hmm, ska kanske läsa lite mer om det här känner jag. Iaf kan man fixa interrupt styrd på både mottagningen och nollgenomgången. Man kan ju prioritera efter vad som funkar bäst.
Har ni nå tips på var man hittar väldigt tunn tråd väldigt billigt? Dubbel såklart. Det får ju inte vara någon tjock vanlig kabel för det tar alldeles för mycket plats för sånt här. Det ska ju såklart vara billigt eftersom det blir mycket kabel.
En UART kan man enkelt säga är att den är ett glorifierat shiftregister som tar in data seriellt och samlar ihop 8 bittar och levererar en byte i taget. (Och motsatt förståss när man sänder via UART'en). Den tar hand om att starta hopsamlingen när den upptäcker startbitten och ser till att sampla mitt i varje bitlucka. När alla 8 bittar plus stopbitten har kommit in så sätts det en flagga i ett register som visar att ett tecken finns tillgängligt för avläsning.
Denna flagga kan man antingen polla med lämpliga intervallen i mjukvaran, eller så talar man om för interrupthanteraren att ett interrupt ska ges när data-finns-tillgängligt-bitten sätts hög.
Vad gäller tunn och billig tråd har jag med "framgång" använd mig av vanlig grå och tråkig flatkabel.
Köper man en 30 meters rulle 14-polig så kostar den 6.82/metern på Elfa och sen kan man enkelt splitta upp i 7 st 2-poliga kablar. Den blir då tunn, platt, smal och nästan osynligt grå för under 1 kr metern. Det är rätt väldigt billigt det.