C,C++, ASM
Moderátori: psichac, Moderátori
C,C++, ASM
Zdar pani!
Poradte ako pridat do kodu velke pole znakov ( binarka, obrazok,..) ci do RAM, alebo CODE, bez toho, abych to musel rucne vpisovat.
Poradte ako pridat do kodu velke pole znakov ( binarka, obrazok,..) ci do RAM, alebo CODE, bez toho, abych to musel rucne vpisovat.
0
Naposledy upravil/-a xmilos v 05 Aug 2013, 07:09, upravené celkom 1 krát.
Re: C,C++
ja by som pouzil takuto metodu:
a smotny subor diode.inc obsahuje data v tvare 0x01, 0x00, ... . Ale je mozne, zeby sa dal pouzit aj iny typ, ale ja som to riesil takto
Kód: Vybrať všetko
const char diode[] = {
#include "_sprites/diode.inc"
};
0
Re: C,C++
ten binar najprv musis konvertovat na tvar
teda pole 8-bitovych premennych s inicializatorom a potom supnut do zdrojaku.
Na tento ucel sa da pouzit asi nieco taketo
http://thomasfischer.biz/?p=434
http://www.deadnode.org/sw/bin2h/
Kedysi som si na to napisal malu win32 utilitku, ale neviem ju nast, dost dlho som ju nepouzival.
Kód: Vybrať všetko
unsigned char array[ARRAY_SIZE] = {0x01, 0x02 ... };
Na tento ucel sa da pouzit asi nieco taketo
http://thomasfischer.biz/?p=434
http://www.deadnode.org/sw/bin2h/
Kedysi som si na to napisal malu win32 utilitku, ale neviem ju nast, dost dlho som ju nepouzival.
0
Re: C,C++
Dalsia:
snazil som sa minimalizovat obsluhu pre LED display - klasicka matica pre 3 segmentovky. Ide to este nak zjednodusit ( nie zapisom, ale vyslednym kodom )? Prikladam len obsluhu casovaca, inicializacia pola, casovaca nie je kriticka.
snazil som sa minimalizovat obsluhu pre LED display - klasicka matica pre 3 segmentovky. Ide to este nak zjednodusit ( nie zapisom, ale vyslednym kodom )? Prikladam len obsluhu casovaca, inicializacia pola, casovaca nie je kriticka.
Kód: Vybrať všetko
ISR(TIMER0_OVF_vect)
{
unsigned char i = 0;
if(PORTB & 0xFE) PORTB &= 0x01; // strieda 50:50
else
{
if(!(PORTD & 0x04))
{
PORTD |= 0x04;
PORTD &= ~0x01;
}
else if(!(PORTD & 0x01))
{
PORTD |= 0x01;
i = 1;
PORTD &= ~0x02;
}
else if(!(PORTD & 0x02))
{
PORTD |= 0x02;
i = 2;
PORTD &= ~0x04;
}
PORTB |= pgm_read_byte(&(segm[displ[i]]));
}
}
0
-
- Ultimate člen
- Príspevky: 2328
- Dátum registrácie: 25 Jún 2013, 21:06
- Bydlisko: Krajné
- Vek: 57
- Kontaktovať používateľa:
Re: C,C++
Ahoj. Čo som zbežne pozrel tak segment zapínaš log 1 na bitoch 0,1,2 PORTD. Vidím tam ešte problém, že síce krátku, ale určite nejakú dobu ti svieti zlý znak na zlej pozícii. Záleží asi na dĺžke strojového cyklu, ale ja som tie chybné číslice za tmy videl, ako také tlejúce segmenty tam kde by nemali. Zjednodušiť sa to dá takto. Vo finále to o moc kratšie nebude, ale svieti vždy iba platný znak na správnom segmente. Vlastne aj ty by si mal nulovať PORTB lebo tam na konci ORneš kód znaku. Keby si mal 4 miestny tak sa ten posledný if dá zrušiť a nahradiť jedným AND a zmenou konštanty pre bázy.
písal som to z hlavy môže tam byť nejaký preklep.
Kód: Vybrať všetko
unsigned char bazy=1;
unsigned char segIndex=0;
ISR(TIMER0_OVF_vect)
{
unsigned char tmpPort;
if(PORTB & 0xFE) PORTB &= 0x01; // strieda 50:50
else
{
tmpPort=PORTD;
tmpPort &=0xF8;
tmpPort |=bazy;
PORTB=0x01 //zhasnem stary znak
PORTD=tmpPort;
PORTB |= pgm_read_byte(&(segm[displ[segIndex]]));
segIndexi++;
bazy=bazy<<1;
if (segIndex>=3){
segIndex=0;
bazy=1;
}
}
}
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
Re: C,C++
peterple
segmenty su zapojene na port B, spolocne elektrody na port D. Tym padom nie je zobrazovanie jednoznacne a ciste. Dokonca segmenty sa na jednu periodu casovaca vypnu ( kvoli znizeniu jasu ).
Odskusal som niekolko sytnaxov. Podmienka (PORTx & 0x01) sa prelozi na test s bitovymi operaciami, preto kod v C je dlhsi, ale v ASM je optimaplnejsi. Navyse by mal byt odolnejsi voci nekorektnym stavom premennych.
Podobny sposob cos dal som skusal pred tym, pre 3 segmenty vyssiel dlhsi.
boraicho
- "načo to je dobre toto čo sa tu rieši?"
aby som sa ja ale aj ini nieco nove dozvedeli
- "čo je zač to konvertovanie?"
ak mas na mysli pgm_read_byte(), je to sposob ako konstantu ( v mojom pripade zapojenie segmentoviek ) ulozil do programovej pamati, aby som usetril pamat datovu. Navyse linkr sikovnym sposobom vyuzil volne miesto a vysledok bol nezmenena dlzka programu, usetrene miesto v datovej pamati. Vo vysledom kode sa zmenila len jedna instrukcia z LD na LDM.
Aj preto sa to tu riesi.
A zaujimalo by ma aj riesenie asembleristov.
segmenty su zapojene na port B, spolocne elektrody na port D. Tym padom nie je zobrazovanie jednoznacne a ciste. Dokonca segmenty sa na jednu periodu casovaca vypnu ( kvoli znizeniu jasu ).
Odskusal som niekolko sytnaxov. Podmienka (PORTx & 0x01) sa prelozi na test s bitovymi operaciami, preto kod v C je dlhsi, ale v ASM je optimaplnejsi. Navyse by mal byt odolnejsi voci nekorektnym stavom premennych.
Podobny sposob cos dal som skusal pred tym, pre 3 segmenty vyssiel dlhsi.
boraicho
- "načo to je dobre toto čo sa tu rieši?"
aby som sa ja ale aj ini nieco nove dozvedeli
- "čo je zač to konvertovanie?"
ak mas na mysli pgm_read_byte(), je to sposob ako konstantu ( v mojom pripade zapojenie segmentoviek ) ulozil do programovej pamati, aby som usetril pamat datovu. Navyse linkr sikovnym sposobom vyuzil volne miesto a vysledok bol nezmenena dlzka programu, usetrene miesto v datovej pamati. Vo vysledom kode sa zmenila len jedna instrukcia z LD na LDM.
Aj preto sa to tu riesi.
A zaujimalo by ma aj riesenie asembleristov.
0
-
- Ultimate člen
- Príspevky: 2328
- Dátum registrácie: 25 Jún 2013, 21:06
- Bydlisko: Krajné
- Vek: 57
- Kontaktovať používateľa:
Re: C,C++, ASM
Tomuto nerozumiem. Prečo to nie je jednoznačné?xmilos napísal:segmenty su zapojene na port B, spolocne elektrody na port D. Tym padom nie je zobrazovanie jednoznacne a ciste.
xmilos napísal:A zaujimalo by ma aj riesenie asembleristov.
Napríklad takto:
Kód: Vybrať všetko
; r2 - hodnoty pre bazy (1, 2, 4)
; r3 - index (1-3)
disp:
push zh
push zl
push xl
in xl,sreg
push xl
;precitanie kodu znaku
ldi zl,low(displ-1)
ldi zh,high(displ-1)
add zl,r3
brcc noInc01
inc zh
noInc01: ld xl,Z
;konverzia do 7seg kodu
ldi zl,low(segm*2)
ldi zh,high(segm*2)
add zl,xl
brcc noInc02
inc zh
noInc02: lpm xl,Z ;prepokla sa mega
in zl,portd
andi zl,0xf8
or zl,r2
ldi zh,01
out portb,zh
out portd,zl
out portb,xl
rol r2
inc r3
sbrs r3,2 ;test posledneho segmentu
rjmp noInit
ldi xl,1
mov r2,xl
mov r3,xl
noInit:
pop xl
out sreg,xl
pop xl
pop zl
pop zh
reti
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
Re: C,C++, ASM
oops
chybycka sa vludila, mal som na mysli źobrazovanie je ciste, bez kratkodobeho prebliknutia.
Dik za ASM, idem ho postudovat.
Zaujimava myslienka ukladat rovno "zakodovany" obsah. A veru nie marna, pretoze je zbytocne konvertovat to kazdy cyklus pri vyobrazeni.
Kamarade za to ti patri +.
chybycka sa vludila, mal som na mysli źobrazovanie je ciste, bez kratkodobeho prebliknutia.
Dik za ASM, idem ho postudovat.
Zaujimava myslienka ukladat rovno "zakodovany" obsah. A veru nie marna, pretoze je zbytocne konvertovat to kazdy cyklus pri vyobrazeni.
Kamarade za to ti patri +.
0
-
- Ultimate člen
- Príspevky: 2328
- Dátum registrácie: 25 Jún 2013, 21:06
- Bydlisko: Krajné
- Vek: 57
- Kontaktovať používateľa:
Re: C,C++, ASM
Oko to asi nevidí pri 100ns strojovom cykle ale ten kod co si dal povôdne prepol najprv bázu a potom až údaj. Takže ak si mal na prvom segmente 8 a na druhom segmente 1. Tak ti chvíľočku svietila na druhom segmente osmička. Normálne si to asi ani nevšimneš. Ale keď som to robil takto ešte na 2051 tak som v tme videl že sa tie segmenty naozaj rozsvietili. A najviac som bol prekvapený z toho že to bolo ozaj pár inštrukcí. Kód bol v ASM. Som si myslel že za takú dobu tie ledky nestačia ani zareagovať. Že to oko zaregistruje som nemyslel ani vo sne. Odvtedy to robím vždy tak, že starý znak nahradím prázdym znakom, potom prepnem bázy až potom vyšlem nový znak. V takom prípade už je zobrazenie OK aj v tme.xmilos napísal:oops
chybycka sa vludila, mal som na mysli źobrazovanie je ciste, bez kratkodobeho prebliknutia.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
Re: C,C++, ASM
Pravdepodobne mas opacne LED segmentovky.
Znova:
anody ( jednotlive segmenty ) mam na porte B. Ten sa ako prvy vypina nazaciatku. Pocka sa jeden cyklus a prepne sa spolocna elektroda ( v mojom pripade katoda ) a na koniec sa opat zapne ( s novym obsahom ) port B.
Znova:
anody ( jednotlive segmenty ) mam na porte B. Ten sa ako prvy vypina nazaciatku. Pocka sa jeden cyklus a prepne sa spolocna elektroda ( v mojom pripade katoda ) a na koniec sa opat zapne ( s novym obsahom ) port B.
0
-
- Ultimate člen
- Príspevky: 2328
- Dátum registrácie: 25 Jún 2013, 21:06
- Bydlisko: Krajné
- Vek: 57
- Kontaktovať používateľa:
Re: C,C++, ASM
To je snáď jedno či je displej so spoločnou anódou alebo katódou.xmilos napísal:Pravdepodobne mas opacne LED segmentovky.
Aha tak to áno. To som si nemyslel že to 50% PWM je tam na toto. Lenže sa tak pripravuješ o jas čo je v prípade multiplexného displeja problém. Preto som do toho programu ani žiadne 50% PWM nemontoval. No a ak je jas vysoký tak ho znížim hodnotou odporov.Znova:
anody ( jednotlive segmenty ) mam na porte B. Ten sa ako prvy vypina nazaciatku. Pocka sa jeden cyklus a prepne sa spolocna elektroda ( v mojom pripade katoda ) a na koniec sa opat zapne ( s novym obsahom ) port B.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
Re: C,C++, ASM
Tak to je rozdiel pristupu. Ja som nedaval odpory, ale HW nahradil SW, t.j. znizil jas znizenim casu ked display svieti. katalog pre display uvadza, ze onen pulz moze dosiahnut az 100mA na segment, priemer vsak nesmie presiahnut 20mA. Co zapojenie splnuje. Navyse pin "neda" viac ako nakych 20mA.
Mno ci je spolocna anoda/ katoda nie je uplne jedno v tomto pripade, pretoze pri spolocnej anode moj kod vyprodukuje prave ten efekt kratkodobeho zapnutia vsetkych segmentov.
Mno ci je spolocna anoda/ katoda nie je uplne jedno v tomto pripade, pretoze pri spolocnej anode moj kod vyprodukuje prave ten efekt kratkodobeho zapnutia vsetkych segmentov.
0