Subversion Repositories svnkaklik

Compare Revisions

Ignore whitespace Rev 305 → Rev 306

/programy/Atmel_C/RS232toRS485/P232.c
6,9 → 6,11
//Algoritmus:
// Princip je zalozen na mereni nejkratsiho casoveho useku v osmi vzorcich, delka vzorku
// se odviji od velikosti prave nejmensiho zmereneho vzorku.
// delka vzorku se meri pomoci 8mi bitoveho casovace a interruptu od zmeny vstupu. casovac je osetren
// proti pretekani (pocet preteceni se uklada, do promenne s ktere se zpetne vypocita 16bitove cislo,
// casovac se tedy virtualne chova jako 16ti bitovy.)
//
//
// Tento zpusob detekce neni imuni proti nahodnym chybovim sickam vzniklych v dusledku ruseni.
// Tento zpusob detekce neni imuni proti nahodnym chybovim spickam vzniklych v dusledku ruseni.
// Proto je nutene napajeni kvalitne stbilizovat, pouzivat blokovaci kondenzatory a
// zabezpecit, aby nedochazelo ke zvedani zeme.
/////////////////////////////////////////////////////////////////////////////////////
17,8 → 19,9
// Optimalizovat kod, (hlavne najit casove vyhodnejsi umisteni pro nastavovani defaultnich hodnot promennych)
// Bylo bydobre zavest uspavani pred prijetim bajtu.
// Vykouset program na ATtiny13
// program neni vyzkousen pri extremne nizkych rychlostech, kdy by teoreticky
// Program neni vyzkousen pri extremne nizkych rychlostech, kdy by teoreticky
// mohlo dochazet k preteceni promenne cas.
// Neni vyzkousen break, byly testovany pouze ASCII znaky vysilane pres terminal z klavesnice.
//////////////////////////////////////////////////////////////////////////////////////
//
 
30,14 → 33,14
#include <avr/eeprom.h>
#include <avr/pgmspace.h>
 
#define POVOLOVAK_LOW PORTB &= ~(1<<PB3)
#define POVOLOVAK_HIGH PORTB |= (1<<PB3)
#define DATA (PIND & (1<<PD3))
#define POVOLOVAK_LOW PORTB &= ~(1<<PB3) // nastaveni nuly na vystup, krery zapina povoleni vysilani RS485
#define POVOLOVAK_HIGH PORTB |= (1<<PB3) // nastaveni jednicky na tentyz vystup
#define DATA (PIND & (1<<PD3)) // nastaveni vstupu, na kterem se budou detekovat data, musi byt stejny jako vstup pouziteho interruptu
 
volatile unsigned int preteceni;
volatile unsigned int bit;
volatile unsigned int bitdelay;
volatile unsigned int cas;
volatile unsigned int preteceni; // promenna na ukladani poctu preteceni casovace
volatile unsigned int bit; // promena pro pocitani bitu v bajtu
volatile unsigned int bitdelay; // obsahuje aktualni zmereny cas delky bitu
volatile unsigned int cas; // urcuje nejkratsi nalezeny cas delky bitu
 
ISR(TIMER0_OVF_vect) // interrupt od preteceni casovace
{
44,12 → 47,12
preteceni++; // kdyz pretece, poznamenej to.
}
 
ISR(INT1_vect)
ISR(INT1_vect) // interrupt od zmeny vstupu na datech
{
if ((bitdelay=TCNT0+preteceni*0x0100) < cas) cas = bitdelay; //
if ((bitdelay=TCNT0+preteceni*0x0100) < cas) cas = bitdelay; // provnani jestli zrovna zmereny cas je kratsi nez nejmensi znamy cas
TCNT0 = 0; // zacni znova merit cas zacatku stopbitu
preteceni=0;
bit++;
preteceni=0; // vynuluj vsechny casove promenne
bit++; // posun pocitadlo bitu o jednicku
}
 
