Chtěl bych poradit jestli v tomto programu nedelam nejakou stupidni chybu?? Dekuji potrebuji hazet ruzne hodnoty, ktere nemaji mezi sebou zadne mat souvislosti.
[code]void vloz(volatile unsigned int i)
{
volatile int j;
volatile int pole[80];
Při 1kB by ten problém ještě vzniknout neměl, ale záleží taky na zbytku programu.
Máš tam pouze hodnoty 0 a 1. Skutečně potřebuješ “int”? to je totiž 16bit celé číslo se znaménkem. Jesli to není potřeba, tak program zbytečně zpomaluješ .
Nadměrným používáním volatile zase omezuješ překladač v optimalizacích, často zbytečně.
Zadej pole jako globální a třeba i takto:
static unsigned char pole[80]={1,0,1,0,1,1,1,1,1,0,1,0,1,0,1,0,0,0,1,0,1,1,1,0,1,0,1,0,1,0,0,0,0,0,1,1,1,0,1,0…atd. }; a ve funkci nech jenom to for
Tak tak, pole nadeklaruješ globálně, tedy mimo jakoukoli funkci. Inicializovat ho pak můžeš kteroukoli funkcí.
Koukám, že pole inicializuješ po osmicích a nevyužíváš všechny prvky (zřejmě pro jednoduchost programu).
Co kdybysme snížili paměťové nároky pro tvoje pole z původních 200B (při použítí int) na pouhých 10B? Je pravda, že několik binárních posunů bude nepatrně pomalejší než přímý přístup na index v poli, ale řekl bych, že ušetřená RAM za to stojí.
Způsob práce s takto zredukovaným polem jsem se pokusil naznačit níže.
V simulátoru ten program běží, je pro tiny2313.
int main (void)
{
pole[0]=0b11001101;
pole[1]=0b11000101;
unsigned char i, j;
for(;;)
{
for(i=0; i<2; i++)
{
for(j=0; j<8; j++)
{
// výsledkem "(pole*>>j) & 0x01" je bit na pozici "j" v bytu "pole*".
// Nejdříve posun žádaného bitu doprava, pak vymaskování ostatních
if((pole*>>j) & 0x01)
{
PORTB |= 1<<PB0;
}
else
{
PORTB &= ~(1<<PB0);
}
}
}
}
return 0;
dekuji za rady (taky se s nich snazim poucit), ale jeste nemam vsechny doresene.
Ale nastal tu takovy mensi problem.
Potrebuji volat vzdy osmici cisel a to v presnem poradi a zaroven volat tutez osmici v jinem poradi. Delat druhou tabulku (uz ta prvni je jeste hnusna) asi neni nejlepsi napad. A tak jsem si udelal malou korekcni (to druhe volani je vzdy stejne “jine”). Ale ouha funguje to spravne az na mensi problem ze to nekde dela nejake “nesmyslne” chyby (ja nemuzu prijit jake).
Tak prosim jestli nekdo neporadi.
Pokud z meho popisu nechapete o co mi jde, tak se pokusim o lepsi (a take asi delsi a podrobnejsi) popis.
Moc dekuji za pomoc.
Nakonec prikladam zdrojak one osudne funkce.
[code]void vloz(volatile unsigned int i)
{
volatile int j;
volatile int k;
volatile int l;
parametr funkce nedávej volatile, vždy se čte 1x jeho změna externí událostí za chodu funkce bude určitě nežádoucí.
Všechny proměnné musí být deklarovány na začátku funkce. Teprve po všech deklaracích můžeš hodnoty postupně definovat.
Řekl bych také, že definice tímto způsobem budou negativně ovlivňovat velikost kódu oproti výsledku zamýšleném použitím static.
V tomto případě nedávej ani ostatní proměnné volatile, není žádná externí událost, která by je mohla měnit a připravuješ se o optimalizace.
Proč všude požíváš int (16bit), když největší císlo nepřekročí ani 5 (vejde se do char).
Korekce nemůžeš mít unsigned int, protože to “unsigned” znamená neznaménkové číslo a ty tam ukládáš čísla se znaménkem.
Co to má dělat? Přijde mi to jako nehorázný plejtvání pamětí, jaký jsem snad ještě neviděl.
Nemají ty čísla v jednotlivých prvcích pole jen význam rozsvíceného/zhasnutého segmentu na displayi? Potom by bylo vytvoření pole tímto způsobem nesmyslné (ikdyž bohužel funkční).
Navíc hodnoty v těch polích nikde neměníš(jsou pouze pro čtení), bylo by vhodné je umístit do FLASH, ale to až budeš trochu zkušenější.