| Line 4... | Line 4... | 
          
            | 4 | //----------------------------------------------------------------------------------
 | 4 | //----------------------------------------------------------------------------------
 | 
          
            | 5 | //
 | 5 | //
 | 
          
            | 6 | //Algoritmus:
 | 6 | //Algoritmus:
 | 
          
            | 7 | //  Princip je zalozen na mereni nejkratsiho casoveho useku v osmi vzorcich, delka vzorku 
 | 7 | //  Princip je zalozen na mereni nejkratsiho casoveho useku v osmi vzorcich, delka vzorku 
 | 
          
            | 8 | //  se odviji od velikosti prave nejmensiho zmereneho vzorku.
 | 8 | //  se odviji od velikosti prave nejmensiho zmereneho vzorku.
 | 
          
            | - |   | 9 | //  delka vzorku se meri pomoci 8mi bitoveho casovace a interruptu od zmeny vstupu. casovac je osetren
 | 
          
            | - |   | 10 | //  proti pretekani (pocet preteceni se uklada, do promenne s ktere se zpetne vypocita 16bitove cislo, 
 | 
          
            | - |   | 11 | //  casovac se tedy virtualne chova jako 16ti bitovy.)
 | 
          
            | 9 | //
 | 12 | //
 | 
          
            | 10 | //
 | - |   | 
          
            | 11 | // Tento zpusob detekce neni imuni proti nahodnym chybovim sickam vzniklych v dusledku ruseni. 
 | 13 | // Tento zpusob detekce neni imuni proti nahodnym chybovim spickam vzniklych v dusledku ruseni. 
 | 
          
            | 12 | // Proto je nutene napajeni kvalitne stbilizovat, pouzivat blokovaci kondenzatory a 
 | 14 | // Proto je nutene napajeni kvalitne stbilizovat, pouzivat blokovaci kondenzatory a 
 | 
          
            | 13 | // zabezpecit, aby nedochazelo ke zvedani zeme.
 | 15 | // zabezpecit, aby nedochazelo ke zvedani zeme.
 | 
          
            | 14 | /////////////////////////////////////////////////////////////////////////////////////
 | 16 | /////////////////////////////////////////////////////////////////////////////////////
 | 
          
            | 15 | //
 | 17 | //
 | 
          
            | 16 | //TODO:
 | 18 | //TODO:
 | 
          
            | 17 | //  Optimalizovat kod, (hlavne najit casove vyhodnejsi umisteni pro nastavovani defaultnich hodnot promennych)
 | 19 | //  Optimalizovat kod, (hlavne najit casove vyhodnejsi umisteni pro nastavovani defaultnich hodnot promennych)
 | 
          
            | 18 | //  Bylo bydobre zavest uspavani pred prijetim bajtu.
 | 20 | //  Bylo bydobre zavest uspavani pred prijetim bajtu.
 | 
          
            | 19 | //  Vykouset program na ATtiny13
 | 21 | //  Vykouset program na ATtiny13
 | 
          
            | 20 | //  program neni vyzkousen pri extremne nizkych rychlostech, kdy by teoreticky 
 | 22 | //  Program neni vyzkousen pri extremne nizkych rychlostech, kdy by teoreticky 
 | 
          
            | 21 | //  mohlo dochazet k preteceni promenne cas.
 | 23 | //  mohlo dochazet k preteceni promenne cas.
 | 
          
            | - |   | 24 | //  Neni vyzkousen break, byly testovany pouze ASCII znaky vysilane pres terminal z klavesnice.  
 | 
          
            | 22 | //////////////////////////////////////////////////////////////////////////////////////
 | 25 | //////////////////////////////////////////////////////////////////////////////////////
 | 
          
            | 23 | //
 | 26 | //
 | 
          
            | 24 |  
 | 27 |  
 | 
          
            | 25 |  
 | 28 |  
 | 
          
            | 26 | #include <avr/io.h>
 | 29 | #include <avr/io.h>
 | 
          
            | Line 28... | Line 31... | 
          
            | 28 | #include <stdlib.h>
 | 31 | #include <stdlib.h>
 | 
          
            | 29 | #include <ctype.h>
 | 32 | #include <ctype.h>
 | 
          
            | 30 | #include <avr/eeprom.h>
 | 33 | #include <avr/eeprom.h>
 | 
          
            | 31 | #include <avr/pgmspace.h>
 | 34 | #include <avr/pgmspace.h>
 | 
          
            | 32 |  
 | 35 |  
 | 
          
            | 33 | #define POVOLOVAK_LOW	PORTB &= ~(1<<PB3)
 | 36 | #define POVOLOVAK_LOW	PORTB &= ~(1<<PB3)   // nastaveni nuly na vystup, krery zapina povoleni vysilani RS485
 | 
          
            | 34 | #define POVOLOVAK_HIGH  PORTB |= (1<<PB3)
 | 37 | #define POVOLOVAK_HIGH  PORTB |= (1<<PB3)    // nastaveni jednicky na tentyz vystup
 | 
          
            | 35 | #define DATA	(PIND & (1<<PD3))
 | 38 | #define DATA	(PIND & (1<<PD3))			// nastaveni vstupu, na kterem se budou detekovat data, musi byt stejny jako vstup pouziteho interruptu 
 | 
          
            | 36 |  
 | 39 |  
 | 
          
            | 37 | volatile unsigned int preteceni;
 | 40 | volatile unsigned int preteceni;  // promenna na ukladani poctu preteceni casovace
 | 
          
            | 38 | volatile unsigned int bit;
 | 41 | volatile unsigned int bit;		// promena pro pocitani bitu v bajtu
 | 
          
            | 39 | volatile unsigned int bitdelay;
 | 42 | volatile unsigned int bitdelay; // obsahuje aktualni zmereny cas delky bitu
 | 
          
            | 40 | volatile unsigned int cas;
 | 43 | volatile unsigned int cas;		// urcuje nejkratsi nalezeny cas delky bitu
 | 
          
            | 41 |  
 | 44 |  
 | 
          
            | 42 | ISR(TIMER0_OVF_vect)   // interrupt od preteceni casovace
 | 45 | ISR(TIMER0_OVF_vect)   // interrupt od preteceni casovace
 | 
          
            | 43 | {
 | 46 | {
 | 
          
            | 44 |   preteceni++;			// kdyz pretece, poznamenej to.
 | 47 |   preteceni++;			// kdyz pretece, poznamenej to.
 | 
          
            | 45 | }
 | 48 | }
 | 
          
            | 46 |  
 | 49 |  
 | 
          
            | 47 | ISR(INT1_vect)
 | 50 | ISR(INT1_vect)   // interrupt od zmeny vstupu na datech
 | 
          
            | 48 | {
 | 51 | {
 | 
          
            | 49 |   if ((bitdelay=TCNT0+preteceni*0x0100) < cas) cas = bitdelay; //   
 | 52 |   if ((bitdelay=TCNT0+preteceni*0x0100) < cas) cas = bitdelay; // provnani jestli zrovna zmereny cas je kratsi nez nejmensi znamy cas   
 | 
          
            | 50 |   TCNT0 = 0;					// zacni znova merit cas zacatku stopbitu
 | 53 |   TCNT0 = 0;					// zacni znova merit cas zacatku stopbitu
 | 
          
            | 51 |   preteceni=0;
 | 54 |   preteceni=0;				// vynuluj vsechny casove promenne
 | 
          
            | 52 |   bit++;
 | 55 |   bit++;		// posun pocitadlo bitu o jednicku 
 | 
          
            | 53 | }
 | 56 | }
 | 
          
            | 54 |  
 | 57 |  
 | 
          
            | 55 | // ------------------------------------------------------------------
 | 58 | // ------------------------------------------------------------------
 | 
          
            | 56 | //	Main
 | 59 | //	Main
 | 
          
            | 57 | // ------------------------------------------------------------------
 | 60 | // ------------------------------------------------------------------
 | 
          
            | 58 | int main(void)
 | 61 | int main(void)
 | 
          
            | 59 | {
 | 62 | {
 | 
          
            | - |   | 63 | int stopbit;
 | 
          
            | 60 |  
 | 64 |  
 | 
          
            | 61 |   DDRD |= (1<<DDD5);     // povoleni vystupu pro blikani ledkou (mozno odebrat)
 | 65 | //  DDRD |= (1<<DDD5);     // povoleni vystupu pro blikani ledkou (mozno odebrat)
 | 
          
            | 62 |  
 | 66 |  
 | 
          
            | 63 |   DDRB |= (1<<DDB3);     // povoleni vystupu na povolovak 
 | 67 |   DDRB |= (1<<DDB3);     // povoleni vystupu na povolovak 
 | 
          
            | 64 |  
 | 68 |  
 | 
          
            | 65 |   TIMSK |= (1 << TOIE0); // Enable timer overflow interrupt
 | 69 |   TIMSK |= (1 << TOIE0); // Enable timer overflow interrupt
 | 
          
            | 66 |  
 | 70 |  
 | 
          
            | Line 75... | Line 79... | 
          
            | 75 |   {
 | 79 |   {
 | 
          
            | 76 | 	if(!DATA)   // kdyz je 0 na datech 
 | 80 | 	if(!DATA)   // kdyz je 0 na datech 
 | 
          
            | 77 | 	{ 
 | 81 | 	{ 
 | 
          
            | 78 | 	  POVOLOVAK_HIGH;    // zapni vysilani
 | 82 | 	  POVOLOVAK_HIGH;    // zapni vysilani
 | 
          
            | 79 |  
 | 83 |  
 | 
          
            | 80 | 	  bitdelay = 0;
 | 84 | 	  bit=0;			// vynuluj vsechny promenne pro mereni casu a pocitani bitu
 | 
          
            | 81 | 	  bit=0;
 | - |   | 
          
            | 82 |       TCNT0=0;
 | 85 |       TCNT0=0;
 | 
          
            | 83 |       preteceni=0;
 | 86 |       preteceni=0;
 | 
          
            | 84 | 	  cas = 0xFFFF;
 | 87 | 	  cas = 0xFFFF;    // nastav cas delky bitu na nejvetsi mozny
 | 
          
            | 85 | 	  	  	  	  
 | 88 | 	  	  	  	  
 | 
          
            | 86 | 	  while (bit <= 10)  // odpocitej dobu 8mi bitu
 | 89 | 	  while (bit <= 8)  // odpocitej dobu 8mi bitu
 | 
          
            | 87 | 	  {
 | 90 | 	  {
 | 
          
            | 88 | 	    if ((TCNT0+preteceni*0x0100) > cas)
 | 91 | 	    if ((100+TCNT0+preteceni*0x0100) >= cas) // zkontroluj jestli necekame na dalsi bit dele nez je nekratsi znema delka bitu
 | 
          
            | 89 | 		{
 | 92 | 		{
 | 
          
            | 90 |           TCNT0 = 0;					// zacni znova merit cas zacatku stopbitu
 | 93 |           TCNT0 = 0;					// zacni znova merit cas do dalsiho mozneho bitu
 | 
          
            | 91 |           preteceni=0;
 | 94 |           preteceni=0;
 | 
          
            | 92 | 		  bit++;
 | - |   | 
          
            | - |   | 95 | 		  bit++;						// pokud jsme cekali dele, tak bit uz ubehl, to znamena, ze muzeme pocitadlo bitu posunout o jednicku
 | 
          
            | 93 | 		} 
 | 96 | 		} 
 | 
          
            | 94 | 	  }
 | 97 | 	  }
 | 
          
            | 95 | 	  while (!DATA);				// cekani na stop bit (detekce pripadneho paritniho bitu)
 | - |   | 
          
            | 96 |  
 | 98 |  
 | 
          
            | - |   | 99 | /*	  while (!DATA);				// cekani na stop bit (detekce pripadneho paritniho bitu)
 | 
          
            | - |   | 100 |  
 | 
          
            | 97 | /*	  for (bit=2;bit >= 0;bit--)    // odpocitej dva stopbity
 | 101 | 	  for (stopbit=2;stopbit >= 0;stopbit--)    // odpocitej dva stopbity
 | 
          
            | 98 | 	  {
 | 102 | 	  {
 | 
          
            | 99 | 	    while ((TCNT0+preteceni*0x0100) <= cas) 
 | 103 | 	    while ((TCNT0+preteceni*0x0100) <= cas) 
 | 
          
            | 100 | 		{
 | 104 | 		{
 | 
          
            | 101 | 		  if(!DATA) break;
 | 105 | 		  if(!DATA) break;
 | 
          
            | 102 |         }
 | 106 |         }
 |