www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMEGA64 und UART


Autor: blutengel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
AVR-Assembler-Code
.include "m64def.inc"
.def temp = r16
.equ CLOCK = 12000000
.equ BAUD = 9600
.equ UBRRVAL = CLOCK/(BAUD*16)-1
; Stackpointer initialisieren
ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp
; Baudrate einstellen
ldi temp, LOW(UBRRVAL)
out UBRR0L, temp
ldi temp, HIGH(UBRRVAL)
out UBRR0H, temp
; Frame-Format: 8 Bit
ldi temp, (1<<URSEL)|(3<<UCSZ0)
out UCSR0C, temp
sbi UCSR0B,TXEN0 ; TX aktivieren
loop: ldi temp, 'T'
rcall serout ; Unterprogramm aufrufen
ldi temp, 'e'
rcall serout ; Unterprogramm aufrufen
ldi temp, 's'
rcall serout ; ...
ldi temp, 't'
rcall serout
ldi temp, '!'
rcall serout
ldi temp, 10
rcall serout
ldi temp, 13
rcall serout
rjmp loop
serout:
sbis UCSR0A,UDRE0 ; Warten bis UDR für das nächste
; Byte bereit ist
rjmp serout
out UDR0, temp
ret ; zurück zum Hauptprogramm



MFG

blutengel

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jean Player (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

Was soll der Assembler damit anfangen?

MfG Spess

Autor: blutengel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.


  .include "m64def.inc"
  .def temp = r16
  .equ CLOCK = 12000000
  .equ BAUD = 9600
  .equ UBRRVAL = CLOCK/(BAUD*16)-1
  ; Stackpointer initialisieren
  ldi temp, LOW(RAMEND)
  out SPL, temp
  ldi temp, HIGH(RAMEND)
  out SPH, temp
  ; Baudrate einstellen
  ldi temp, LOW(UBRRVAL)
  out UBRR0L, temp
  ldi temp, HIGH(UBRRVAL)
  sts UBRR0H, temp
  ; Frame-Format: 8 Bit
  ldi temp, (1<<USBS0)|(3<<UCSZ00)
  sts UCSR0C, temp
  sbi UCSR0B,TXEN0 ; TX aktivieren
  loop: ldi temp, 'T'
  rcall serout ; Unterprogramm aufrufen
  ldi temp, 'e'
  rcall serout ; Unterprogramm aufrufen
  ldi temp, 's'
  rcall serout ; ...
  ldi temp, 't'
  rcall serout
  ldi temp, ' '
  rcall serout
  ldi temp, 'O'
  rcall serout
  ldi temp, 'K'
  rcall serout
  ldi temp, 10
  rcall serout
  ldi temp, 13
  rcall serout
  ldi temp, 10
  rcall serout
  ldi temp, 13
  rcall serout
  rjmp loop
  serout:
  sbis UCSR0A,UDRE0 ; Warten bis UDR für das nächste
  ; Byte bereit ist
  rjmp serout
  out UDR0, temp
  ret ; zurück zum Hauptprogramm

MFG

blutengel

Autor: holger (Gast)
Datum:

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

Du hast 2 eingestellt.

Autor: blutengel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist es dann so richtig:

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

MFG

blutengel

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Nein. Die Stopbits werden mit USBS0 eingestellt.

MfG Spess

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.