funkce kde používám pole - program se v ni zacyklí ???

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];

pole[1] = 1;
pole[2] = 0;
pole[3] = 1;
pole[4] = 0;
pole[5] = 1;
pole[6] = 0;
pole[7] = 1;
pole[8] = 0;

pole[11] = 1;
pole[12] = 1;
pole[13] = 1;
pole[14] = 1;
pole[15] = 0;
pole[16] = 0;
pole[17] = 0;
pole[18] = 0;

pole[21] = 0;
pole[22] = 0;
pole[23] = 0;
pole[24] = 0;
pole[25] = 1;
pole[26] = 1;
pole[27] = 1;
pole[28] = 1;

pole[31] = 1;
pole[32] = 1;
pole[33] = 0;
pole[34] = 0;
pole[35] = 1;
pole[36] = 1;
pole[37] = 0;
pole[38] = 0;

pole[41] = 0;
pole[42] = 0;
pole[43] = 1;
pole[44] = 1;
pole[45] = 0;
pole[46] = 0;
pole[47] = 1;
pole[48] = 1;

pole[51] = 1;
pole[52] = 1;
pole[53] = 0;
pole[54] = 1;
pole[55] = 1;
pole[56] = 0;
pole[57] = 1;
pole[58] = 1;

pole[61] = 0;
pole[62] = 0;
pole[63] = 1;
pole[64] = 0;
pole[65] = 0;
pole[66] = 1;
pole[67] = 0;
pole[68] = 0;

pole[71] = 1;
pole[72] = 1;
pole[73] = 1;
pole[74] = 1;
pole[75] = 1;
pole[76] = 1;
pole[77] = 1;
pole[78] = 1;

pole[81] = 1;
pole[82] = 1;
pole[83] = 1;
pole[84] = 1;
pole[85] = 1;
pole[86] = 1;
pole[87] = 0;
pole[88] = 0;

pole[91] = 0;
pole[92] = 1;
pole[93] = 0;
pole[94] = 0;
pole[95] = 0;
pole[96] = 0;
pole[97] = 0;
pole[98] = 0;

for (j=10 * i;j<(10*i + 9);j++)
{
	data(pole[j]);hodiny();

// pockej(TIME);
}

}[/code]

Jaký máš procesor? mohl by ses dostat do stejné situace jako zde: https://forum.mcontrollers.com/t/pole-64b-na-tiny-s-128b-sram/906/1

používám ATmega8

Diky za radu. To pole jsem udelal statyckým a už to snad funguje dobře.

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š :wink:.
Nadměrným používáním volatile zase omezuješ překladač v optimalizacích, často zbytečně.

Ja vlastne z toho pole jen čtu.
Tak bych ho vlasne nemusel pri kazdem zavolani funkce plnit furt stejnyma hodnotama?

Tak jsem se chtel zeptat jak mam pole teto funkci “predlozit”, aby na nej vydela i kdyz pole inizializuju v hlavnim programu pred nekonecnou smyckou.?

Predem dekuju

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í. :wink:
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.

[code]
#include <avr/io.h>
#include <avr/interrupt.h>

static unsigned char pole[2];

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;

}[/code]***

Ještě jsem si všiml několika chyb,které máš v pův. kódu:

deklarováných máš 80 členů pole, ale definovaných 99!

pamatuj, že jednotlivé členy pole začínají od “0”, takže správně bys měl začínat

pole[0] = 1;
pole[1] = 1;
atd…

tady to sice nevadí (kromě toho, že zbytečně blokuješ místo v paměti), ale příště by se ti to mohlo vymstít.

Ahoj,

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;

static volatile unsigned int korekce[8];

korekce[0] = 4;
korekce[1] = 4;
korekce[2] = 3;
korekce[3] = 0;
korekce[4] = -4;
korekce[5] = -4;
korekce[6] = -3;
korekce[7] = 0;

static volatile unsigned int pole[100];

pole[1] = 1;
pole[2] = 1;
pole[3] = 0;
pole[4] = 1;
pole[5] = 1;
pole[6] = 1;
pole[7] = 1;
pole[8] = 1;

pole[11] = 1;
pole[12] = 0;
pole[13] = 0;
pole[14] = 0;
pole[15] = 0;
pole[16] = 0;
pole[17] = 1;
pole[18] = 1;

pole[21] = 1;
pole[22] = 1;
pole[23] = 1;
pole[24] = 0;
pole[25] = 1;
pole[26] = 1;
pole[27] = 0;
pole[28] = 1;

pole[31] = 1;
pole[32] = 1;
pole[33] = 1;
pole[34] = 0;
pole[35] = 0;
pole[36] = 1;
pole[37] = 1;
pole[38] = 1;

pole[41] = 1;
pole[42] = 0;
pole[43] = 1;
pole[44] = 1;
pole[45] = 0;
pole[46] = 0;
pole[47] = 1;
pole[48] = 1;

pole[51] = 0;
pole[52] = 1;
pole[53] = 1;
pole[54] = 1;
pole[55] = 0;
pole[56] = 1;
pole[57] = 1;
pole[58] = 1;

pole[61] = 0;
pole[62] = 1;
pole[63] = 1;
pole[64] = 1;
pole[65] = 1;
pole[66] = 1;
pole[67] = 1;
pole[68] = 1;

pole[71] = 1;
pole[72] = 1;
pole[73] = 0;
pole[74] = 0;
pole[75] = 0;
pole[76] = 0;
pole[77] = 1;
pole[78] = 1;

pole[81] = 1;
pole[82] = 1;
pole[83] = 1;
pole[84] = 1;
pole[85] = 1;
pole[86] = 1;
pole[87] = 1;
pole[88] = 1;

pole[91] = 1;
pole[92] = 1;
pole[93] = 1;
pole[94] = 1;
pole[95] = 0;
pole[96] = 1;
pole[97] = 1;
pole[98] = 1;

j = i % 10;
k = i / 10;

for (l=0;l<8;l++)
{
	data(pole[k * 10 + l + 1],pole[j * 10 + l + 1 + korekce[l]]);hodiny();
}

}[/code]

Zdar,

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. :frowning:
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ší.

Ahoj,
diky za dobre rady, uz jsem to trosku umravnil a funguje mi to, nevim co bych bez vas delal.

xlfd