Forum: Mikrocontroller und Digitale Elektronik ATMEGA64 und UART


von blutengel (Gast)


Lesenswert?

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
38
; Byte bereit ist
39
rjmp serout
40
out UDR0, temp
41
ret ; zurück zum Hauptprogramm


MFG

blutengel

von spess53 (Gast)


Lesenswert?

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

von Jean Player (Gast)


Lesenswert?

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ß

von spess53 (Gast)


Lesenswert?

Hi

>.equ CLOCK = 12000000UL
>.equ BAUD = 9600UL

Was soll der Assembler damit anfangen?

MfG Spess

von blutengel (Gast)


Lesenswert?

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
45
  ; Byte bereit ist
46
  rjmp serout
47
  out UDR0, temp
48
  ret ; zurück zum Hauptprogramm

MFG

blutengel

von holger (Gast)


Lesenswert?

>Studio Simulation bei Stop Bit Select 2 Bit steht obwohl ich doch 1
>eingestellt habe.

Du hast 2 eingestellt.

von blutengel (Gast)


Lesenswert?

Ist es dann so richtig:

ldi temp, (1<<USBS0)|(1<<UCSZ00)??

MFG

blutengel

von spess53 (Gast)


Lesenswert?

Hi

Nein. Die Stopbits werden mit USBS0 eingestellt.

MfG Spess

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.