Subversion Repositories svnkaklik

Compare Revisions

No changes between revisions

Ignore whitespace Rev 409 → Rev 410

/programy/C/avr/RS232toRS485/P232.c
0,0 → 1,140
// 1.6.2007
//----------------------------------------------------------------------------------
// Prevodnik RS232 <--> RS485
// pri startbitu na RS232 zapne okamzite vysilac pokud nejsou detekovana data z RS485.
//----------------------------------------------------------------------------------
//Program je urcen k rizeni toku dat v prevodniku RS232 na RS485. S cilem eliminovat jakekoliv prvky nastavovene uzivatelem
//bez nutnosti pouziti hardwaroveho rizeni toku. Program tedy dokaze detekovat prenosovou rychlost, paritni bit a stopbit.
//
//
//Algoritmus:
// Princip je zalozen na mereni nejkratsiho casoveho useku v osmi vzorcich, delka vzorku
// se odviji od velikosti prave nejmensiho zmereneho vzorku.
// Vzorek 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.)
// Mereni delky bitu
//
// Aktualni implementace teto metody se chova tak, ze pokud je vyslan bajt ktery po startbitu obsahuje N
// stejnych bitu, tak je tato sekvence detekovana jako jeden bit to zpusobi ze detekovana rychlost je N krat
// mensi, nez skutecna. Dusledkem je, ze pokud se jeste pred stopbitem neobjevi samostatny bit s jinou hodnotou,
// nez predchozi sekvence. Tak bude vysílání povoleno po dubu osminásobku zmìøené délky "bitu" plus další dva bity jako stopbity.
//
//
//Vlastnosti:
// Tento program je shopen detekovat pararitní bit, ale neni shopen detekovat poèet stopbitù.
// To znamená že když bude parita logická jedna, tak bude rozpoznána jako stop bit.
// Tato vlastnost ale pøíliš nevadí, protože chování algoritmu lze upravit tak, že bude predpokládat dva nebo tøi stopbity.
// V takovém pøípadì se packet pøenese korektnì i když parita bude jedna, i nula.
//
// 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.
////////////////////////////////////////////////////////////////////////////////////////
//
//Autor: Jakub Kakona (kaklik@mlab.cz)
//
////////////////////////////////////////////////////////////////////////////////////////
//TODO:
// Optimalizovat kod, (hlavne najit casove vyhodnejsi umisteni pro nastavovani defaultnich hodnot promennych)
// Bylo bydobre zavest uspavani pred prijetim bajtu.
// Vykouset program na ATtiny13
// Pri rychlostech mensich nez 9600kbps dochazi k pretekani promennych a algoritmus se nechova korektne.
// Neni vyzkousen break, byly testovany pouze ASCII znaky vysilane pres terminal z klavesnice.
// Aktivovat WatchDog timer.
// Neni vyzkouseno na vyssím taktu CPU jak 3,7MHz
//////////////////////////////////////////////////////////////////////////////////////
//
 
 
#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) // 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; // promenna na ukladani poctu preteceni casovace
volatile unsigned int bit; // promena pro pocitani bitu v bajtu
volatile unsigned long int bitdelay; // obsahuje aktualni zmereny cas delky bitu
volatile unsigned long int cas; // urcuje nejkratsi nalezeny cas delky bitu
 
ISR(TIMER0_OVF_vect) // interrupt od preteceni casovace
{
preteceni++; // kdyz pretece, poznamenej to.
}
 
ISR(INT1_vect) // interrupt od zmeny vstupu na datech
{
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; // vynuluj vsechny casove promenne
bit++; // posun pocitadlo bitu o jednicku
}
 
