Forum: Mikrocontroller und Digitale Elektronik Probleme bei der Usart initialisierung mit dem ATmega8515


von Danny S. (bulgasari)


Lesenswert?

Hallo zusammen,
Ich habe folgendes Problem:
1) Ich versuche bei einem Atmel Atmega8515 die USART-Schnittstelle zu 
nutzen. Das Programm soll auf einen seriell empfangenen Befehl hin 
einige Ports ansteuern...

Ich nutze einen Atmel AtMEGA8515 auf dem STK500Evaluationsboard...
ich nutze AVR-Studio4, Atmel AVR-Assembler, AVRSimulator als 
Debug-Plattform und habe den 8515 auch als Device angegeben.

Hier der relevante Teil des Codes:

.nolist
.include "8515def.inc"
.list

def:
//R16 und 17 sind für die UART-Schnittstelle reserviert ohne hier ein 
Label zu erhalten (IST DAS RICHTIG?!)
   .def CntL = R18
   .def CntH = R19
  .def CntFlag = R20
  .def temp = R21
  .def temp2 = R22
  .def compValueL = R23
   .def compValueH = R24
   .def prevLowFlag = R25

init:

//USART_Initialisierung für den AtMEGA:
  // Set baud rate
    out UBRRH, r17
    out UBRRL, r16
  // Enable receiver and transmitter
    ldi r16, (1<<RXEN)|(1<<TXEN)
    out UCSRB,r16
  // Set frame format: 8data, 2stop bit
    ldi r16, (1<<URSEL)|(1<<USBS)|(3<<UCSZ0)
    out UCSRC,r16

//Initialisierung der Register

    ldi temp, 0x00
    out DDRA, temp
    ldi temp, 0x00
    out DDRB, temp
    ldi temp, 0x00
    out PortC, temp
     ldi temp, 0xFF
    out DDRC, temp

    ldi CntL, 0x00
    ldi CntH, 0x00
    ldi CntFlag, 0x00

loop:

//Empfangen von Daten über die RS232-Schnittstelle des AtMEGA:
USART_Receive:
   sbis UCSRA, RXC
   rjmp USART_Receive
   in r16, UDR
   rjmp USART_Transmit


//Senden über die RS232-Schnittstelle des AtMEGA:
USART_Transmit:
  sbis UCSRA,UDRE
   rjmp USART_Transmit
  out UDR,r16
  rjmp loop

//16-Bit-Zähler mit Flankenerkennung...
...
//Motorsteuerung
//Abfragen der Schalter
...
..
.


ERZEUGT MIR FOLGENDEN FEHLERCODE:
X:\Bla\BlaBla\AtMEGA8515\Programmname\Programmname.asm(65): error: 
Undefined symbol: UBRRH
X:\Bla\BlaBla\AtMEGA8515\Programmname\Programmname.asm(66): error: 
Undefined symbol: UBRRL
X:\Bla\BlaBla\AtMEGA8515\Programmname\Programmname.asm(70): error: 
Undefined symbol: UCSRB
X:\Bla\BlaBla\AtMEGA8515\Programmname\Programmname.asm(73): error: 
Undefined symbol: URSEL
X:\Bla\BlaBla\AtMEGA8515\Programmname\Programmname.asm(74): error: 
Undefined symbol: UCSRC
X:\Bla\BlaBla\AtMEGA8515\Programmname\Programmname.asm(107): error: 
Undefined symbol: UCSRA
X:\Bla\BlaBla\AtMEGA8515\Programmname\Programmname.asm(115): error: 
Undefined symbol: UCSRA
X:\Bla\BlaBla\AtMEGA8515\Programmname\Programmname.asm(332): No EEPROM 
data, deleting X:\Bla\BlaBla\AtMEGA8515\Programmname\Programmname.eep


Ich habe mich an die Beispiele aus dem Datenblatt des Controllers 
gehalten, die Register sollten doch eigentlich bekannt sein oder?!
Wo bitte liegt mein Fehler?

