/* * Ext.cpp * * Created: 23.8.2014 21:02:45 * Author: Petr * Program do externího displeje Nevcehle pro obsluhu Petrovické, nebo Jindřichovické časomíry. * Komunikace 9600 Bd, 8 bitů, 1 stop-bit, bez parity. * Formát přijímacího rámce: * * * Význam příkazu: * Start 0x11 * Stop 0x13 * Reset 0x12 * Zobraz 0x14 * CRC = XOR všech přijatých bytů STX xor PRIKAZ xor ... * Odpověď 1 byt: ACK 0x06 provedení příkazu * NAK 0x15 neodpovídá CRC * Formát znaku v hexa: 0 = 0x03 nebo 0x01 * 1 = 0x7B nebo 0x79 * 2 = 0x46 nebo 0x44 * 3 = 0x4A nebo 0x48 * 4 = 0xBA nebo 0xB8 * 5 = 0x8A nebo 0x88 * 6 = 0x82 nebo 0x80 * 7 = 0x5B nebo 0x59 * 8 = 0x02 nebo 0x00 * 9 = 0x0A nebo 0x08 * nic = 0xFF */ #include #include #define F_CPU 8000000UL #include #define FALSE 0 #define TRUE 1 char data[12]; const char znak[] = {63,6,91,79,102,109,125,7,127,111,115,56,0,64}; //kod pro zobrazení čísla a znaku //unsigned char sbuf[9]; unsigned char usart_data[9]; unsigned char usart_adr = 0; char timer_stop = FALSE; char timer_comp = FALSE; char usart_crc = FALSE; char usart_end_rx = FALSE; char usart_interrupt = FALSE; char usart_posledni_byte = FALSE; ISR(TIMER1_COMPA_vect) { //timer_comp = TRUE; if(++data[0]>=10) //zvýšení a vyhodnocení setin { data[0] = 0; if(++data[1]>=10) //zvýšení a vyhodnocení desetin { data[1] = 0; if (++data[2]>=10) //zvýšení a vyhodnocení vteřin { data[2] = 0; if (data[3] == 0x0C) data[3]=0; if (++data[3]>=10) //zvýšení a vyhodnocení desítek { data[3] = 0; if (data[4] == 0x0C) data[4]=0; if (++data[4]>=10) //zvýšení a vyhodnocení stovek { data[3] = 0x0C; data[4] = 0x0C; } } } } } } ISR(USART_RXC_vect) { char read = UDR; if (read == 0x02) //pokud to je první byte, vynuluje počitadlo přijatých bytu { usart_adr = 0; } if (usart_posledni_byte) //jestliže je nastaven, jedná se o byt CRC a již nezvíší počet přijatých bytu { usart_data[usart_adr] = read; usart_crc = TRUE; //usart_end_rx = TRUE; usart_posledni_byte = FALSE; } else { usart_data[usart_adr++] = read; //uloží byt a zvýčí počet přijatých bytu if (read == 0x03) //pokud se jedná o ETX nastaví poslední byt { usart_posledni_byte = TRUE; } } if (usart_crc) //vypočíta CRC a porovná s přijatým { usart_crc = FALSE; unsigned char crc = 0; for (int t = 0; t <= (usart_adr - 1); t++) { crc = crc xor usart_data[t]; } if (crc == usart_data[usart_adr]) { /*for (int i = 0; i<=9; i++) { usart_data[i] = sbuf[i]; }*/ usart_end_rx = TRUE; } else { UDR = 0x15; //pokud je špatné, odešle NAK } } } void time_up (void) { timer_comp = FALSE; if(++data[0]>=10) //zvýšení a vyhodnocení setin { data[0] = 0; if(++data[1]>=10) //zvýšení a vyhodnocení desetin { data[1] = 0; if (++data[2]>=10) //zvýšení a vyhodnocení vteřin { data[2] = 0; if (data[3] == 0x0C) data[3]=0; if (++data[3]>=10) //zvýšení a vyhodnocení desítek { data[3] = 0; if (data[4] == 0x0C) data[4]=0; if (++data[4]>=10) //zvýšení a vyhodnocení stovek { data[3] = 0x0C; data[4] = 0x0C; } } } } } } void vymaz(void) //vymaže celý displej { for (int t=0;t<3;t++) //první tři nastaví na zobrazení nuly data[t] = 0x00; for (int t=3;t<12;t++) //ostatní zhasne data[t] = 0x0C; } void init_timer (void) //nastaví časovač 1 pro počítání času { sei(); //povolí přerušení TCCR1B |=(1<