Probleme mit AVR STK200 UART

Hallo Zusammen,

ich probiere gerade verzweifelt den AT90S8515 des AVR STK200 über RS232 anzusprechen.

Dazu habe ich unten angehängtes Beispielprogramm adaptiert, welches die Daten zurücksendet. Jedoch reagiert er auf das Startbit meines Hyperterminals nicht. Er bleibt ewig in der "Auf-startbit"warteschleife. (Dies ändert sich nur, wenn ich über den Taster PD0 selbst betätige, und somit das Startbit,simuliere.)

Woran kann das liegen ???

Vielen Dank

Steve

###################################################################################################################################################### ;**** A P P L I C A T I O N N O T E A V R 3 0 5

************************ ;* ;* Title : Half Duplex Interrupt Driven Software UART ;* Version : 1.1 ;* Last updated : 97.08.27 ;* Target : AT90Sxxxx (All AVR Device) ;* ;* Support email : snipped-for-privacy@atmel.com ;* ;* Code Size : 32 Words ;* Low Register Usage : 0 ;* High Register Usage : 4 ;* Interrupt Usage : None ;* ;* DESCRIPTION ;* This Application note contains a very code efficient software UART. ;* The example program receives one character and echoes it back. ;***************************************************************************

.include "8515def.inc"

;***** Pin definitions

.equ RxD ÿ ;Receive pin is PD0 .equ TxD  ;Transmit pin is PD1

;***** 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

.cseg .org 0

ldi R20, RAMEND ;Stackpointer initialisieren out SPL, R20

; ;***** Program Execution Starts Here

;***** Test program

reset: sbi PORTD,TxD ;Init port pins sbi DDRD,TxD sbi PORTD,RxD sbi DDRD, RxD

ldi Txbyte,12 ;Clear terminal ldi r20,0xAA out DDRB,r20 rcall getchar

forever: rcall getchar mov Txbyte,Rxbyte rcall putchar ;Echo received char rjmp forever ; ;*************************************************************************** ;* ;* "putchar" ;* ;* This subroutine transmits the byte stored in the "Txbyte" register ;* The number of stop bits used is set with the sb constant ;* ;* Number of words :14 including return ;* Number of cycles :Depens on bit rate ;* Low registers used :None ;* High registers used :2 (bitcnt,Txbyte) ;* Pointers used :None ;* ;*************************************************************************** .equ sb  ;Number of stop bits (1, 2, ...)

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 PORTD,TxD ; send a '0' rjmp putchar2 ;else

putchar1: sbi PORTD,TxD ; send a '1' 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" ;* ;* This subroutine receives one byte and returns it in the "Rxbyte" register ;* ;* Number of words :14 including return ;* Number of cycles :Depens on when data arrives ;* Low registers used :None ;* High registers used :2 (bitcnt,Rxbyte) ;* Pointers used :None ;* ;***************************************************************************

getchar: ldi bitcnt,9 ;8 data bit + 1 stop bit ldi r20,0xFF out DDRB,r20 getchar1: sbic PIND,RxD ;Wait for start bit rjmp getchar1

rcall UART_delay ;0.5 bit delay

getchar2: rcall UART_delay ;1 bit delay rcall UART_delay

clc ;clear carry sbic PIND,RxD ;if RX pin high 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" ;* ;* This delay subroutine generates the required delay between the bits when ;* transmitting and receiving bytes. The total execution time is set by the ;* constant "b": ;* ;* 3·b + 7 cycles (including rcall and ret) ;* ;* Number of words :4 including return ;* Low registers used :None ;* High registers used :1 (temp) ;* Pointers used :None ;* ;*************************************************************************** ; Some b values: (See also table in Appnote documentation) ; ; 1 MHz crystal: ; 9600 bps - b ; 19200 bps - bO ; 28800 bps - b ;

; 2 MHz crystal: ; 19200 bps - b ; 28800 bps - b ; 57600 bps - b

; 4 MHz crystal: ; 19200 bps - b1 ; 28800 bps - b ; 57600 bps - b ; 115200 bps - b

.equ b 1 ;19200 bps @ 4 MHz crystal

UART_delay: ldi temp,b UART_delay1: dec temp ldi r20,0x00 out DDRB,r20 brne UART_delay1

ret

--
Immer auf dem aktuellen Stand mit den Newsgroups von freenet.de:
http://newsgroups.freenet.de
Reply to
Steve Windisch
Loading thread data ...

Hallo Steve,

Ohne den Code im letzten Detail angeschaut zu haben: Du setzt im DDRD sowohl das Bit für RxD als auch für TxD. Kann es sein, daß Du damit beide auf Ausgang schaltest? RxD sollte doch ein Eingang sein...

Tom

--

------------------------------------------------------
Bitte beachten - AntiSpam-Filter: *.com, *.cn, *.br, *.kr, *.net, *.pl, 
*.ro, *.ru
Reply to
Thomas Langhammer

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.