// ------------------------------------------------------------------
// Main
// ------------------------------------------------------------------
int main(void)
{
int stopbit;
int ctvrtbit;
 
/*typedef struct { // struktura pro celoèíselné dìlení
int quot;
int rem;
} div_t;*/
 
 
DDRB |= (1<<DDB3); // povoleni vystupu na povolovak
 
TIMSK |= (1 << TOIE0); // Enable timer overflow interrupt
 
MCUCR |= (1 << ISC10); // nastaveni preruseni od zmeny vstupu pro interrupt INT0
GIMSK |= (1 << INT1); // povoleni interruptu INT0
TCCR0B |= (1 << CS00); // Set up timer
 
sei(); // enable interrupts
 
while(1)
{
if(!DATA) // kdyz je 0 na datech
{
POVOLOVAK_HIGH; // zapni vysilani
 
TCNT0=0;
preteceni=0;
bit=0; // vynuluj vsechny promenne pro mereni casu a pocitani bitu
cas = 0xFFFF; // nastav cas delky bitu na nejvetsi mozny
while (bit <= 8) // odpocitej dobu 8mi bitu
{
if ((TCNT0+preteceni*0x0100) >= (cas + (ctvrtbit = cas >> 2))) // zkontroluj jestli necekame na dalsi bit dele nez je nekratsi znema delka bitu
// v kontrole je rezerva delky ctvrt bitu
{
bit++; // pokud jsme cekali dele, tak bit uz ubehl, to znamena, ze muzeme pocitadlo bitu posunout o jednicku
// div(ctvrtbit,0x0100); // funkce pro implementaci celociselneho deleni zustava ale nepouzita kvuli nutnosti zavest datove struktury, bude ji nutno pouzit pro vetsi rychlosti
TCNT0 = ctvrtbit % 0x0100; //reminder; // zacni znova merit cas do dalsiho mozneho bitu
preteceni = ctvrtbit/0x0100; //quota;
}
}
 
while (!DATA); // cekani na stop bit (detekce pripadneho paritniho bitu)
 
for (stopbit=2;stopbit >= 0;stopbit--) // odpocitej dva stopbity
{
while ((TCNT0+preteceni*0x0100) <= cas)
{
if(!DATA) break;
}
}
}
else POVOLOVAK_LOW; // kdyz je 1 prepni na prijem
}
return(0);
}
/programy/C/avr/RS232toRS485/default/rs485.elf
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programy/C/avr/RS232toRS485/default/rs485.hex
0,0 → 1,49
:1000000012C02AC041C028C027C026C026C024C0B4
:1000100023C022C021C020C01FC01EC01DC01CC0E4
:100020001BC01AC019C011241FBECFEDCDBF10E0F8
:10003000A0E6B0E0ECEFF2E003C0C89531960D9277
:10004000A036B107D1F710E0A0E6B0E001C01D92E4
:10005000AC36B107E1F778C0D3CF1F920F920FB63D
:100060000F9211248F939F9380916400909165006B
:10007000019690936500809364009F918F910F90FB
:100080000FBE0F901F9018951F920F920FB60F92F0
:1000900011242F933F934F935F938F939F93AF932D
:1000A000BF9322B78091640090916500982F8827B4
:1000B000820F911DAA27BB27809360009093610057
:1000C000A0936200B09363002091600030916100C2
:1000D00040916200509163008091660090916700AA
:1000E000A0916800B0916900281739074A075B079B
:1000F00080F48091600090916100A0916200B091C5
:1001000063008093660090936700A0936800B093AB
:10011000690012BE109265001092640080916A001E
:1001200090916B00019690936B0080936A00BF9151
:10013000AF919F918F915F914F913F912F910F9030
:100140000FBE0F901F901895AF92BF92CF92DF9283
:10015000EF92FF920F931F93BB9A89B7826089BF7A
:1001600085B7846085BF8BB780688BBF83B781609C
:1001700083BF7894839994C0C39A12BE109265008D
:100180001092640010926B0010926A008FEF9FEF44
:10019000A0E0B0E08093660090936700A0936800B1
:1001A000B093690080916A0090916B00099708F004
:1001B00053C082B72091640030916500A090660022
:1001C000B0906700C0906800D0906900D694C79442
:1001D000B794A794D694C794B794A794E090660078
:1001E000F09067000091680010916900322F22277B
:1001F000280F311D442755278A2D9B2DAA2797FDAF
:10020000A095BA2F8E0D9F1DA01FB11F281739076B
:100210004A075B0738F280916A0090916B00019663
:1002200090936B0080936A009B2D8A2D60E071E0B3
:100230003CD082BF9B2D8A2DB7FC34C0892F990FEB
:10024000990B909365008093640080916A0090916F
:100250006B00099708F4ADCF839BFECF62E070E09E
:1002600082B72091640030916500E0906600F090C4
:1002700067000091680010916900322F2227280F33
:10028000311D44275527E216F3060407150710F021
:100290008399E6CF6150704077FFE2CF839B6CCFAC
:1002A000C39868CF81509F4FC9CF97FB092E07266F
:1002B0000AD077FD04D00CD006D000201AF4709537
:1002C00061957F4F0895F6F7909581959F4F08951A
:1002D000AA1BBB1B51E107C0AA1FBB1FA617B7076C
:1002E00010F0A61BB70B881F991F5A95A9F7809588
:0C02F0009095682F792F8A2F9B2F08957E
:00000001FF
/programy/C/avr/RS232toRS485/default/Makefile
0,0 → 1,77
###############################################################################
# Makefile for the project rs485
###############################################################################
 
