1,5 → 1,5 |
//---------------------------------------------------------------------------------- |
// Prevodnik RS232 <--> RS485 |
// Prevodnik RS232 <--> RS485 s prodlevou pri prevodu smerem do RS485 |
// pri startbitu na RS232 zapne okamzite vysilac pokud nejsou detekovana data z RS485. |
//---------------------------------------------------------------------------------- |
|
10,10 → 10,20 |
#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)) |
|
#define F_CPU 3686400UL |
#include <util/delay.h> |
|
void delay_ms(unsigned int ms) |
{ |
while(ms) |
{ |
_delay_ms(0.96); |
ms--; |
} |
} |
|
|
// ------------------------------------------------------------------ |
// Main |
// ------------------------------------------------------------------ |
24,23 → 34,24 |
int last; |
|
DDRD |= (1<<DDD5); |
DDRB |= (1<<DDB3); |
// DDRB |= (1<<DDB3); |
|
TCCR1B |= (1 << CS10); // Set up timer |
|
// PORTB |= (1<<PB3); |
|
while(1) |
{ |
if(!DATA) // kdyz je 0 na datech |
if(!(PIND & (1<<PD1))) // kdyz je 0 na datech |
{ |
POVOLOVAK_HIGH; // zapni vysilani |
|
for (spozdeni=8;spozdeni>=0;spozdeni --) // odpocitej dobu 8mi bitu |
PORTD &= ~(1<<PD5); // zapni vysilani |
for (spozdeni=0;spozdeni<=8;spozdeni ++) |
{ |
last = DATA; |
last = (PIND & (1<<PD1)); |
TCNT1 = 0; // zacni znova merit cas |
while (TCNT1 <= delay) // bit poznas tak, ze je to nejmensi nalezena delka trvaleho stavu |
while (TCNT1 <= delay) |
{ |
if(DATA != last) |
if((PIND & (1<<PD1)) != last) |
{ |
if (TCNT1 < delay) delay = TCNT1; |
break; |
47,16 → 58,9 |
} |
} |
} |
while (!DATA); // cekani na stop bit |
|
for (spozdeni=2;spozdeni >= 0;spozdeni --) |
{ |
TCNT1 = 0; // zacni znova merit cas zacatku stopbitu |
while (TCNT1 <= delay) if(!DATA) break; |
} |
while (!(PIND & (1<<PD1))); |
} |
else POVOLOVAK_LOW; // kdyz je 1 prepni na prijem |
delay = 60000; |
else PORTD |= (1<<PD5); // kdyz je 1 prepni na prijem |
} |
return(0); |
} |