2) Ich hatte das Programm vorher auf einem AtMEGA16A, der Debugger hat 
sich verhalten wie erwartet, die Simulation lief fehlerfrei! Auch mit 
einem selbst programmiertem Simulationsprog. lief alles fehlerfrei!
Als ich dann alles auf dem Atmega16A geflasht hatte gingen Simulation 
und Realität leider auseinander: Port B lief nicht wie konfiguriert als 
Eingang, PortC Pin2-5 ist komplett tot und ließ sich weder als Ein- noch 
als Ausgang nutzen.
Das gleiche Programm auf dem 8515 lief wie erwartet, alle Ein- und 
Ausgänge ließen sich nutzen! (weitere Testproggis hier)
-Woher bitte der Unterschied zwischen Debugger und Realität?! Und warum 
laufen die Ports am Atmega16A nicht wie erwartet!?
Ich habe inzwischen 2 Stk500er und mehrere Atmega16As hier, da ich 
dachte ich hätte den Controller geschossen -daran kann es also nicht 
liegen. Da das STK500 mit dem 8515 noch läuft und auch das 2. Stk500 das 
gleiche Fehlverhalten zeigen sollte die Hardware also i.O sein!

BITTE HILFE, ich weiß nicht mehr weiter

Gruß und vielen Dank schon mal
Danny

von Spess53 (Gast)


Lesenswert?

Hi

>Ich versuche bei einem Atmel Atmega8515 die USART-Schnittstelle

>.include "8515def.inc"

Die ist für den AT90S8515. Für den ATMega8515 braucht man die 
'm8515def.inc'.

MfG Spess

von Danny S. (bulgasari)


Lesenswert?

DANKE!!!
...das war mal SCHNELL!

Problem 1) ist gelöst!
Damit kann ich erstmal weiterarbeiten! -Du hast mir den Tag/Woche/die 
Thesis gerettet!

bleibt Problem 2) -Woher der Unterschied zwischen Debugger und Realität 
wenn ich den AtMEGA16A nutzen will?!

die
.include "m16Adef.inc"
ist richtig?!

von Spess53 (Gast)


Lesenswert?

Hi

>bleibt Problem 2) -Woher der Unterschied zwischen Debugger und Realität
>wenn ich den AtMEGA16A nutzen will?!

Benutzt du auch die richtigen Sockel auf dem STK500? Die sind für 
ATMega8515 und ATMega16 verschieden.

>PortC Pin2-5 ist komplett tot

JTAG-Fuse löschen.

MfG Spess

von Danny S. (bulgasari)


Lesenswert?

Jip... den richtigen Sockel habe ich lt. Handbuch schon erwischt (denke 
ich!)
Ich werde morgen mal das mit der Fuse untersuchen!

Danke dir nochmal für die echt fixe und freundliche Hilfe!

Gruß
Danny

von Stefan W. (dl6dx)


Lesenswert?

Danny S. schrieb:
> init:
>
> //USART_Initialisierung für den AtMEGA:
>   // Set baud rate
>     out UBRRH, r17
>     out UBRRL, r16

Ich sehe keine Stelle, an der du r16 und 17 initialisierst.

Grüße

Stefan

von Danny S. (bulgasari)


Angehängte Dateien:

Lesenswert?

Danke auch dir für deine Hilfe!

...die Register scheinen mit der Aktivierung der Usart-Schnittstelle 
automatisch reserviert/deklariert zu werden. Die Schnittstelle 
funktioniert soweit...

Das mit der Fuse werde ich noch testen müssen.

