Subversion Repositories svnkaklik

Rev

Rev 300 | Go to most recent revision | 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 timer 

  while(1)
  {
        if(!DATA)   // kdyz je 0 na datech 
        { 
          POVOLOVAK_HIGH;    // zapni vysilani
                  
          for (bit=7;bit>=0;bit--) // odpocitej dobu 8mi bitu 
          {
                last = DATA;
            TCNT0 = 0;                                  // zacni znova merit cas
                preteceni =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 trvalo 
                        break;
                  }
        }
          }
          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 prijem 
        cas = 0xFFFF;
  }
  return(0);
}