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
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
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?!
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
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
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
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 :-(
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
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
Leute... IHR SEID KLASSE! werde ich sobald ich kann angehen! Ich danke euch für eure fixe Hilfe!!! Gruß Danny
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
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
mache ich! erneut: Danke für die schnelle Hilfe! Gruß Danny
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.