- français
- English
Routines RS232 software
Routines RS232 software, permet de connecter un terminal RS232 sur deux ports d'un ATtiny45, seulement 32 instructions, pas d'utilisation d'interruption !
;********************************************************************************** ;* Title : Routine RS232 software ;* Version : 1.0 ;* Last updated : zf 070719.2323 ;* Target : Atmel AVR ATtiny45 ;* ;* Support : www.zufferey.com ;* ;* putchar, getchar, UART_delay, routines très simples (seulement 32 instructions) ;* permettant de connecter un RS232 sur n'importe quels ports du MCU, elles ;* n'utilisent pas d'interruption ou spécificité du MCU ;********************************************************************************** .include "tn45def.inc" ;***** Pin definitions .equ RxD =2 ;Receive pin is PB2 .equ TxD =3 ;Transmit pin is PB3 ;***** Global register variables .def bitcnt =R16 ;bit counter .def temp =R17 ;temporary storage register .def Txbyte =R18 ;Data to be transmitted .def RXbyte =R19 ;Received data .def adr =R20 ;Adresse pour l'EEPROM ;***** Constantes .equ sb =1 ;Number of stop bits (1, 2, ...) ; constante b pour 1 MHz RC oscillator: ; 9600 bps - b=14 ; 4800 bps - b=31 ; 19200 bps - b=5 ; 28800 bps - b=2 .equ b =31 ; baud rate: 4800 bps .cseg .org 0 rjmp Reset ;***** putchar putchar: ldi bitcnt,9+sb ;1+8+sb (sb is # of stop bits) com Txbyte ;Inverte everything sec ;Start bit putchar0: brcc putchar1 ;If carry set ; cbi PORTB,TxD ; send a '0' en RS232 mode sbi PORTB,TxD ; send a '0' en TTL mode rjmp putchar2 ;else putchar1: ; sbi PORTB,TxD ; send a '1' en RS232 mode cbi PORTB,TxD ; send a '1' en TTL mode nop putchar2: rcall UART_delay ;One bit delay rcall UART_delay lsr Txbyte ;Get next bit dec bitcnt ;If not all bit sent brne putchar0 ; send next ;else ret ; return ;***** getchar getchar: ldi bitcnt,8+sb ;8 data bit + 1 stop bit getchar1: ; sbic PINB,RxD ;Wait for start bit en RS232 mode sbis PINB,RxD ;Wait for start bit en TTL mode rjmp getchar1 rcall UART_delay ;0.5 bit delay getchar2: rcall UART_delay ;1 bit delay rcall UART_delay clc ;clear carry ; sbic PINB,RxD ;if RX pin high en RS232 mode sbis PINB,RxD ;if RX pin high en TTL mode sec ; dec bitcnt ;If bit is stop bit breq getchar3 ; return ;else ror Rxbyte ; shift bit into Rxbyte rjmp getchar2 ; go get next getchar3: ret ;****** UART_delay UART_delay: ldi temp,b UART_delay1: dec temp brne UART_delay1 ret ;***** Test program reset: ldi r16, LOW(RAMEND) ;Setup of stack pointer ldi r17, HIGH(RAMEND) out SPL, r16 out SPH, r17 ; sbi PORTB,TxD ;Init port pins en RS232 mode cbi PORTB,TxD ;Init port pins en TTL mode sbi DDRB,TxD sbis PINB,RxD ;Test si une prise RS232 est connecté rjmp Test_RS232 ;Oui part dans la routine de test du RS232 ;fait clignoter le portB0 .def Delay =r17 ; Delay variable 1 .def Delay2 =r18 ; Delay variable 2 sbi DDRB,0 ; met le PORTB0 en sortie T1: sbi PORTB,0 ; Set PORTB0 rcall DLY1 cbi PORTB,0 ; Clear PORTB0 rcall DLY1 rjmp T1 ; Repeat loop forever DLY1: ldi Delay2, 0 DLY2: dec Delay brne DLY2 dec Delay2 brne DLY2 ret ;Envoie Hello Word sur le port RS232 Test_RS232: rcall getchar ldi Txbyte,12 ;Clear terminal (FromFeed) rcall putchar forever: rcall getchar ; mov Txbyte,Rxbyte ; rcall putchar ;Echo received char ; rjmp forever ldi adr, HIGH(example_data) out EEARH,adr ;output address high ldi adr,LOW(example_data) ;Set/Restore pointer to EEPROM data loop: out EEARL,adr ;Set the EEPROM's address sbi EECR,EERE ;Send the Read strobe in Txbyte,EEDR ;Put the data in the transmit register rcall putchar ;And transmit the data inc adr ;Increase pointer cpi adr,example_data+13 ;Reached byte 13? (End?) breq forever ;Yes, wait for new char. rjmp loop ;Continue sendig chars .eseg example_data: .db 'H' .db 'e' .db 'l' .db 'l' .db 'o' .db ' ' .db 'W' .db 'o' .db 'r' .db 'l' .db 'd' .db 13 .db 10
(c) 2007 www.zufferey.com
- Ce wiki
- Cette page