Prosím Vás, mám taký problém, že mnou napísaný program v C mi neskompiluje tak ako by mal. Ako náhle chcem začať simulovať, program nezačína na začiatku v main, ale najskôr začne skákať po rôznych riadkoch v celom programe (stále tých istých pri každej simulácií) a asi po 5-6 skoku program normálne začne pracovať. Skúšal som zakomentovať dané riadky, ale začalo to po iných riadkoch skákať. Pozeral som sa aj v disassembly, ako to tam krokuje a je to tam poprehadzované. Hľadal som aj po internete, ale žiadne riešenie som nenašiel. Mám operačný systém Windows 8, Atmel Studio 6.2.1153, notebook je tri dni starý, optimalizáciu mám nastavenú na -Os, skúšal som aj iné, ale bez zmeny.
tu je môj program, ešte nedokončený, možno s chybami (som ešte len začiatočník)
je to komunikácia cez UART (atmega16) s displejom ulcd 32ptu
Kód: Vybrať všetko
#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
volatile uint8_t nevybrane_UART=0;
volatile uint8_t prijate_data[6];
volatile uint8_t data_odosielanie[6];
uint8_t prijem_dokonceny=0;
uint8_t n=0, m=0, j=0;
uint8_t ziad_hodnota=0;
uint8_t odoslanie=0;
/**********************************************/
void init_UART(void)
{
UBRRL=105;
UBRRH=0;
UCSRB|=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
UCSRC|=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}
/*******************************************/
void odosielanie_UART(uint8_t DATA)
{
UDR=DATA;
}
/****************************************/
uint8_t prijem_UART(void)
{
uint8_t data_UART;
data_UART=UDR;
return(data_UART);
}
/****************************************/
void NACK(void)
{
odosielanie_UART(0x15);
}
/****************************************/
void ACK(void)
{
odosielanie_UART(0x06);
}
/****************************************/
ISR(USART_RXC_vect)
{
nevybrane_UART=1;
}
int main(void)
{
init_UART();
DDRD|=0b00000100;
PORTD|=255;
sei();
while(1)
{
if(nevybrane_UART)
{
prijate_data[n]=prijem_UART();
++n;
if (n==6)
{
n=0;
if (prijate_data[5] == (prijate_data[0] ^ prijate_data[1] ^ prijate_data[2] ^ prijate_data[3] ^ prijate_data[4]) )
{
prijem_dokonceny=1;
ACK();
}
else
{
prijem_dokonceny=0;
NACK();
}
}
nevybrane_UART=0;
}
if ((prijem_dokonceny==1)&&(prijate_data[1]==0x0D))
{
if(m==2)
{
ziad_hodnota=0;
m=0;
}
else
{
ziad_hodnota=10*ziad_hodnota+(prijate_data[4]-0x30);
data_odosielanie[0]=0x01;
data_odosielanie[1]=0x0F;
data_odosielanie[2]=0x07;
data_odosielanie[3]=0x00;
data_odosielanie[4]=ziad_hodnota;
odoslanie=1;
++m;
}
}
if ((prijate_data[1]==0x06)&&(prijate_data[2]==0x08))
{
data_odosielanie[0]=0x01;
data_odosielanie[1]=0x0F;
data_odosielanie[2]=0x05;
data_odosielanie[3]=0x00;
data_odosielanie[4]=ziad_hodnota;
odoslanie=1;
}
if (odoslanie==1)
{
j=0;
while (j!=6)
{
if(UCSRA&=(1<<UDRE))
{
data_odosielanie[5]=data_odosielanie[4] ^ data_odosielanie[3] ^ data_odosielanie[2] ^ data_odosielanie[1] ^ data_odosielanie[0];
odosielanie_UART(data_odosielanie[j]);
++j;
}
}
odoslanie=0;
}
}
}
žltá šipka ukazuje na začiatok programu a postupne ide dole