Hi!
Ich mal wieder. Wollte mit dem Code Beispiel aus dem ASM Tutorial die
Uart meines ATMEGA64 testen. Habe meiner Meinung nach auch alle
änderungen vorgenommen,bekomme aber beim erstellen immer noch 3
Fehlermeldungen.
C:\Dokumente und Einstellungen\Claudia\Eigene
Dateien\MEGA&$_SER_OUT\MEGA&$_SER_OUT.asm(15): error: Operand 1 out of
range: 0x90
C:\Dokumente und Einstellungen\Claudia\Eigene
Dateien\MEGA&$_SER_OUT\MEGA&$_SER_OUT.asm(17): error: Undefined symbol:
URSEL
C:\Dokumente und Einstellungen\Claudia\Eigene
Dateien\MEGA&$_SER_OUT\MEGA&$_SER_OUT.asm(18): error: Operand 1 out of
range: 0x95
Was habe ich noch falsch.Sollte vielleicht noch dabei sagen das ich die
UART 0 nehme
1
AVR-Assembler-Code
2
.include "m64def.inc"
3
.def temp = r16
4
.equ CLOCK = 12000000
5
.equ BAUD = 9600
6
.equ UBRRVAL = CLOCK/(BAUD*16)-1
7
; Stackpointer initialisieren
8
ldi temp, LOW(RAMEND)
9
out SPL, temp
10
ldi temp, HIGH(RAMEND)
11
out SPH, temp
12
; Baudrate einstellen
13
ldi temp, LOW(UBRRVAL)
14
out UBRR0L, temp
15
ldi temp, HIGH(UBRRVAL)
16
out UBRR0H, temp
17
; Frame-Format: 8 Bit
18
ldi temp, (1<<URSEL)|(3<<UCSZ0)
19
out UCSR0C, temp
20
sbi UCSR0B,TXEN0 ; TX aktivieren
21
loop: ldi temp, 'T'
22
rcall serout ; Unterprogramm aufrufen
23
ldi temp, 'e'
24
rcall serout ; Unterprogramm aufrufen
25
ldi temp, 's'
26
rcall serout ; ...
27
ldi temp, 't'
28
rcall serout
29
ldi temp, '!'
30
rcall serout
31
ldi temp, 10
32
rcall serout
33
ldi temp, 13
34
rcall serout
35
rjmp loop
36
serout:
37
sbis UCSR0A,UDRE0 ; Warten bis UDR für das nächste
Hi
>Dateien\MEGA&$_SER_OUT\MEGA&$_SER_OUT.asm(15): error: Operand 1 out of>range: 0x90
Eine Reihe der IO-Register der ATMega64, z.B. UBRR0H, sind nicht mehr
mit in/out erreichbar. Das musst du für diese Register durch lds/sts
ersetzen.
MfG Spess
Und das URSEL bit brauchste nicht mehr beim Mega64 setzen, fürs
schreiben auf UCSR0C.
Zudem schreib lieber vorsichtshalber, nen unsigned long an diese
Stellen:
.equ CLOCK = 12000000UL
.equ BAUD = 9600UL
Gruß
Jo jetzt sind die Fehler weg. Funktioniert auch
Habe es mit Proteus getestet. Was mich noch wundert ist das in der AVR
Studio Simulation bei Stop Bit Select 2 Bit steht obwohl ich doch 1
eingestellt habe.
1
.include "m64def.inc"
2
.def temp = r16
3
.equ CLOCK = 12000000
4
.equ BAUD = 9600
5
.equ UBRRVAL = CLOCK/(BAUD*16)-1
6
; Stackpointer initialisieren
7
ldi temp, LOW(RAMEND)
8
out SPL, temp
9
ldi temp, HIGH(RAMEND)
10
out SPH, temp
11
; Baudrate einstellen
12
ldi temp, LOW(UBRRVAL)
13
out UBRR0L, temp
14
ldi temp, HIGH(UBRRVAL)
15
sts UBRR0H, temp
16
; Frame-Format: 8 Bit
17
ldi temp, (1<<USBS0)|(3<<UCSZ00)
18
sts UCSR0C, temp
19
sbi UCSR0B,TXEN0 ; TX aktivieren
20
loop: ldi temp, 'T'
21
rcall serout ; Unterprogramm aufrufen
22
ldi temp, 'e'
23
rcall serout ; Unterprogramm aufrufen
24
ldi temp, 's'
25
rcall serout ; ...
26
ldi temp, 't'
27
rcall serout
28
ldi temp, ' '
29
rcall serout
30
ldi temp, 'O'
31
rcall serout
32
ldi temp, 'K'
33
rcall serout
34
ldi temp, 10
35
rcall serout
36
ldi temp, 13
37
rcall serout
38
ldi temp, 10
39
rcall serout
40
ldi temp, 13
41
rcall serout
42
rjmp loop
43
serout:
44
sbis UCSR0A,UDRE0 ; Warten bis UDR für das nächste