Zdravím,
Jak můžu ovládat barvy na RGB ledce jen pomocí procesoru.
Na netu jsem se dočetl, že pomocí PWM.
Zkoušel jsem to, ale barvy nesedí. Jde mi o to jak dostat z ledky barvu podle kódu např. R:59 G:34 B:14 (hnědá)
Jedná se o led se společnou anodou.
Díky Michal
Fórum › Assembler
Ovládání RGB led
zase tak dobry barvy z ledky nedostanes... jednotlive barvy musi byt velice dobre promichane a ty krystaly na ledce sou vetsinou strasne daleko...
pak pwm se musi trosku vic skalovat... ci pouzit rc clanek aby byly zmeny svitivosti trosku jemnejsi.. . i nejkratsi impuls je uz pomerne vyrazne svetlejsi nez kdyz nesviti vubec a pak jsou ty zmeny mnohem mene viditelne...
tusim ze zajimavejsi metoda je tusim bitbanging ci jak se to menuje... jde o to ze jednotlive bity z bajtu vypisujes na port a pak cekas primerene dlouhou dobu podle toho jak dulezity bit to byl...
tj pro LSB cekas jednu jednotku casu, pro dalsi bit 2, 4, 8, 16, 32... 128... vyjde to podobne jako pwm ale mohlo by to byt trosku viditelnejsi (ale tezko rict .. moc sem to netestoval)
j no já si hraju už s hotovým výrobkem, tudíž můžu měnit jenom program v 8051..
Při hraní si dostanu mimo červené, zelené a modré taky růžovou žlutou a bílou bohužel když si hraju moc tak i odstíny těchto barev jde mi spíše o to abych mohl barvy měnit podle kódu co jsem psal nahoře (např. R:59 G:34 B:14 )
Jinak ledky si myslím mám celkem kvalitní :D (http://www.netmart.cz/detail.aspx?…)
kazdopadne 8051 nema PWM (pokud teda nemas nejaky specialni model) takze bud budes emulovat PWM nebo emulovat ten druhej princip... ani neni tezke, 51 ma region pameti co jde dobre adresovat po bitech...
staci ti vesmes neco jako (akorat je to v C - ale potreboval bys jen najit instrukce jako srovnani (nebo jeste lepe rozdil a pak zjistit jestli byl vysledek zaporny) a nastaveni bitu v bitove casti pameti.. (kousek pameti vcetne portu a podobne je adresovatelne primo po bitech):
unsigned char i = 0;
while (1) {
PA.0 = red<i; // pro spolecnou anodu je aktivni LOW - proto pro i: 0..red => 0 a zbytek 1 jako vypnuto
PA.1 = green<i;
PA.2 = blue<i; // zalezi ktere piny to opravdu ovladaji
++i;
}
jinak daleko lepsi by bylo nastavit si preruseni a tohle vykonavat primo v nem (tak moc pomaly to nebude aby se to muselo nutne vyhazovat ven.. - pak budes moci aspon delat i neco jineho
EDIT: v assembleru by bylo mozna lepsi udelat to srovnani tak aby vysledek byl v carry, a pak shiftem s carry to natahnout do nejake pomocne promenne... tu pak nastelovat na spravny vystup a poslat tam
Tak jsem to cca přepsal do asm..
ale moc to nefunguje, chci zobrazit zlutou a ukaze se me cervena :D
HAH: CLR P3.0
CLR P3.1
CLR P3.2
SETB P3.3
SETB P3.4
SETB P3.5
SETB P3.6
MOV P0,#00000000B
MOV P1,#00000000B
MOV P2,#00000000B
ZAC:MOV A,#0
MOV R0,#255 ;RED
MOV R1,#249 ;GREN
MOV R2,#97 ;BLUE
HL: MOV B,R0 ;DO B HODNORU CERVENE
CJNE A,B,RS ;POROVNEJ POKUD SE LISI SKOC NA RS
;/*ROVNA SE PROTO SE UZ NESMI ZOBRAZOVAT
SETB P3.4
MOV R0,A
INC R0
JMP RSA
RS: CLR P3.4 ;ZAPNI CERVENOU LEDKU
RSA:MOV B,R1 ;DO B HODNORU ZELENE
CJNE A,B,GS ;POROVNEJ POKUD SE LISI SKOC NA GS
;/*ROVNA SE PROTO SE UZ NESMI ZOBRAZOVAT
SETB P3.5
MOV R1,A
INC R1
JMP GSA
GS: CLR P3.5 ;ZAPNI ZELENOU LEDKU
GSA:MOV B,R2 ;DO B HODNORU MODRE
CJNE A,B,BS ;POROVNEJ POKUD SE LISI SKOC NA BS
;/*ROVNA SE PROTO SE UZ NESMI ZOBRAZOVAT
SETB P3.6
MOV R2,A
INC R2
JMP BSA
BS: CLR P3.6 ;ZAPNI MODROU LEDKU
BSA:INC A ;PRICTI K A JEDNICKU
CJNE A,#255,HL ;JESTE NENI MAXIMALNI HODNOTA MUZEME OPAKOVAT
JMP ZAC ;SKOK NA ZACATEK PROGRAMU
end
no moc tam toho nevidim ale urcite nemuzes dat pokud se lisi...
counter muze bezet porad dokola.. neni potreba zadne kontroly
odectes red - counter (ale nemenit ani jedno z nich) a pak testem jestli byl vysledek zaporny -> nastavit na vystupu nulu (zapnout led) jinak vypnout
a to same v jednom kole pro vsechny barvy... pak inkrementovat counter a opakovat za chvili
Upravil jsem to ale dělá to pořád to samé většinou se rožně růžová :)
ZAC:MOV A,#0
MOV R0,#255 ;RED
MOV R1,#249 ;GREN
MOV R2,#97 ;BLUE
HL: MOV R3,A ;DO R3 HODNORU A
SUBB A,R0
MOV A,R3
JNC RS
;/*MUZEM ZAPNOUT CERVENOU
CLR P3.4
MOV R3,A ;DO R3 HODNORU A
SUBB A,R1
MOV A,R3
JNC GS
;/*MUZEM ZAPNOUT ZELENOU
CLR P3.5
MOV R3,A ;DO R3 HODNORU A
SUBB A,R2
MOV A,R3
JNC BS
;/*MUZEM ZAPNOUT MODROU
CLR P3.6
INC A ;PRICTI K A JEDNICKU
CJNE A,#255,HL ;JESTE NENI MAXIMALNI HODNOTA MUZEME OPAKOVAT
JMP ZAC ;SKOK NA ZACATEK PROGRAMU
;/*VYPINANI*/
RS: SETB P3.4
RET
GS: SETB P3.5
RET
BS: SETB P3.6
RET
end
no me pripada ze si neco nahrajes a pak to menis... counter musi byt naprosto nezavislej a muze pocitat porad dokola... pak pouzit JZ po inkrementaci counteru a treba zapnout vsechny barvy ...
;; R0 red, R1 green, R2 blue, R3 counter
LOOP: MOV A, R0 ;; kopie R0
SUBB A, R3 ;; counter muze byt klidne R3 primo
JC RLIGHT
SETB P3.4
RLIGHT: MOV A, R1
SUBB A, R3 ;; counter muze byt klidne R3 primo
JC GLIGHT
SETB P3.5 ;; preskocit pokud jeste ma svitit (vypinat se bude pokazde)
GLIGHT: MOV A, R2
SUBB A, R3 ;; counter muze byt klidne R3 primo
JC BLIGHT
SETB P3.6
BLIGHT: INC R3 ;; tady se postarat o counter...
JNZ LOOP ;; pokud neni zero flag nastavenej skocit na zacatek
CLRB P3.4 ;; jinak vynulovat jednotlivy bity (jde vynulovat i naraz)
CLRB P3.5
CLRB P3.6
JMP LOOP ;; opakovat
neco takovyho sem mel na mysli... jen to neni overeny ze bude fungovat... jen nastrel
Jo a jeste to bezi moc rychle... chtelo by to pred inkrementaci aspon 40 mikrosekund pockat (aby nebyla obnovovaci frekvence moc rychla ze by to skoro nestihalo zobrazovat) 40us je pak na obnovovaci frekvenci kolem 100hz
j ty rety tam nemely co delat oddelal jsem je ale stejne to nedelalo to co melo.
Pouzil jsem program který jsi napsal + hodil 40us zpozdeni..
;; R0 red, R1 green, R2 blue, R3 counter
MOV R0,#255 ;RED
MOV R1,#210 ;GREN
MOV R2,#0 ;BLUE
MOV R3,#0
LOOP: MOV A, R0 ;; kopie R0
SUBB A, R3 ;; counter muze byt klidne R3 primo
JC RLIGHT
SETB P3.4
RLIGHT: MOV A, R1
SUBB A, R3 ;; counter muze byt klidne R3 primo
JC GLIGHT
SETB P3.5 ;; preskocit pokud jeste ma svitit (vypinat se bude pokazde)
GLIGHT: MOV A, R1
SUBB A, R3 ;; counter muze byt klidne R3 primo
JC BLIGHT
SETB P3.6
BLIGHT:
CALL ZP ;ZPOZDENI 40 US
INC R3 ;; tady se postarat o counter...
JNZ LOOP ;; pokud neni zero flag nastavenej skocit na zacatek
CLR P3.4 ;; jinak vynulovat jednotlivy bity (jde vynulovat i naraz)
CLR P3.5
CLR P3.6
JMP LOOP ;; opakovat
;#####Zpozdeni 40.0 us####
ZP: MOV TMOD,#00000001B
MOV TH0,#0FFH
MOV TL0,#0E7H
CLR TF0
SETB TR0;zapnem casovac
SEM: JNB TF0,SEM
CLR TR0 ;konec muzem vypnout casovac
RET
bohuzel pořád to nejde..
nejde jak?
v: GLIGHT: MOV A, R1 ma byt R2
Dal uz asi jen krokovat nekakym simulatorem ci podobne.
Pripadne rozjet aspon jednu barvu...a pak pridat ty zbyly az bude fungovat spolehlive
Odkrokoval jsem si to.
Místo JC má být JNC jinak to je ok..
Některé barvy už se alespoň přibližují ale když dám třeba žlutou:
MOV R0,#255 ;RED
MOV R1,#234 ;GREN
MOV R2,#0 ;BLUE
tak se ukáže červeno-oranžová :)
no ze zacatku pro nulu vznikne kratkej impuls kterej se asi taky projevi... v nejhorsim bys i to rozsviceni musel ridit nejakym JZ u odpovidajiciho R* registru aby se vubec nerozsvecovala kdyz je nastaveno na 0
ci tam mit neco jako
MOV A, R0 ;; kopie R0
SUBB A, R3 ;; counter muze byt klidne R3 primo
MOV bit_address, C ;; jen zjistit bitovou adresu pro P3.4 a doufat ze C neni obracene :D
MOV A, R1 ;; kopie R0
SUBB A, R3 ;; counter muze byt klidne R3 primo
MOV bit_address, C ;; jen zjistit bitovou adresu pro P3.5 a doufat ze C neni obracene :D
MOV A, R2 ;; kopie R0
SUBB A, R3 ;; counter muze byt klidne R3 primo
MOV bit_address, C ;; jen zjistit bitovou adresu pro P3.6 a doufat ze C neni obracene :D
;; dal jen inc, delay a skok na zacatek
mozna pujde pouzit primo P3.4 - P3.6
SUBB nastavi C pokud byl counter vetsi nez barva (jen zase bude asi problem s tim prvnim bitem...)
mozna obratit logiku
MOV R0,#255 ;RED
MOV R1,#255 ;GREN
MOV R2,#0 ;BLUE
MOV R3,#0
LOOP: MOV A, R0 ;; kopie R0
SUBB A, R3 ;; counter muze byt klidne R3 primo
MOV P3.4, C ;; jen zjistit bitovou adresu pro P3.4 a doufat ze C neni obracene :D
MOV A, R1 ;; kopie R0
SUBB A, R3 ;; counter muze byt klidne R3 primo
MOV P3.5, C ;; jen zjistit bitovou adresu pro P3.5 a doufat ze C neni obracene :D
MOV A, R2 ;; kopie R0
SUBB A, R3 ;; counter muze byt klidne R3 primo
MOV P3.6, C ;; jen zjistit bitovou adresu pro P3.6 a doufat ze C neni obracene :D
CALL ZP ;ZPOZDENI 40 US
INC R3 ;; tady se postarat o counter...
JMP LOOP ;; pokud neni zero flag nastavenej skocit na zacatek
Tohle je úplně to samé pořád to nedává žlutou jen takou světlou červenou :)
no pokud je to dobre, tak je todle asi jediny, co se z PWM da dostat... pripadne nesmatat primo na port ale vypocitat to a pak zapsat na port najednou (a dalo by se to pak pred tim i invertovat)
pripadne pouzit tu druhou verzi jak sem zminoval...
jeste by mohlo jit odecist od pocitadla hodnotu barvy, pak CPL C (negace Carry) a pak to poslat na bit portu tim MOV P3.4, C atd
tim vlastne dostanes z (barva<pocitadlo) !(pocitadlo>=barva) a pote kdyz pocitadlo = 0 a barva = 0 => 0-0 =0 C=0 => CPC C => C=1 -> P3.4 == nesviti a ani nezacne
zatimco ted je tam pro 0-0 = 0 C=0 -> P3.4 <= C (ledka se v tomto pripade rozsviti - ikdyz jen na moment)
Ahoj.
Není to generování PWM zbytečné?
Když u stejného prodejce mají za super cenu WS2811 http://netmart.cz/detail.aspx?id=202
Kdybys použil tyto, tak si ušetříš plno práce. Naprogramuješ si akorát komunikační protokol a máš to hotové.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Prodej: 15W bílá LED nebo RGB led — založil KIIV
RGB Led panel s PIC — založil Ares93
Vývoj HW a SW pro ovládání LED číslic — založil Richard01
Hledám programátora na vývoj HW a SW pro ovládání LED číslic — založil Richard01
Převod 15-bit RGB na 24-bit RGB — založil PiranhaGreg