/programy/Atmel_C/RS232toRS485/P232.c |
---|
0,0 → 1,112 |
//---------------------------------------------------------------------------------- |
// Prevodnik RS232 <--> RS485 |
// pri startbitu na RS232 zapne okamzite vysilac pokud nejsou detekovana data z RS485. |
//---------------------------------------------------------------------------------- |
// |
//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 spickam vzniklych v dusledku ruseni. |
// Proto je nutene napajeni kvalitne stbilizovat, pouzivat blokovaci kondenzatory a |
// zabezpecit, aby nedochazelo ke zvedani zeme. |
///////////////////////////////////////////////////////////////////////////////////// |
// |
//TODO: |
// 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 |
// mohlo dochazet k preteceni promenne cas. |
// Neni vyzkousen break, byly testovany pouze ASCII znaky vysilane pres terminal z klavesnice. |
////////////////////////////////////////////////////////////////////////////////////// |
// |
#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 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 |
{ |
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; |
// DDRD |= (1<<DDD5); // povoleni vystupu pro blikani ledkou (mozno odebrat) |
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 |
bit=0; // vynuluj vsechny promenne pro mereni casu a pocitani bitu |
TCNT0=0; |
preteceni=0; |
cas = 0xFFFF; // nastav cas delky bitu na nejvetsi mozny |
while (bit <= 8) // odpocitej dobu 8mi bitu |
{ |
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 do dalsiho mozneho bitu |
preteceni=0; |
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 (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/Atmel_C/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/Atmel_C/RS232toRS485/default/rs485.hex |
---|
0,0 → 1,28 |
:1000000012C02AC041C028C027C026C026C024C0B4 |
:1000100023C022C021C020C01FC01EC01DC01CC0E4 |
:100020001BC01AC019C011241FBECFEDCDBF10E0F8 |
:10003000A0E6B0E0EAEAF1E003C0C89531960D927F |
:10004000A036B107D1F710E0A0E6B0E001C01D92E4 |
:10005000A836B107E1F758C0D3CF1F920F920FB661 |
:100060000F9211248F939F9380916200909163006F |
:10007000019690936300809362009F918F910F90FF |
:100080000FBE0F901F9018951F920F920FB60F92F0 |
:1000900011242F933F938F939F9322B780916200F7 |
:1000A00090916300982F8827820F911D9093610093 |
:1000B0008093600020916000309161008091640025 |
:1000C000909165002817390740F480916000909165 |
:1000D0006100909365008093640012BE10926300EB |
:1000E0001092620080916600909167000196909353 |
:1000F0006700809366009F918F913F912F910F90A1 |
:100100000FBE0F901F901895BB9A89B7826089BF68 |
:1001100085B7846085BF8BB780688BBF83B78160EC |
:1001200083BF78946FEF7FEF83993DC0C39A10929D |
:1001300067001092660012BE109263001092620077 |
:1001400070936500609364008091660090916700F1 |
:10015000099750F782B72091620030916300409177 |
:10016000640050916500322F222799278C599F4FA8 |
:10017000280F391F2417350738F312BE1092630079 |
:1001800010926200809166009091670001969093B2 |
:1001900067008093660080916600909167000997E0 |
:0A01A000C8F2839BC3CFC398BFCF02 |
:00000001FF |
/programy/Atmel_C/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/Atmel_C/RS232toRS485/rs485.aps |
---|
0,0 → 1,0 |
<AVRStudio><MANAGEMENT><ProjectName>rs485</ProjectName><Created>22-May-2007 10:20:14</Created><LastEdit>31-May-2007 10:59:12</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\program\Atmel_C\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\program\Atmel_C\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>85 19</LineCol><State>Maximized</State></File00000></Workspace><Events><Bookmarks></Bookmarks></Events><Trace><Filters></Filters></Trace></AVRStudio> |
/programy/Atmel_C/RS232toRS485/rs485.aws |
---|
0,0 → 1,0 |
<AVRWorkspace><IOSettings><CurrentRegisters/></IOSettings><part name="ATtiny2313"/><Files><File00000 Name="C:\E240\ass3\program\Atmel_C\RS232toRS485\P232.c" Position="-2 71 1026 523" LineCol="87 32" State="Maximized"/></Files></AVRWorkspace> |