BID = 17490
Jornbyte Moderator
Beiträge: 7196
|
Das ASM - Beispiel:
.include "tutorial/uart/2313def.inc" ;Pfad zur Include-Datei ggf. anpassen
.def temp = r18
.def counter = r17
.def fbin = r19 ;Ausgangswert
.def tBCDL = r19 ;Obere Dezimalstelle
.def tBCDH = r20 ;Untere Dezimalstelle
.org 0000
rjmp reset ; RESET =$001 ;Reset
RETI ; INT0addr=$001 ;External Interrupt0 Vector Address
RETI ; INT1addr=$002 ;External Interrupt1 Vector Address
RETI ; ICP1addr=$003 ;Input Capture1 Interrupt Vector Address
RETI ; OC1Aaddr=$004 ;Output Compare1A Interrupt Vector Address
rjmp check ; OVF1addr=$005 ;Overflow1 Interrupt Vector Address
RETI ; OVF0addr=$006 ;Overflow0 Interrupt Vector Address
RETI ; SPIaddr =$007 ;SPI Interrupt Vector Address
RETI ; URXCaddr=$008 ;UART Receive Complete Interrupt Vector Address
RETI ; UDREaddr=$009 ;UART Data Register Empty Interrupt Vector Address
RETI ; UTXCaddr=$00a ;UART Transmit Complete Interrupt Vector Address
RETI ; ADCCaddr =$00b ;ADC Interrupt Vector Address
RETI ; ERDYaddr =$00c ;EEPROM Interrupt Vector Address
RETI ; ACIaddr =$00d ;Analog Comparator Interrupt Vector Address
reset:
;Stackpointer initialisieren
ldi temp, RAMEND
out SPL, temp
ldi temp, 25 ;9600 baud bei 4.000.000 Hz
out UBRR, temp
ldi temp, 0xFF ;hab da noch nen paar LEDs hängen
out DDRB, temp
out PORTB, temp
ldi counter, 0 ;Counter auf 0 setzen
; Timer initialisieren
ldi temp, 0x00 ;kein pwm und kein output-pin
out tccr1a, temp
ldi temp, 0b00000101 ;/1024
out tccr1b, temp
ldi temp, 240 ;Werte für 1 Sekunde verzögerung
out tcnt1h, temp
ldi temp, 190
out tcnt1l, temp
ldi temp, 0b10000000 ;Interrupt freigeben
out timsk, temp
sei ;Allgemeine Interruptfreigabe
loop:
rjmp loop
check:
in r25,sreg ;Status-Reg sichern
ldi temp, 240 ;Timer wieder updaten
out TCNT1H, temp
ldi temp, 190
out tcnt1l, temp
mov fbin, counter ;counter nach fbin kopieren
rcall bin2bcd8 ;fbin in tBCDL und tBCDH aufteilen
mov temp, tBCDH ;obere Dezimalstelle
subi temp, -48 ;48 addieren um in ASCII umzuwandeln
;die AVRs haben keinen Befehl zum Addieren von
;Konstanten, deshalb -48 abziehe.
rcall serout ;Byte senden
mov temp, tBCDL ;untere Dezimalstelle
subi temp, -48 ;48 addieren um in ASCII umzuwandeln
rcall serout ;Byte senden
ldi temp, 10 ;ASCII-Wert für "Neue Zeile"
rcall serout ;Byte senden
ldi temp, 13 ;ASCII-Wert für "Cursor zurück"
rcall serout ;Byte senden
out PORTB, counter ;Zählerstand auf den Port geben
inc counter ;counter += 1
cpi counter, 100 ;Zähler bei 100?
brne weiter ;wenn nicht, dann zu "weiter" springen
ldi counter, 0 ;andernfalls counter zurück auf 0 setzen
weiter:
out sreg,r25 ;Status-Reg wiederherstellen
reti
bin2bcd8:
clr tBCDH ;clear result MSD
bBCD8_1:subi fbin,10 ;input = input - 10
brcs bBCD8_2 ;abort if carry set
inc tBCDH ;inc MSD
rjmp bBCD8_1 ;loop again
bBCD8_2:subi fbin,-10 ;compensate extra subtraction
ret
serout:
sbi ucr,txen ;set sender bit
sbis usr,udre ;wait till register is cleared
rjmp serout
out udr,temp ;send the variable
cbi ucr,txen ;clear sender bit
ret
_________________
mfg Jornbyte
Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.
|