C,C++, ASM

C,C++,C#

Moderátori: psichac, Moderátori

Používateľov profilový obrázok
xmilos
Ultimate člen
Ultimate člen
Príspevky: 3671
Dátum registrácie: 04 Máj 2011, 00:00
Bydlisko: Povazie

C,C++, ASM

Príspevok od používateľa xmilos » 17 Jún 2013, 10:11

Zdar pani!
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.

Používateľov profilový obrázok
Andy99
Stály člen
Stály člen
Príspevky: 339
Dátum registrácie: 05 Mar 2008, 00:00
Bydlisko: BA
Vek: 35

Re: C,C++

Príspevok od používateľa Andy99 » 17 Jún 2013, 10:27

ja by som pouzil takuto metodu:

Kód: Vybrať všetko

const char diode[] = {
#include "_sprites/diode.inc"
};
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 ;)
0

Používateľov profilový obrázok
xmilos
Ultimate člen
Ultimate člen
Príspevky: 3671
Dátum registrácie: 04 Máj 2011, 00:00
Bydlisko: Povazie

Re: C,C++

Príspevok od používateľa xmilos » 17 Jún 2013, 10:28

2 Andy tak podobne som to riesil, ale ja potrebujem binaku.
Ale aj tak diky!
0

Používateľov profilový obrázok
jaromir
Power user
Power user
Príspevky: 4538
Dátum registrácie: 08 Júl 2011, 00:00
Vek: 40

Re: C,C++

Príspevok od používateľa jaromir » 17 Jún 2013, 10:30

ten binar najprv musis konvertovat na tvar

Kód: Vybrať všetko

unsigned char array[ARRAY_SIZE] = {0x01, 0x02 ... };
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.
0

Používateľov profilový obrázok
xmilos
Ultimate člen
Ultimate člen
Príspevky: 3671
Dátum registrácie: 04 Máj 2011, 00:00
Bydlisko: Povazie

Re: C,C++

Príspevok od používateľa xmilos » 17 Jún 2013, 10:34

2 Jaromir
tak takto som to robil, ( notepad++ ) ale hladam sofistikovanejsi postup. Prave studujem switch - e linkera.
0

Používateľov profilový obrázok
xmilos
Ultimate člen
Ultimate člen
Príspevky: 3671
Dátum registrácie: 04 Máj 2011, 00:00
Bydlisko: Povazie

Re: C,C++

Príspevok od používateľa xmilos » 17 Jún 2013, 13:08

Hmmm
toto naznacuje, ze je to jedina spravna cesta

http://www.keil.com/support/docs/2218.htm
0

Používateľov profilový obrázok
petersno
Ultimate člen
Ultimate člen
Príspevky: 2774
Dátum registrácie: 06 Aug 2011, 00:00
Bydlisko: ba
Vek: 63

Re: C,C++

Príspevok od používateľa petersno » 17 Jún 2013, 14:15

ak pohoris, daj vediet. urobit prevodnik pod win nebude problem
0

Používateľov profilový obrázok
xmilos
Ultimate člen
Ultimate člen
Príspevky: 3671
Dátum registrácie: 04 Máj 2011, 00:00
Bydlisko: Povazie

Re: C,C++

Príspevok od používateľa xmilos » 17 Jún 2013, 16:26

Tak ako som pisal, v notepad ++ to slo elegantne, momentalne pracujem na Jscripte.
Este mi upresnite, akym sposobom ( kolko typov existuje ) sa rata checksum.
Som len prekvapeny, ze vzhladom na pocet riesitelov je len jedno take trosku tazkopadne riesenie.
0

Používateľov profilový obrázok
xmilos
Ultimate člen
Ultimate člen
Príspevky: 3671
Dátum registrácie: 04 Máj 2011, 00:00
Bydlisko: Povazie

Re: C,C++

Príspevok od používateľa xmilos » 17 Jún 2013, 17:58

Tak nieco som nasiel:
1 Keil ma jednu skrytu utilitku: Bin2C.exe - robi to, ako sa to vola :--)
2 Nasiel som este iny postup:
http://infocenter.arm.com/help/index.js ... ccaghf.htm
0