## General Flags
PROJECT = rs485
MCU = attiny2313
TARGET = rs485.elf
CC = avr-gcc.exe
 
## Options common to compile, link and assembly rules
COMMON = -mmcu=$(MCU)
 
## Compile options common for all C compilation units.
CFLAGS = $(COMMON)
CFLAGS += -Wall -gdwarf-2 -DF_CPU=3686400UL -O3 -funsigned-char -funsigned-bitfields
CFLAGS += -MD -MP -MT $(*F).o -MF dep/$(@F).d
 
## Assembly specific flags
ASMFLAGS = $(COMMON)
ASMFLAGS += $(CFLAGS)
ASMFLAGS += -x assembler-with-cpp -Wa,-gdwarf2
 
## Linker flags
LDFLAGS = $(COMMON)
LDFLAGS +=
 
 
## Intel Hex file production flags
HEX_FLASH_FLAGS = -R .eeprom
 
HEX_EEPROM_FLAGS = -j .eeprom
HEX_EEPROM_FLAGS += --set-section-flags=.eeprom="alloc,load"
HEX_EEPROM_FLAGS += --change-section-lma .eeprom=0 --no-change-warnings
 
 
## Libraries
LIBS = -lc -lm -lprintf_flt -lprintf_min -lscanf_flt -lscanf_min
 
## Objects that must be built in order to link
OBJECTS = P232.o
 
## Objects explicitly added by the user
LINKONLYOBJECTS =
 
## Build
all: $(TARGET) rs485.hex rs485.eep size
 
## Compile
P232.o: ../P232.c
$(CC) $(INCLUDES) $(CFLAGS) -c $<
 
##Link
$(TARGET): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) $(LINKONLYOBJECTS) $(LIBDIRS) $(LIBS) -o $(TARGET)
 
%.hex: $(TARGET)
avr-objcopy -O ihex $(HEX_FLASH_FLAGS) $< $@
 
%.eep: $(TARGET)
-avr-objcopy $(HEX_EEPROM_FLAGS) -O ihex $< $@ || exit 0
 
%.lss: $(TARGET)
avr-objdump -h -S $< > $@
 
size: ${TARGET}
@echo
@avr-size -C --mcu=${MCU} ${TARGET}
 
