ATmega8 - začátečník - vstup nereáguje

Chtel bych se zeptat jestli nekde nedelam chybu:

tento program ma funkci zobraz kterou zobrazi na 7-segmentovku cislo od 0 - 19.
Program by mel zobrazit 0 pri zadnem vstupu na PORTUD0, 1 pri vstupu

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

void pockej(unsigned int num)
{
volatile unsigned int i,j;
for (j = 0; j < 10; j++)
for (i = 0; i < num; i++)
{} //nop; neboli no-operation
}

void zobraz(unsigned int i)
{
if (i < 10)
{
PORTD |= _BV(PD7);
PORTD |= _BV(PD6);
}

if (i > 9)
{
	i = i - 10;

	PORTD &= ~(_BV(PD7));
	PORTD &= ~(_BV(PD6));
}

if (i == 0)
{
	PORTB = 0b00001000;
}

if (i == 1)
{
	PORTB = 0b01101110;
}

if (i == 2)
{
	PORTB = 0b00010100;
}

if (i == 3)
{
	PORTB = 0b01000100;
}

if (i == 4)
{
	PORTB = 0b01100010;
}

if (i == 5)
{
	PORTB = 0b01000001;
}

if (i == 6)
{
	PORTB = 0b00000001;
}

if (i == 7)
{
	PORTB = 0b01101100;
}

if (i == 8)
{
	PORTB = 0b00000000;
}

if (i == 9)
{
	PORTB = 0b01000000;
}

}

int main(void)
{
volatile unsigned int i;

DDRB = 0b11111111;
DDRD = 0b11111110;


while(1)
{
	if ((PORTD &&  0b00000001) == 0b00000001)
	{
		zobraz(1);
	}
	else
	{
		zobraz(0);
	}


}

}
[/code]

Cteni z pinu je pres PIN.
int je 16bit promenna, tady by ti stacil unsigned char :wink:
v podmince je taky chybka: && je logicky soucin, tady potrebuje bitovy. Dale jakakoli hodnota mimo 0 je true, potom staci toto:
if(PIND & 0b00000001){}
nebo jeste lepe “if(PIND & (1<<PD0)){}”. Sice je to shodny zapis, ale prehlednejsi.

To hejno ifu by taky bylo vhodnejsi nahradit jinou konstrukci :slight_smile:

[code]switch (i)
{
case 0:
//nejaky kod
break;
case 1:
//dalsi
break;

//atd....
default:
	//kdyz je mimo moznosti v case
	break;

}[/code]
Ty podminky (i < 10) a (i > 9) pak vlozis do casti “default”.

Hey moc diky, takova malickost a uz to funguje