Forum: Mikrocontroller und Digitale Elektronik Mega328p UART Problem


von Domi N. (dominator)


Lesenswert?

Hi, da dies mein erster Beitrag ist gibts erstmal ein par Eckdaten:

Seit einigen Tagen beschäftige ich mich nun mit Mikrocontrollern, 
speziell den AVRs. Diese Seite kenne ich schon länger, nur hat bisher 
die Ambition/Zeit gefehlt mich mit diesem interessanten Thema zu 
befassen.
Nun hab ich etwas Urlaub und habe mir (leider nur) einen Mega88, 
Kleinkram, Breadboard und einen ISP MKII zugelegt. Flux aufgebaut und 
los gings mit dem Assembler Tutorial.
nun bin ich beim Kapitel UART und konnte den Mega nicht mehr mit dem 
internen Oszillator betreiben. Daher habe ich einen 8Mhz Quarzoszillator 
mit angeschlossen und wollte die Fuses setzen, leider hab ich das wohl 
falsch gemacht, der Controller will nicht mehr.
Vor längerer Zeit hatte ich mir schon einen Arduino UNO zugelegt, fand 
die IDE aber nicht schön. Mir ging es jetzt darum den Mega328P auf dem 
duino zu verwenden, der hat ja schon alles dabei, nun zu meinem Problem:

Ich habe den Beispielcode an den 328P angepasst, AVR-Studio meldet aber 
beim builden folgende Fehler, ich steig da einfach nicht durch, 
vielleicht kann mir da jemand auf die Sprünge helfen?
1
Warning  1  Register r26 already defined by the .DEF directive  
2
Warning  2  Register r27 already defined by the .DEF directive  
3
Error  3  Operand 1 out of range: 0xc4
4
Error  4  Operand 1 out of range: 0xc5
5
Error  5  Operand 1 out of range: 0xc1
6
Error  6  Operand 1 out of range: 0x7c
7
Error  7  Operand 1 out of range: 0x7a
8
Error  8  Operand 1 out of range: 0x7a
9
Error  9  Operand 1 out of range: 0x7a

von Domi N. (dominator)


Lesenswert?

Achso, der Beispielcode wäre vielleich noch hilfreich:
1
.include "m328pdef.inc"
2
 
3
.def temp1     = r16         ; allgemeines temp Register, zur kurzfristigen Verwendung
4
.def temp2     = r17         ; Register für 24 Bit Addition, Lowest Byte
5
.def temp3     = r18         ; Register für 24 Bit Addition, Middle Byte
6
.def temp4     = r19         ; Register für 24 Bit Addition, Highest Byte
7
.def adlow     = r20         ; Ergebnis vom ADC / Mittelwert der 256 Messungen
8
.def adhigh    = r21         ; Ergebnis vom ADC / Mittelwert der 256 Messungen
9
.def messungen = r22         ; Schleifenzähler für die Messungen
10
.def ztausend  = r23         ; Zehntausenderstelle des ADC Wertes
11
.def tausend   = r24         ; Tausenderstelle des ADC Wertes
12
.def hundert   = r25         ; Hunderterstelle des ADC Wertes
13
.def zehner    = r26         ; Zehnerstelle des ADC Wertes
14
.def zeichen   = r27         ; Zeichen zur Ausgabe auf den UART
15
 
16
.equ F_CPU = 8000000                           ; Systemtakt in Hz
17
.equ BAUD  = 9600                               ; Baudrate
18
 
19
; Berechnungen
20
.equ UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)  ; clever runden
21
.equ BAUD_REAL  = (F_CPU/(16*(UBRR_VAL+1)))     ; Reale Baudrate
22
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)  ; Fehler in Promille
23
 
24
.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))       ; max. +/-10 Promille Fehler
25
  .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!"
26
.endif
27
 
28
; hier geht das Programm los
29
 
30
    ldi     temp1, LOW(RAMEND)                  ; Stackpointer initialisieren
31
    out     SPL, temp1
32
    ldi     temp1, HIGH(RAMEND)
33
    out     SPH, temp1
34
 
35
;UART Initalisierung
36
 
37
    ldi     temp1, LOW(UBRR_VAL)                    ; Baudrate einstellen
38
    out     UBRR0L, temp1
39
    ldi     temp1, HIGH(UBRR_VAL)
40
    out     UBRR0H, temp1
41
 
42
    sbi     UCSR0B, TXEN0                         ; TX einschalten
43
 
44
; ADC initialisieren: ADC0, Vcc als Referenz, Single Conversion, Vorteiler 128
45
 
46
    ldi     temp1, (1<<REFS0)                   ; Kanal 0, interne Referenzspannung 5V
47
    out     ADMUX, temp1
48
    ldi     temp1, (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0)
49
    out     ADCSRA, temp1
50
 
51
Main:
52
    clr     temp1
53
    clr     temp2
54
    clr     temp3
55
    clr     temp4
56
 
57
    ldi     messungen, 0        ; 256 Schleifendurchläufe
58
 
59
; neuen ADC-Wert lesen  (Schleife - 256 mal)
60
 
61
sample_adc:
62
    sbi     ADCSRA, ADSC        ; den ADC starten
63
 
64
wait_adc:
65
    sbic    ADCSRA, ADSC        ; wenn der ADC fertig ist, wird dieses Bit gelöscht
66
    rjmp    wait_adc

von Spess53 (Gast)


Lesenswert?

Hi

>Error  3  Operand 1 out of range: 0xc4

0xC4 ist die Registeradresse von UBRR0L. IN/OUT können aber nur Register 
mit Adressen <0x40 adressieren. Für >=0x40 musst du STS/LDS verwenden. 
Im Datenblatt findest du die Registeradressen unter 'Register Summary'.

MfG Spess

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Domi Ryan schrieb:
> Warning  1  Register r26 already defined by the .DEF directive
> Warning  2  Register r27 already defined by the .DEF directive

Das ist der X-Pointer, der schon durch die originalen Defines vorgegeben 
ist. Wenn Du den mit eigenen globale Variablen definierst, gibt es daher 
eine Warnung und Du kannst in Deinem Programm nicht mehr XL und XH 
benutzen. Selbiges gilt für Y- und Z-Pointer.

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.