Was bleibt ist das Problem mit dem PortB
...will einfach nicht als Eingang funktionieren oder ich habe ein 
Problem mit meinem Zähler: siehe Anhang!
Ich muss eine gewisse Anzahl an Rechteckimpulsen abzählen und dann den 
Motot stoppen...
Ich kann einfach nicht herausfinden warum der Zähler nicht macht was ich 
will
:-(

von Sascha W. (sascha-w)


Lesenswert?

wg. PORTB

damit ...
1
  in temp, PINB
2
  ldi temp2, 0x01
3
  cpse temp,temp2

mit dem Compare betrachtest du immer das komplette PortB! Um auf einen 
einzelnen PIN zu prüfen nimm sbis/sbic oder ein AND zwischen Port und 
Maske.

Sascha

von Spess53 (Gast)


Lesenswert?

Hi

>...die Register scheinen mit der Aktivierung der Usart-Schnittstelle
>automatisch reserviert/deklariert zu werden.

r16 und r17 werden überhaupt nicht reserviert oder deklariert. Das sind 
ganz normale Register und haben nichts mit der UART zu tun.

> Die Schnittstelle funktioniert soweit...

Wenn das das ganze Programm ist, wohl eher Zufall. Welche Baudrate und 
welchen Controllertakt benutzt du.

>Was bleibt ist das Problem mit dem PortB
>...will einfach nicht als Eingang funktionieren

Du meinst diesen Abschnitt:

>  // Lies Signalstatus am PinB0
>  in temp, PINB
>  ldi temp2, 0x01
>  cpse temp,temp2
?
Das ist eher ein Problem der Abfrage. Du hast den ganzen PortB als 
Eingang initialisiert. Wenn PB1..PB7 nicht definiert auf L liegen kann 
bei 'in temp, PINB' alles mögliche heraus kommem. Füge mal nach dem in 
ein

  andi temp, 1<<PB0

ein.

MfG Spess

von Bulgasari (Gast)


Lesenswert?

Leute... IHR SEID KLASSE!

werde ich sobald ich kann angehen!
Ich danke euch für eure fixe Hilfe!!!

Gruß
Danny

von Danny S. (bulgasari)


Lesenswert?

ok... das mit der USART scheint nur zufall gewesen zu seinich habe den 
Prozessor gewechselt und die Usart ist tot... :-(

Das Board taktet mit 3,686MHz, ich habe die Kalibrierung auf 2MHz 
gestellt (und kalibrierungsbit gesetzt denke ich...)

Ich muss den entsprechenden errechneten Wert in das UBRRL (über R16) 
eintragen, das UBRRH (über R17) mit "Null" füllen? Sehe ich das 
richtig?!

weiter...
Ich möchte nicht nur ein einfaches "echo" sondern die empfangengen 
Befehle auch umsetzen...
Da ergibt sich gerade folgendes Problem:
Der erhaltene Befehl sollte noch im Register 16 stecken, richtig?!
ich versuche also das Register auszulesen, erhalte aber die 
Fehlermeldung:
X:\blb\blabla\Simulator_002.asm(174): error: Invalid number

auf der Zeile
  sbis r16, 0x03  ;If (R16, bit1 == 3)
  rjmp rauf  ;then: springe zur Marke "rauf"

also das ganze erstmal in ein temp Register verschieben wollen...:
  ldi temp, 0x01
  ldi temp2, r16
  sbis temp, temp2  ;If (r16, bit0 == 1)
  rjmp runter    ;then: springe zur Marke "runter"

...gleiche Fehlermeldung!
Wo liegt hier bitte der Fehler?!

danke euch...

Gruß
Danny

von Spess53 (Gast)


Lesenswert?

Hi

>Das Board taktet mit 3,686MHz, ich habe die Kalibrierung auf 2MHz
>gestellt (und kalibrierungsbit gesetzt denke ich...)

Welche Kalibrierung und welches Kalibrierungsbit?

>Ich muss den entsprechenden errechneten Wert in das UBRRL (über R16)
>eintragen, das UBRRH (über R17) mit "Null" füllen? Sehe ich das
>richtig?!

Du kannst beliebige Register, vorzugsweise r16...r31, benutzen. Z.B.
1
   .equ UBRRval = $1234
2
...
3
   ldi r23,High(UBRRval)
4
   out UBRRH, r23
5
   ldi r23,Low(UBRRval)
6
   out UBRRL, r23


>  sbis r16, 0x03  ;If (R16, bit1 == 3)

Ein Bit kann nicht 3 sein. Der nächste Befehl wird übersprungen, wenn 
Bit3 von r16 1 ist.

>  ldi temp2, r16

Der Befehl ein Register mit dem Inhalt eines anderen zu laden lautet
mov rd,rs

>  sbis temp, temp2  ;If (r16, bit0 == 1)

Der Befehl funktioniert nicht mit zwei Register.

Tue dir bitte einen Gefallen und sieh dir die Befehle hier genau an:

http://www.atmel.com/dyn/resources/prod_documents/doc0856.pdf

MfG Spess

von Bulgasari (Gast)


Lesenswert?

mache ich!

erneut: Danke für die schnelle Hilfe!


Gruß
Danny

von Spess53 (Gast)


Lesenswert?

Hi

>erneut: Danke für die schnelle Hilfe!

Und was meinst du nun mit:

>Das Board taktet mit 3,686MHz, ich habe die Kalibrierung auf 2MHz
>gestellt (und kalibrierungsbit gesetzt denke ich...) ?

MfG Spess

von Sascha W. (sascha-w)


Lesenswert?

Spess53 schrieb:
>>  sbis r16, 0x03  ;If (R16, bit1 == 3)
>
> Ein Bit kann nicht 3 sein. Der nächste Befehl wird übersprungen, wenn
> Bit3 von r16 1 ist.

und der Befehl muss dann auch sbrs/sbrc heissen, wenn man auf einem Bit 
im Register prüfen will !

Sascha

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.