Проблема:
Код: Выделить всё
unsigned int m_ch [10] = {
0b00111111,
0b00000110,
0b01011011,
0b01001111,
0b01100110,
0b01101101,
0b01111101,
0b00000111,
0b01111111,
0b01101111
};
void send_byte(unsigned int byte)
{
PORTB &= ~(1<<0);
for(unsigned int mask = 0b10000000;mask;mask>>=1)
{
if(m_ch[byte]&mask){PORTB |= (1<<5);}
else {PORTB &= ~(1<<5);}
PORTB |= (1<<7);
PORTB &= ~(1<<7);_delay_us(5);
}
PORTB |= (1<<0);_delay_ms(1000);
}
void main (void)
{
DDRB=0xFF;
//test();
send_byte(1);
send_byte(2);
send_byte(3);
while(1);
}Первый вызов функции проходит и на 3-х индикаторах светятся 1 (единицы).
Первый же вызов функции зацикливается.
Пробовал таким образом:
Код: Выделить всё
void test()
{
PORTB &= ~(1<<0);_delay_ms(10);
for(unsigned int mask = 0b10000000;mask;mask>>=1)
{
if(m_ch[3]&mask){PORTB |= (1<<5);}
else {PORTB &= ~(1<<5);}
PORTB |= (1<<7);_delay_ms(10);
PORTB &= ~(1<<7);_delay_ms(10);
}
PORTB |= (1<<0);_delay_ms(1000);
//****
PORTB &= ~(1<<0);_delay_ms(10);
for(unsigned int mask = 0b10000000;mask;mask>>=1)
{
if(m_ch[4]&mask){PORTB |= (1<<5);}
else {PORTB &= ~(1<<5);}
PORTB |= (1<<7);_delay_ms(10);
PORTB &= ~(1<<7);_delay_ms(10);
}
PORTB |= (1<<0);_delay_ms(1000);
//*****
PORTB &= ~(1<<0);_delay_ms(10);
for(unsigned int mask = 0b10000000;mask;mask>>=1)
{
if(m_ch[5]&mask){PORTB |= (1<<5);}
else {PORTB &= ~(1<<5);}
PORTB |= (1<<7);_delay_ms(10);
PORTB &= ~(1<<7);_delay_ms(10);
}
PORTB |= (1<<0);_delay_ms(1000);
//exit();
}
void main (void)
{
DDRB=0xFF;
test();
while(1);
}Итог: Цифры 3,4 и 5 бегают по кругу.
Тов. Мявтор подкинул проэкт в Протеусе - все работает.
На реальном "станке" же опять с функции выйти не могу.
Код: Выделить всё
spi(1);
spi(2);
spi(3);-> Результат тот же. На 2-х индикаторах светится "1".
Где копать? В FUSE-ах?
Mega162, 3.6864 Mz. Выставлен только SUT0=0.
Надеюсь на ваши мудрые советы.
Спасибо!
