zur Zeit bastel ich an einem 90s2313! Habe mal zum Testen die ASM-Datei "A P P L I C A T I O N N O T E A V R 3 0 5" geöfnet und bisle rumexperimentiert! Ich habe alles mal soweit endfernt um nur PutChar zu nutzen!
Als erstes wollte ich wissen ob ich die Daten auch auf einem Anderen Pin als PinD.1 ausgeben kann.
Mein Versuch wurde für den PinB.0 gewählt. Dort habe ich eine LED angeschlossen!
Mit dem Befehl
Sbi PORTB,Tx ;Init port pins auf 1
und mit
cbi PORTB,Tx ;Init port pins auf 0
Das klappt auch!
So, nun mein Problem :
Ich habe herausgefunden das das Programm ab dem Befehl UART_Delay irgendwas macht! Nach UART_Delay macht der Prozessor was er will! Sogar die LED wird dunkler!
Was kann das sein?
Grüße
Alex
Hier mal der Code :
;**** 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 : avr@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 "2313def.inc"
;***** Pin definitions
.equ Tx =0 ;Transmit pin is PB0
;***** Global register variables
.def bitcnt =R16 ;bit counter
.def temp =R17 ;temporary storage register
.def Txbyte =R18 ;Data to be transmitted
.cseg
.org 0
rjmp reset
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
;***** Program Execution Starts Here
;***** Test program
reset:
ldi temp,$FF
out DDRB,temp
ldi temp,$FF
out PORTB,temp
;cbi PORTB,Tx ;Init port pins auf 0
forever:
LDI TxByte, 12
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 epens on bit rate
;* Low registers used :None
;* High registers used :2 (bitcnt,Txbyte)
;* Pointers used :None
;*
;************************************************* **************************
.equ sb =1 ;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 PORTB,Tx ; send a '0'
rjmp putchar2 ;else
putchar1: sbi PORTB,Tx ; 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
;************************************************* **************************
;*
;* "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=14
; 19200 bps - b=5
; 28800 bps - b=2
;
; 2 MHz crystal:
; 19200 bps - b=14
; 28800 bps - b=8
; 57600 bps - b=2
Das die LED dünkler wird ist klar weil er so wie das programm aufgebaut ist ständig eine datenübertragung macht (forever schleife)...
bei der verzögerung von b=250 dauert die UART delay schleife ca. 200µs und damit ein bit noch immer nur ca. 400µs bei 4Mhz deshalb kein sichtbares blinken sondern ein dünkler werden der LED...
Lesezeichen