PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AVRMEGA88 und USART



teslanikola
06.11.2006, 22:26
Hallo, ich hab ein mittelschweres Problem:

ich bekomme den USART0 im M88 einfach nicht zum laufen, bekomme beim Compalieren immer den Fehler:

...\Theseus.asm(68): error: Operand 1 out of range: 0xc5

und das ganze immer dort wo ich daten in die Steuerregister des USARTs schreibe oder Daten daraus lese oder Daten in den Datenport schreibe.

Was mache ich falsch?

hier der Code:


;################################################# ##################################
;# #
;# THESEUS #
;# ---------- #
;# #
;# Microcontroller: ATMEGA88 #
;# Quarz: 7.3728 MHz #
;# #
;# Autor: Denis Bethäuser #
;# www.elektronik4freaks.de.tk #
;# denis.bethaeuser@gmx.de #
;# #
;################################################# ##################################


;----[ µC Includefiles I ]----------------------------------------------------------

.include "m88def.inc"




;----[ Register Def. / Alias Def. ]-------------------------------------------------

.def tmp = r16 ; Universalregister 1 ( zT Low-Byte )
.def tmp2 = r17 ; Universalregister 2 ( zT High-Byte )

.equ clock = 7372800
.equ baud = 9600
.equ ubrrval = clock/(baud*16)-1




;----[ Interrupt-Vektoren ]---------------------------------------------------------

.org 0000 ; Zum Programmbeginn springen
rjmp reset

.org OVF1addr
rjmp reset




;----[ STACK-Pointer und Z-Pointer Einrichten ]-------------------------------------

reset: ; Programm beginnt

ldi tmp, high(ramend) ; High-Byte in Stackpointer schreiben
out SPH, tmp

ldi tmp, low(ramend) ; Low-Byte in Stackpointer schreiben
out SPL, tmp




;----[ I/O Einstellungen ]----------------------------------------------------------





;----[ UART Einstellungen ]---------------------------------------------------------

ldi tmp, high(ubrrval) ; Baudrate-Highbyte schreiben
out UBRR0H, tmp

ldi tmp, low(ubrrval) ; Baudrate-Lowbyte schreiben
out UBRR0L, tmp

ldi tmp, (1<<RXEN0)|(1<<TXEN0) ; Empfang-Inter., Senden + Empfangen aktiv.
out UCSR0B, tmp

ldi tmp, (1<<USBS0)|(3<<UCSZ00) ; Datenformat: 8N1
out UCSR0C, tmp




/*----[ ADC Einstellungen ]----------------------------------------------------------

ldi tmp, (1<<REFS0)|(1<<ADLAR) ; Referenz = Vcc, 8 Bit-Modus, ADC0
out ADMUX, tmp

ldi tmp, (1<<ADEN)|(1<<ADATE)|(1<<ADSC)|(1<<ADPS1)
out ADCSR, tmp ; Frei, Start Conver., Tackt=Clock/4

*/

sei





;####[ Hauptprogramm ]################################################## ############

main:

rjmp main

;################################################# ##################################





;---[ RS232 Sendesubroutine ]-------------------------------------------------------

send:

sbis UCSR0A, UDRE0 ; Warte bis Sendepuffer leer
rjmp send

out UDR0, tmp ; Byte im Arbeitsregister senden

ret


Bitte Helft mir, beim Mega8 klapts ( mit entsprechenden Register versteht sich ) aber warum hier nede, bin am abschnallen!!!!!!

AVRboy
06.11.2006, 22:32
hast schonmal ins datenblatt gesehen der m8 und m88 haben zwar viele gemeinsamkeiten aber vielleicht ist grade da was anderst.

mfg

teslanikola
06.11.2006, 22:47
Ich hangel mich seit ne halben stunde durchs Datenblatt und die Register stimmen ( hab ich ja geändert ) aber ich kann die nicht beschreiben, die Register stehen auch im Includefile also muss das passen.

izaseba
06.11.2006, 23:32
Zufälligerweise lese ich woanders vom gleichem Problem Bist Du das ? (http://www.mikrocontroller.net/topic/show/56425#436196)

Du mußt die Register genauso ansprechen, wie RAM mit sts dann klappt es auch...

Gruß Sebastian

teslanikola
06.11.2006, 23:35
Um ehrlich zu sein: Ja.

izaseba
06.11.2006, 23:42
He,He dann mach es auch so


Operand 1 out of range: 0xc5

0xc5 wo bist Du da im Ram ?

versuch mal mit


ldi R16,(1<<RXEN0)|(1<<TXEN0)
sts UCSR0B, R16


Das sollte klappen meiner Meinung nach...

Gruß Sebastian

teslanikola
07.11.2006, 15:04
genau so hab ichs gemacht, aber im Simulator tut sich in den entsprechenden I/os absulut nix, das find ich ja so komisch