Používateľov profilový obrázok
xmilos
Ultimate člen
Ultimate člen
Príspevky: 3671
Dátum registrácie: 04 Máj 2011, 00:00
Bydlisko: Povazie

Re: C,C++

Príspevok od používateľa xmilos » 04 Aug 2013, 19:32

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.

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

Používateľov profilový obrázok
boraicho
Ultimate člen
Ultimate člen
Príspevky: 12406
Dátum registrácie: 03 Feb 2007, 00:00
Bydlisko: Prešov
Vek: 35
Kontaktovať používateľa:

Re: C,C++

Príspevok od používateľa boraicho » 04 Aug 2013, 20:04

načo to je dobre toto čo sa tu rieši? dkiky. a čo je zač to konvertovanie?prosim trochu objasniť diky.
0
"Aj nevinne vyzerajúca súčiastka, môže byť príčinou nefunkčnosti zariadenia a tou kondenzator 100% je"
3D REBEL II + PLA + PETG
CNC 1810 na DPS

peterple
Ultimate člen
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++

Príspevok od používateľa peterple » 04 Aug 2013, 20:59

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.

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;
      }
     }
}
písal som to z hlavy môže tam byť nejaký preklep.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
xmilos
Ultimate člen
Ultimate člen
Príspevky: 3671
Dátum registrácie: 04 Máj 2011, 00:00
Bydlisko: Povazie

Re: C,C++

Príspevok od používateľa xmilos » 05 Aug 2013, 06:44

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.
0

Používateľov profilový obrázok
xmilos
Ultimate člen
Ultimate člen
Príspevky: 3671
Dátum registrácie: 04 Máj 2011, 00:00
Bydlisko: Povazie

Re: C,C++

Príspevok od používateľa xmilos » 05 Aug 2013, 07:00

skusam to s tymto, co je tiez skor pre pamatnikov.
Prílohy
firsttest.jpg
0

peterple
Ultimate člen
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

Príspevok od používateľa peterple » 05 Aug 2013, 15:13

xmilos napísal:segmenty su zapojene na port B, spolocne elektrody na port D. Tym padom nie je zobrazovanie jednoznacne a ciste.
Tomuto nerozumiem. Prečo to nie je jednoznačné?
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
Skrátiť sa to dá ešte tak, že do poľa displ si dám už rovno kódy ktoré idú von a tak odpadne tá konverzia z pamäte programu. Samozrejme sa o to musí postarať hlavný program pri výpise do poľa. A ešte ak zabezpečíš že tie polia nebudú cez stránku tak sa dajú ušetriť tie testy čo posúvajú horný byte ukazateľa.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
xmilos
Ultimate člen
Ultimate člen
Príspevky: 3671
Dátum registrácie: 04 Máj 2011, 00:00
Bydlisko: Povazie

Re: C,C++, ASM

Príspevok od používateľa xmilos » 05 Aug 2013, 20:19

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 +.
0

peterple
Ultimate člen
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

Príspevok od používateľa peterple » 05 Aug 2013, 22:06

xmilos napísal:oops
chybycka sa vludila, mal som na mysli źobrazovanie je ciste, bez kratkodobeho prebliknutia.
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.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
xmilos
Ultimate člen
Ultimate člen
Príspevky: 3671
Dátum registrácie: 04 Máj 2011, 00:00
Bydlisko: Povazie

Re: C,C++, ASM

Príspevok od používateľa xmilos » 06 Aug 2013, 06:39

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.
0

peterple
Ultimate člen
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

Príspevok od používateľa peterple » 06 Aug 2013, 08:05

xmilos napísal:Pravdepodobne mas opacne LED segmentovky.
To je snáď jedno či je displej so spoločnou anódou alebo katódou.
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.
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.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
xmilos
Ultimate člen
Ultimate člen
Príspevky: 3671
Dátum registrácie: 04 Máj 2011, 00:00
Bydlisko: Povazie

Re: C,C++, ASM

Príspevok od používateľa xmilos » 06 Aug 2013, 08:30

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.
0

Napísať odpoveď