Hallo alle,
ich hab gerade echt an meinen Programmierkünsten gezweifelt.
Ich wollte bei einem ATmega48-20PU den USART0 einstellen und der
Assembler hat sich geweigert den Code zu übersetzen. Er hat immer gemeldet
das die Register-Adressen aus dem m48def.inc "Out Of Range" sind. So eine
Grütze. Vor allem weil ich meinen Sourcecode noch mit dem Datenblatt
abgeglichen habe. Da steht nämlich folgendes drin ...
CodeBox ASM
Ich sach nur: DAS BEISPIEL AUS DEM DATENBLATT KÖNNT IHR KNICKEN !
Weiter hinten bei der Register-Summary steht nämlich folgendes ...
und im Anhang zu der Tabelle ...
und damit die Register wie eine Speicherstelle ansprechen. Damit haben
sich so schöne Befehle wie sbis/sbic zum Testen von einzelnen Bits in den
Registern auch erledigt. SO EINE SCH....
Ich habe also das zweifelhafte Vergnügen, meine gesamten Routinen für
die USART auf Memory-Mapped umzuschreiben... Vielen Dank auch
Ach ja, das betrifft mindestens die ATmegas 48, 88, 168 und 328.
Auf jeden Fall alle extended Register.
Keinen Bock mehr. Mal sehn wann ich Lust hab da weiter zu tippen
Erst mal wieder abkühlen und dann wolln wir mal sehn.
Mein Problem das ich jetzt habe: Eventuell fressen programmiertechnische
Klimmzüge die zusätzlichen 4MHz Taktfrequenz (20MHz Quarz) wieder auf.
Da werde ich wohl einiges an Gehirnschmalz investieren müssen. Pech ist es
auch, das es beim Speicherzugriff mit "Data Direct With Displacement" nur
6Bit lange Distanzen gibt, die man zum Y- oder Z-Register addieren
lassen kann. Das wird ein Spaß!
Gruß
Dino
ich hab gerade echt an meinen Programmierkünsten gezweifelt.
Ich wollte bei einem ATmega48-20PU den USART0 einstellen und der
Assembler hat sich geweigert den Code zu übersetzen. Er hat immer gemeldet
das die Register-Adressen aus dem m48def.inc "Out Of Range" sind. So eine
Grütze. Vor allem weil ich meinen Sourcecode noch mit dem Datenblatt
abgeglichen habe. Da steht nämlich folgendes drin ...
CodeBox ASM
USART_Init:
; Set baud rate
out UBRRnH, r17
out UBRRnL, r16
; Enable receiver and transmitter
ldi r16, (1<<RXENn)|(1<<TXENn)
out UCSRnB,r16
; Set frame format: 8data, 2stop bit
ldi r16, (1<<USBSn)|(3<<UCSZn0)
out UCSRnC,r16
ret
Ich sach nur: DAS BEISPIEL AUS DEM DATENBLATT KÖNNT IHR KNICKEN !
Weiter hinten bei der Register-Summary steht nämlich folgendes ...
Code:
(0xC6) | UDR0 | USART I/O Data Register 191
(0xC5) | UBRR0H | USART Baud Rate Register High 195
(0xC4) | UBRR0L | USART Baud Rate Register Low 195
(0xC3) | Reserved | – – – – – – – –
(0xC2) | UCSR0C | UMSEL01 UMSEL00 UPM01 UPM00 USBS0 UCSZ01 /UDORD0 UCSZ00 / UCPHA0 UCPOL0 193/208
(0xC1) | UCSR0B | RXCIE0 TXCIE0 UDRIE0 RXEN0 TXEN0 UCSZ02 RXB80 TXB80 192
(0xC0) | UCSR0A | RXC0 TXC0 UDRE0 FE0 DOR0 UPE0 U2X0 MPCM0 191
Ihr könnt die Beispiele also beerdigen und alles mit STS/LDS umschreiben4. When using the I/O specific commands IN and OUT, the I/O addresses 0x00 - 0x3F must be used. When addressing I/O
Registers as data space using LD and ST instructions, 0x20 must be added to these addresses. The ATmega48/88/168 is a
complex microcontroller with more peripheral units than can be supported within the 64 location reserved in Opcode for the
IN and OUT instructions. For the Extended I/O space from 0x60 - 0xFF in SRAM, only the ST/STS/STD and LD/LDS/LDD
instructions can be used.
und damit die Register wie eine Speicherstelle ansprechen. Damit haben
sich so schöne Befehle wie sbis/sbic zum Testen von einzelnen Bits in den
Registern auch erledigt. SO EINE SCH....
Ich habe also das zweifelhafte Vergnügen, meine gesamten Routinen für
die USART auf Memory-Mapped umzuschreiben... Vielen Dank auch
Ach ja, das betrifft mindestens die ATmegas 48, 88, 168 und 328.
Auf jeden Fall alle extended Register.
Keinen Bock mehr. Mal sehn wann ich Lust hab da weiter zu tippen
Erst mal wieder abkühlen und dann wolln wir mal sehn.
Mein Problem das ich jetzt habe: Eventuell fressen programmiertechnische
Klimmzüge die zusätzlichen 4MHz Taktfrequenz (20MHz Quarz) wieder auf.
Da werde ich wohl einiges an Gehirnschmalz investieren müssen. Pech ist es
auch, das es beim Speicherzugriff mit "Data Direct With Displacement" nur
6Bit lange Distanzen gibt, die man zum Y- oder Z-Register addieren
lassen kann. Das wird ein Spaß!
Gruß
Dino