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