Rev 300 | Blame | Last modification | View Log | Download
//----------------------------------------------------------------------------------// Prevodnik RS232 <--> RS485// pri startbitu na RS232 zapne okamzite vysilac pokud nejsou detekovana data z RS485.//----------------------------------------------------------------------------------#include <avr/io.h>#include <avr/interrupt.h>#include <stdlib.h>#include <ctype.h>#include <avr/eeprom.h>#include <avr/pgmspace.h>#define POVOLOVAK_LOW PORTB &= ~(1<<PB3)#define POVOLOVAK_HIGH PORTB |= (1<<PB3)#define DATA (PIND & (1<<PD1))// ------------------------------------------------------------------// Main// ------------------------------------------------------------------int main(void){int bit;int last;int preteceni;long int cas;DDRD |= (1<<DDD5);DDRB |= (1<<DDB3);TCCR0B |= (1 << CS10); // Set up timerwhile(1){if(!DATA) // kdyz je 0 na datech{POVOLOVAK_HIGH; // zapni vysilanifor (bit=7;bit>=0;bit--) // odpocitej dobu 8mi bitu{last = DATA;TCNT0 = 0; // zacni znova merit caspreteceni =0;while ((TCNT0+preteceni*0xFF) <= cas) // bit poznas tak, ze je to nejmensi nalezena delka trvaleho stavu{if (!(TIFR << TOV0)) // protoze mame jenom 8mi bitovy casovac, zjisti, jestli nepreteka{preteceni++; // kdyz pretece, poznamenej to.TIFR = 1 << TOV0; // vynuluj flag preteceni}if(DATA != last) // zkontroluj, jestli se nezmenil stav dat.{if ((TCNT0+preteceni*0xFF) < cas) cas = TCNT0+preteceni*0xFF; //kdyz se zmenil a trvalo to kratsi dobu nez pred tim poznemenej, jak dlouho to trvalobreak;}}}while (!DATA); // cekani na stop bit// for (spozdeni=2;spozdeni >= 0;spozdeni --)// {// TCNT0 = 0; // zacni znova merit cas zacatku stopbitu// while (TCNT0 <= delay) if(!DATA) break;// }}else POVOLOVAK_LOW; // kdyz je 1 prepni na prijemcas = 0xFFFF;}return(0);}