/* CPU1 HW: ATmega644 14,7456MHz, 5V Nastavenie: Interny OSC 14,7456MHZ, zmenené default fuses od výroby na -rW01100111 */ #include #include #include //#include #define SYSCLK (14745600.0) #define USEC(usec) (usec*SYSCLK/1.0/256.0/14745600.0+0.5) // timer clocks per microsecond //define pre seriovu komunikaciu 14,7456MHz, baud 9600, chybovost 0,0% #define FOSC 14745600 // Clock Speed #define BAUD 9600 #define MYUBRR FOSC/16/BAUD-1 // Globalne premenne char nastav_semafory = 0; void USART_Init(unsigned int ubrr) { // Set baud rate UBRR0H = (unsigned char)(ubrr>>8); UBRR0L = (unsigned char)ubrr; // Enable receiver and transmitter UCSR0B = (1<>>>> Prerušenie USART prijatý znak ISR (USART0_RX_vect) { unsigned char s_vstup = 0; char s_vlak = 0; s_vstup = USART_Receive(); // Zrusi prijatie zmien, ktore posle ten isty CPU, aby sa tu neobsadila trat cez vzdialene obsadenie if (s_posledna_poslana_hodnota == s_vstup) { goto g_koniec; } if (((s_vstup & (1 << 7)) == 0) & ((s_vstup & (1 << 6)) == 0) & ((s_vstup & (1 << 5)) == 0)) { // voľné goto g_koniec; } if (((s_vstup & (1 << 7)) == 0) & ((s_vstup & (1 << 6)) == 0) & ((s_vstup & (1 << 5)) > 0)) { s_vlak = 1; goto g_s_vlak; } if (((s_vstup & (1 << 7)) == 0) & ((s_vstup & (1 << 6)) > 0) & ((s_vstup & (1 << 5)) == 0)) { s_vlak = 2; goto g_s_vlak; } if (((s_vstup & (1 << 7)) == 0) & ((s_vstup & (1 << 6)) > 0) & ((s_vstup & (1 << 5)) > 0)) { s_vlak = 3; goto g_s_vlak; } if (((s_vstup & (1 << 7)) > 0) & ((s_vstup & (1 << 6)) == 0) & ((s_vstup & (1 << 5)) == 0)) { s_vlak = 4; goto g_s_vlak; } if (((s_vstup & (1 << 7)) > 0) & ((s_vstup & (1 << 6)) == 0) & ((s_vstup & (1 << 5)) > 0)) { s_vlak = 5; goto g_s_vlak; } g_s_vlak: if (s_vlak > 0) { ZmenTratVlaku(s_vlak, s_vstup & 0x1F); } if (((s_vstup & (1 << 7)) > 0) & ((s_vstup & (1 << 6)) > 0) & ((s_vstup & (1 << 5)) == 0)) { //uvolní trať UvolniTrat(s_vstup & 0x1F); goto g_koniec; } if (((s_vstup & (1 << 7)) > 0) & ((s_vstup & (1 << 6)) > 0) & ((s_vstup & (1 << 5)) > 0)) { //obsadí trať ObsadiTrat(s_vstup & 0x1F); } g_koniec: ; } int main(void) { //Nastavenie vstupov a výstupov DDRA = 0x00; PORTA = 0x00; DDRB = 0x0F; PORTB = 0x00; DDRC = 0x00; PORTC = 0x00; DDRD = 0xFE; PORTD = 0x00; // Inicializacia seriovej komunikacie USART0 a prerusenia pre prijem USART_Init(MYUBRR); UCSR0B |= (1 << RXCIE0); // Povolenie prerušnia pre príjem RX sei(); // Povolenie globálneho prerušenia while(1) { //........ } return (0); }