## Clean target
.PHONY: clean
clean:
-rm -rf $(OBJECTS) rs485.elf dep/* rs485.hex rs485.eep
 
## Other dependencies
-include $(shell mkdir dep 2>/dev/null) $(wildcard dep/*)
 
/programy/C/avr/RS232toRS485/rs485.aps
0,0 → 1,0
<AVRStudio><MANAGEMENT><ProjectName>rs485</ProjectName><Created>22-May-2007 10:20:14</Created><LastEdit>01-Jun-2007 15:37:20</LastEdit><ICON>241</ICON><ProjectType>0</ProjectType><Created>22-May-2007 10:20:14</Created><Version>4</Version><Build>4, 13, 0, 528</Build><ProjectTypeName>AVR GCC</ProjectTypeName></MANAGEMENT><CODE_CREATION><ObjectFile>default\rs485.elf</ObjectFile><EntryFile></EntryFile><SaveFolder>C:\E240\ass3\RS232toRS485\</SaveFolder></CODE_CREATION><DEBUG_TARGET><CURRENT_TARGET>AVR Simulator</CURRENT_TARGET><CURRENT_PART>ATtiny2313</CURRENT_PART><BREAKPOINTS></BREAKPOINTS><IO_EXPAND><HIDE>false</HIDE></IO_EXPAND><REGISTERNAMES><Register>R00</Register><Register>R01</Register><Register>R02</Register><Register>R03</Register><Register>R04</Register><Register>R05</Register><Register>R06</Register><Register>R07</Register><Register>R08</Register><Register>R09</Register><Register>R10</Register><Register>R11</Register><Register>R12</Register><Register>R13</Register><Register>R14</Register><Register>R15</Register><Register>R16</Register><Register>R17</Register><Register>R18</Register><Register>R19</Register><Register>R20</Register><Register>R21</Register><Register>R22</Register><Register>R23</Register><Register>R24</Register><Register>R25</Register><Register>R26</Register><Register>R27</Register><Register>R28</Register><Register>R29</Register><Register>R30</Register><Register>R31</Register></REGISTERNAMES><COM>Auto</COM><COMType>0</COMType><WATCHNUM>0</WATCHNUM><WATCHNAMES><Pane0><Variables>preteceni</Variables><Variables>bit</Variables><Variables>bitdelay</Variables><Variables>cas</Variables></Pane0><Pane1></Pane1><Pane2></Pane2><Pane3></Pane3></WATCHNAMES><BreakOnTrcaeFull>0</BreakOnTrcaeFull></DEBUG_TARGET><Debugger><modules><module></module></modules><Triggers></Triggers></Debugger><AVRGCCPLUGIN><FILES><SOURCEFILE>P232.c</SOURCEFILE></FILES><CONFIGS><CONFIG><NAME>default</NAME><USESEXTERNALMAKEFILE>NO</USESEXTERNALMAKEFILE><EXTERNALMAKEFILE></EXTERNALMAKEFILE><PART>attiny2313</PART><HEX>1</HEX><LIST>0</LIST><MAP>0</MAP><OUTPUTFILENAME>rs485.elf</OUTPUTFILENAME><OUTPUTDIR>default\</OUTPUTDIR><ISDIRTY>0</ISDIRTY><OPTIONS/><INCDIRS/><LIBDIRS/><LIBS><LIB>libc.a</LIB><LIB>libm.a</LIB><LIB>libprintf_flt.a</LIB><LIB>libprintf_min.a</LIB><LIB>libscanf_flt.a</LIB><LIB>libscanf_min.a</LIB></LIBS><LINKOBJECTS/><OPTIONSFORALL>-Wall -gdwarf-2 -DF_CPU=3686400UL -O3 -funsigned-char -funsigned-bitfields</OPTIONSFORALL><LINKEROPTIONS></LINKEROPTIONS><SEGMENTS/></CONFIG></CONFIGS><LASTCONFIG>default</LASTCONFIG><USES_WINAVR>1</USES_WINAVR><GCC_LOC>C:\Program Files\WinAVR\bin\avr-gcc.exe</GCC_LOC><MAKE_LOC>C:\Program Files\WinAVR\utils\bin\make.exe</MAKE_LOC></AVRGCCPLUGIN><ProjectFiles><Files><Name>C:\E240\ass3\RS232toRS485\P232.c</Name></Files></ProjectFiles><IOView><usergroups/></IOView><Files><File00000><FileId>00000</FileId><FileName>P232.c</FileName><Status>259</Status></File00000></Files><Workspace><File00000><Position>156 71 914 523</Position><LineCol>2 2</LineCol><State>Maximized</State></File00000></Workspace><Events><Bookmarks></Bookmarks></Events><Trace><Filters></Filters></Trace></AVRStudio>
/programy/C/avr/RS232toRS485/rs485.aws
0,0 → 1,0
<AVRWorkspace><IOSettings><CurrentRegisters/></IOSettings><part name="ATTINY2313"/><Files><File00000 Name="C:\E240\ass3\RS232toRS485\P232.c" Position="156 71 914 523" LineCol="2 2" State="Maximized"/></Files></AVRWorkspace>