Subversion Repositories svnkaklik

Rev

Rev 304 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log

Rev Author Line No. Line
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
}