Gast
#1115282
Ich versuche gerade das UART beispiel für meinen atmaga162 umzubastel
und irgendwie scheint URXaddr im "m162def.inc" nict vorhanden zus
sein...
Jedenfalls bekomme ich folgende fehler
F:\#Daten\gps\gps_0\gps_0.asm(21): error: Use of undefined or forward
referenced symbol 'URXCaddr' in .org
F:\#Daten\gps\gps_0\gps_0.asm(22): error: Overlap in .cseg: addr=0x0
conflicts with 0x0:0x1
alles was ich gemacht hab is das .include "m8def.inc" in .include
"m162def.inc" umgewandelt...
Hat jemand ne ahnung was ich falsch mache? Langsam bin ich nämlich am
verzweifeln :-(
hier nochmal mein code
.include "m162def.inc"
.def temp = R16
.equ F_CPU = 4000000 ; Systemtakt in Hz
.equ BAUD = 9600 ; Baudrate
; Berechnungen
.equ UBRR_VAL = ((F_CPU+BAUD*8)/(BAUD*16)-1) ; clever runden
.equ BAUD_REAL = (F_CPU/(16*(UBRR_VAL+1))) ; Reale Baudrate
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000) ; Fehler in Promille
.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10)) ; max. +/-10 Promille
Fehler
.error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit
zu hoch!"
.endif
.org 0x00
rjmp main
.org URXCaddr ; Interruptvektor für
UART-Empfang
rjmp int_rxc
; Hauptprogramm
main:
; Stackpointer initialisieren
ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp
; Port D = Ausgang
ldi temp, 0xFF
out DDRD, temp
; Baudrate einstellen
ldi temp, HIGH(UBRR_VAL)
out UBRRH, temp
ldi temp, LOW(UBRR_VAL)
out UBRRL, temp
; Frame-Format: 8 Bit
ldi temp, (1<<URSEL)|(3<<UCSZ0)
out UCSRC, temp
sbi UCSRB, RXCIE ; Interrupt bei Empfang
sbi UCSRB, RXEN ; RX (Empfang) aktivieren
sei ; Interrupts global
aktivieren
loop:
rjmp loop ; Endlosschleife
; Interruptroutine: wird ausgeführt sobald ein Byte über das UART
empfangen wurde
int_rxc:
push temp ; temp auf dem Stack sichern
in temp, UDR ; empfangenes Byte lesen,
; dadurch wird auch der
Interrupt gelöscht
out PORTD, temp ; Daten ausgeben
pop temp ; temp wiederherstellen
reti ; Interrupt beenden
Also alles haarklein wie im bsp...