// ------------------------------------------------------------------
57,8 → 60,9
// ------------------------------------------------------------------
int main(void)
{
int stopbit;
 
DDRD |= (1<<DDD5); // povoleni vystupu pro blikani ledkou (mozno odebrat)
// DDRD |= (1<<DDD5); // povoleni vystupu pro blikani ledkou (mozno odebrat)
 
DDRB |= (1<<DDB3); // povoleni vystupu na povolovak
 
77,24 → 81,24
{
POVOLOVAK_HIGH; // zapni vysilani
 
bitdelay = 0;
bit=0;
bit=0; // vynuluj vsechny promenne pro mereni casu a pocitani bitu
TCNT0=0;
preteceni=0;
cas = 0xFFFF;
cas = 0xFFFF; // nastav cas delky bitu na nejvetsi mozny
while (bit <= 10) // odpocitej dobu 8mi bitu
while (bit <= 8) // odpocitej dobu 8mi bitu
{
if ((TCNT0+preteceni*0x0100) > cas)
if ((100+TCNT0+preteceni*0x0100) >= cas) // zkontroluj jestli necekame na dalsi bit dele nez je nekratsi znema delka bitu
{
TCNT0 = 0; // zacni znova merit cas zacatku stopbitu
TCNT0 = 0; // zacni znova merit cas do dalsiho mozneho bitu
preteceni=0;
bit++;
bit++; // pokud jsme cekali dele, tak bit uz ubehl, to znamena, ze muzeme pocitadlo bitu posunout o jednicku
}
}
while (!DATA); // cekani na stop bit (detekce pripadneho paritniho bitu)
 
/* for (bit=2;bit >= 0;bit--) // odpocitej dva stopbity
/* while (!DATA); // cekani na stop bit (detekce pripadneho paritniho bitu)
 
for (stopbit=2;stopbit >= 0;stopbit--) // odpocitej dva stopbity
{
while ((TCNT0+preteceni*0x0100) <= cas)
{
/programy/Atmel_C/RS232toRS485/default/rs485.elf
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/programy/Atmel_C/RS232toRS485/default/rs485.hex
1,7 → 1,7
:1000000012C02AC041C028C027C026C026C024C0B4
:1000100023C022C021C020C01FC01EC01DC01CC0E4
:100020001BC01AC019C011241FBECFEDCDBF10E0F8
:10003000A0E6B0E0E4EBF1E003C0C89531960D9284
:10003000A0E6B0E0EAEAF1E003C0C89531960D927F
:10004000A036B107D1F710E0A0E6B0E001C01D92E4
:10005000A836B107E1F758C0D3CF1F920F920FB661
:100060000F9211248F939F9380916200909163006F
14,16 → 14,15
:1000D0006100909365008093640012BE10926300EB
:1000E0001092620080916600909167000196909353
:1000F0006700809366009F918F913F912F910F90A1
:100100000FBE0F901F9018958D9ABB9A89B7826089
:1001100089BF85B7846085BF8BB780688BBF83B785
:10012000816083BF78946FEF7FEF839941C0C39A5A
:1001300010926100109260001092670010926600A9
:1001400012BE10926300109262007093650060937B
:10015000640080916600909167000B9720F582B74C
:1001600020916200309163004091640050916500DD
:10017000322F2227280F311D4217530750F712BE86
:100180001092630010926200809166009091670067
:10019000019690936700809366008091660090912D
:1001A00067000B97E0F28399C0CF839BFCCFBDCF54
:0401B000C398BBCF66
:100100000FBE0F901F901895BB9A89B7826089BF68
:1001100085B7846085BF8BB780688BBF83B78160EC
:1001200083BF78946FEF7FEF83993DC0C39A10929D
:1001300067001092660012BE109263001092620077
:1001400070936500609364008091660090916700F1
:10015000099750F782B72091620030916300409177
:10016000640050916500322F222799278C599F4FA8
:10017000280F391F2417350738F312BE1092630079
:1001800010926200809166009091670001969093B2
:1001900067008093660080916600909167000997E0
:0A01A000C8F2839BC3CFC398BFCF02
:00000001FF