| 297 | kaklik | 1 | //----------------------------------------------------------------------------------
 | 
        
           | 300 | kaklik | 2 | //	Prevodnik RS232 <--> RS485
 | 
        
           | 299 | kaklik | 3 | //	pri startbitu na RS232 zapne okamzite vysilac pokud nejsou detekovana data z RS485.
 | 
        
           | 297 | kaklik | 4 | //----------------------------------------------------------------------------------
 | 
        
           | 305 | kaklik | 5 | //
 | 
        
           |  |  | 6 | //Algoritmus:
 | 
        
           |  |  | 7 | //  Princip je zalozen na mereni nejkratsiho casoveho useku v osmi vzorcich, delka vzorku 
 | 
        
           |  |  | 8 | //  se odviji od velikosti prave nejmensiho zmereneho vzorku.
 | 
        
           |  |  | 9 | //
 | 
        
           |  |  | 10 | //
 | 
        
           |  |  | 11 | // Tento zpusob detekce neni imuni proti nahodnym chybovim sickam vzniklych v dusledku ruseni. 
 | 
        
           |  |  | 12 | // Proto je nutene napajeni kvalitne stbilizovat, pouzivat blokovaci kondenzatory a 
 | 
        
           |  |  | 13 | // zabezpecit, aby nedochazelo ke zvedani zeme.
 | 
        
           |  |  | 14 | /////////////////////////////////////////////////////////////////////////////////////
 | 
        
           |  |  | 15 | //
 | 
        
           |  |  | 16 | //TODO:
 | 
        
           |  |  | 17 | //  Optimalizovat kod, (hlavne najit casove vyhodnejsi umisteni pro nastavovani defaultnich hodnot promennych)
 | 
        
           |  |  | 18 | //  Bylo bydobre zavest uspavani pred prijetim bajtu.
 | 
        
           |  |  | 19 | //  Vykouset program na ATtiny13
 | 
        
           |  |  | 20 | //  program neni vyzkousen pri extremne nizkych rychlostech, kdy by teoreticky 
 | 
        
           |  |  | 21 | //  mohlo dochazet k preteceni promenne cas.
 | 
        
           |  |  | 22 | //////////////////////////////////////////////////////////////////////////////////////
 | 
        
           |  |  | 23 | //
 | 
        
           | 297 | kaklik | 24 |   | 
        
           | 305 | kaklik | 25 |   | 
        
           | 297 | kaklik | 26 | #include <avr/io.h>
 | 
        
           |  |  | 27 | #include <avr/interrupt.h>
 | 
        
           |  |  | 28 | #include <stdlib.h>
 | 
        
           |  |  | 29 | #include <ctype.h>
 | 
        
           |  |  | 30 | #include <avr/eeprom.h>
 | 
        
           |  |  | 31 | #include <avr/pgmspace.h>
 | 
        
           |  |  | 32 |   | 
        
           | 300 | kaklik | 33 | #define POVOLOVAK_LOW	PORTB &= ~(1<<PB3)
 | 
        
           |  |  | 34 | #define POVOLOVAK_HIGH  PORTB |= (1<<PB3)
 | 
        
           | 305 | kaklik | 35 | #define DATA	(PIND & (1<<PD3))
 | 
        
           | 297 | kaklik | 36 |   | 
        
           | 303 | kaklik | 37 | volatile unsigned int preteceni;
 | 
        
           | 305 | kaklik | 38 | volatile unsigned int bit;
 | 
        
           |  |  | 39 | volatile unsigned int bitdelay;
 | 
        
           |  |  | 40 | volatile unsigned int cas;
 | 
        
           | 302 | kaklik | 41 |   | 
        
           | 303 | kaklik | 42 | ISR(TIMER0_OVF_vect)   // interrupt od preteceni casovace
 | 
        
           |  |  | 43 | {
 | 
        
           |  |  | 44 |   preteceni++;			// kdyz pretece, poznamenej to.
 | 
        
           |  |  | 45 | }
 | 
        
           |  |  | 46 |   | 
        
           | 305 | kaklik | 47 | ISR(INT1_vect)
 | 
        
           |  |  | 48 | {
 | 
        
           |  |  | 49 |   if ((bitdelay=TCNT0+preteceni*0x0100) < cas) cas = bitdelay; //   
 | 
        
           |  |  | 50 |   TCNT0 = 0;					// zacni znova merit cas zacatku stopbitu
 | 
        
           |  |  | 51 |   preteceni=0;
 | 
        
           |  |  | 52 |   bit++;
 | 
        
           |  |  | 53 | }
 | 
        
           | 303 | kaklik | 54 |   | 
        
           | 297 | kaklik | 55 | // ------------------------------------------------------------------
 | 
        
           |  |  | 56 | //	Main
 | 
        
           |  |  | 57 | // ------------------------------------------------------------------
 | 
        
           |  |  | 58 | int main(void)
 | 
        
           |  |  | 59 | {
 | 
        
           |  |  | 60 |   | 
        
           | 305 | kaklik | 61 |   DDRD |= (1<<DDD5);     // povoleni vystupu pro blikani ledkou (mozno odebrat)
 | 
        
           | 297 | kaklik | 62 |   | 
        
           | 305 | kaklik | 63 |   DDRB |= (1<<DDB3);     // povoleni vystupu na povolovak 
 | 
        
           |  |  | 64 |   | 
        
           |  |  | 65 |   TIMSK |= (1 << TOIE0); // Enable timer overflow interrupt
 | 
        
           |  |  | 66 |   | 
        
           |  |  | 67 |   MCUCR |= (1 << ISC10); // nastaveni preruseni od zmeny vstupu pro interrupt INT0
 | 
        
           |  |  | 68 |   GIMSK |= (1 << INT1);  // povoleni interruptu INT0
 | 
        
           |  |  | 69 |   | 
        
           |  |  | 70 |   TCCR0B |= (1 << CS00);  // Set up timer 
 | 
        
           |  |  | 71 |   | 
        
           | 303 | kaklik | 72 |   sei();   // enable interrupts
 | 
        
           | 297 | kaklik | 73 |   | 
        
           |  |  | 74 |   while(1)
 | 
        
           |  |  | 75 |   {
 | 
        
           | 300 | kaklik | 76 | 	if(!DATA)   // kdyz je 0 na datech 
 | 
        
           | 297 | kaklik | 77 | 	{ 
 | 
        
           | 300 | kaklik | 78 | 	  POVOLOVAK_HIGH;    // zapni vysilani
 | 
        
           | 303 | kaklik | 79 |   | 
        
           | 305 | kaklik | 80 | 	  bitdelay = 0;
 | 
        
           |  |  | 81 | 	  bit=0;
 | 
        
           |  |  | 82 |       TCNT0=0;
 | 
        
           |  |  | 83 |       preteceni=0;
 | 
        
           | 303 | kaklik | 84 | 	  cas = 0xFFFF;
 | 
        
           | 305 | kaklik | 85 |   | 
        
           |  |  | 86 | 	  while (bit <= 10)  // odpocitej dobu 8mi bitu
 | 
        
           | 299 | kaklik | 87 | 	  {
 | 
        
           | 305 | kaklik | 88 | 	    if ((TCNT0+preteceni*0x0100) > cas)
 | 
        
           | 299 | kaklik | 89 | 		{
 | 
        
           | 305 | kaklik | 90 |           TCNT0 = 0;					// zacni znova merit cas zacatku stopbitu
 | 
        
           |  |  | 91 |           preteceni=0;
 | 
        
           |  |  | 92 | 		  bit++;
 | 
        
           |  |  | 93 | 		} 
 | 
        
           | 298 | kaklik | 94 | 	  }
 | 
        
           | 305 | kaklik | 95 | 	  while (!DATA);				// cekani na stop bit (detekce pripadneho paritniho bitu)
 | 
        
           | 300 | kaklik | 96 |   | 
        
           | 303 | kaklik | 97 | /*	  for (bit=2;bit >= 0;bit--)    // odpocitej dva stopbity
 | 
        
           |  |  | 98 | 	  {
 | 
        
           |  |  | 99 | 	    while ((TCNT0+preteceni*0x0100) <= cas) 
 | 
        
           |  |  | 100 | 		{
 | 
        
           |  |  | 101 | 		  if(!DATA) break;
 | 
        
           |  |  | 102 |         }
 | 
        
           |  |  | 103 | 	  }*/
 | 
        
           | 297 | kaklik | 104 |     }
 | 
        
           | 300 | kaklik | 105 |     else  POVOLOVAK_LOW;  	// kdyz je 1 prepni na prijem 
 | 
        
           | 297 | kaklik | 106 |   }
 | 
        
           | 298 | kaklik | 107 |   return(0);
 | 
        
           | 297 | kaklik | 108 | }
 |