Komunikace po RS232
09. 11. 2006 | 01:00 - Ondřej Karas (durmitor) - 12333× přečteno
Tento díl je určen zejména začátečníkům, kteří s komunikací po sériové lince teprve začínají. Věnuje se nejen suché teorii, ale také praktické stránce problému, a přináží řešení hardware s převodníkem MAX232.
|Reklama
V čem je problém a na co je třeba MAX232?
V sekci download na webu http://k-programs.net je možné si stáhnou specifikaci RS232, kterou se stavy na sériové lince řídí, ale pro nezasvěcené tyto informace raději zopakuji.
Klidový stav je u Rozhraní RS232 reprezentován logickou 1, v tomto případě reprezentovanou záporným napětím. Log. 0 je naproti tomu reprezentována napětím kladným. V případě vysílače může napětí dosahovat min. −15 a max. +15 V, a to by obvody pracující s TTL úrovněmi spolehlivě zničilo.
Z tohoto důvodu je nutné použít obvod, který nám převede urovně z RS232 do úrovní TTL. Jedním z nich je i MAX232 (nebo např. ST232). Tento obvod je napájen 5 V a využívá nábojové pumpy pro tvorbu vyššího výstupního napětí.
Tento obvod vyrábí více výrobců, a tak není třeba zůstávat pouze u produktů firmy MAXIM. Např. SGH-THOMSON vyrábí ST232, který v závislosti na typu umožňuje využít menší hodnoty kondenzátorů, a tak i zmenšit i aplikaci, ve které je použit.
Vždy je nutné pečlivě si prostudovat dokumentaci k obvodům, které používáte. Přestože se výrobci snaží vyrábět pinově kompatibilní obvody, mnohdy se stává, že špatným nastudováním katalogového listu vzniknou zbytečné chyby.
Pokud to není nutné, nepoužívejte elektrolytických kondenzátorů, které mají na používané frekvenci poměrně vysoký sériový odpor, a zařízení se tak stává nespolehlivým. Doporučují se tantalové kondenzátory nebo keramické s hmotou X7R.
Kondenzátory umisťujte co nejblíže k vývodům obvodu.
Dobře, a teď k té praktické stránce
Tento díl má za úkol nejen plnit funkci vzdělávací, ale také čtenáři přinést námět, jak si vyrobit vlastní převodník s obvodem MAX232. Následující schéma ukazuje doporučené zapojení převodníku spolu se zdrojem.
Klikni pro zvětšení
Jak je dobře vidět, zapojení vychází z doporučeného zapojení výrobce. Funkci doplňují dvě diody pro indikaci stavu na linkách Rx, Tx. Tyto dvě diody doporučuji 2mA, aby neovlivňovaly funkci převodníku. Pakliže by bylo nutné z nějakého důvodu využít LED s větší spotřebou, je nutné pro ně přidat do zapojení spínací tranzistory. Například BC547, nebo obdobné.
Zapojení pak už jen doplňuje zdrojová část, jejíž funkci myslím nikomu nemusím vysvětlovat. Následují obrázky návrhu pložného spoje.
Dále je nutné si připravit konektor CANON9 a dostatečně dlouhý 3 žilový kabel, který na jednom konci připájíme k pinům 2, 3, 5 a na druhém k dutinkové liště se třemi pozicemi. Připomínám, že na konektoru je nutné mít pospojované piny 7, 8 a 1, 4, 6. Oživení přípravku je záležitostí jedné či dvou minut. Propojte TTL výstup s TTL vstupem, např. jumperem a ve vhodném terminálu odesílejte znaky. Pracuje-li přípravek, pak budete to samé přijímat. Indikaci přenosu obstarávají diody D2, D3.
V tuto chvíli máme postavený převodník RS232 ↔ TTL. Některá PC ale už Port s rozhrním RS232 nevlastní, a proto by se hodilo zapojení pro USB port. To si ukážeme příště spolu s ukázkovým programem pro AVR.
Pro nedočkavé přeci jen uvádím zdrojový kód:
Ukázat zdrojový kódZkopírovat do schránkyTisk
;uart.asm
;
;test program for Duplex UART
.include "m16def.inc"
ser r16 ;port B all outputs
out ddrb,r16
ldi r16,RAMEND ;initialise stack pointer
out spl,r16
sbi ucr,txen ;enable UART transmitter
sbi ucr,rxen ;enable UART receiver
ldi r16,5000000/(9600*16)-1 ;set baud rate
out ubrr,r16
loop:
rcall serin
rcall serout
rjmp loop ;do forever
;serial output routine - output byte in r16 to UART
serout:
out udr,r16 ;load UART data register
serout1:
sbis usr,udre ;if UART data register empty bit is clear
rjmp serout1 ; loop back
;else return
ret
;serial input routine - input byte from UART to r16
serin:
sbis usr,rxc ;if UART Receive Complete bit is clear
rjmp serin ; loop back
in r16,udr ;else get received byte in r16
ret ;and return
;uart.asm
;
;test program for Duplex UART
.include "m16def.inc"
ser r16 ;port B all outputs
out ddrb,r16
ldi r16,RAMEND ;initialise stack pointer
out spl,r16
sbi ucr,txen ;enable UART transmitter
sbi ucr,rxen ;enable UART receiver
ldi r16,5000000/(9600*16)-1 ;set baud rate
out ubrr,r16
loop:
rcall serin
rcall serout
rjmp loop ;do forever
;serial output routine - output byte in r16 to UART
serout:
out udr,r16 ;load UART data register
serout1:
sbis usr,udre ;if UART data register empty bit is clear
rjmp serout1 ; loop back
;else return
ret
;serial input routine - input byte from UART to r16
serin:
sbis usr,rxc ;if UART Receive Complete bit is clear
rjmp serin ; loop back
in r16,udr ;else get received byte in r16
ret ;and return
Program pochází z tohoto zdroje: www.geocities.com/leon_heller/uart.html