Hallo, ich habe in meinem Programm auf einem Mega8 leider ein wenig mehr Programmspeicher benötigt. Dafür möchte ich den Mega8 durch einen Mega168 ersetzen, die beiden Teile scheinen sich ja doch sehr ähnlich zu sein. Nun habe ich im AVR-Studio einfach mal den ATmega168 eingestellt. Leider bekomme ich jetzt für sämtliche UART-Registernamen Fehlermeldungen. Die iom168.h wird eingebunden und verweist dann so wie es aussieht auf die iomx8.h, in der die Registernamen definiert sind. Ist meine Annahme richtig, dass damit die Registernamen beim Mega8 und 168 eigentlich gleich sein sollten? Wo könnte das Problem liegen? Gruß Carsten
Schau mal da rein (v.a. in die erste). Da steht, was man alles ändern muss, damit es läuft. http://www.atmel.com/dyn/resources/prod_documents/doc2553.pdf http://www.atmel.com/dyn/resources/prod_documents/doc2554.pdf Die ATMega48/88/168 haben die neueren Register-Bezeichnungen, die darauf ausgelegt sind, dass es auch AVRs mit mehr als einem UART gibt. Der ATMega8 kam zu einer Zeit, als es das noch nicht gab. Deshalb heißen die Register da auch entsprechend anders.
nachdem ich die oben angegebenen Datenblätter und die iom168.h, iomx8.h angeschaut habe, sehe ich aber, alles ist im AVRgcc oder WinAVR 20071221 genau angegeben ist wie es sein soll. Die SBI, CBI Mnemonics werden im Datenblatt ATmega168 mehrfach angegeben als, für Register oberhalb von 1FH nicht einsetzbar. Auch einige Versuch am SPI zeigten, dass diese Maschine wirklich nicht einfach denn ATmega8 ersetzen kann. Damit hatte ich so auch nicht gerechnet.
Auch ich wollte zwecks Speicher tauschen. Habe Timer,Uart und Spi Schnittstelle erfolgreich geändert. Nur habe ich jetzt folgende Probleme. 1. Mein Programm läuft nur nach dem programmieren an , nach einem reset tut sich nichts mehr. Kann das an den Fusebits liegen? Aus dem AVR-Studio gibt es leider bei AVR-PROG keinen AtMega168 zur auswahl. 2. Einen Port als Ausgang funktioniert. Aber die Portabfrage , zB. ob Taster gedrückt ist funktioniert nicht. while ( PIND & (1<<PD2) ) ; // warten bis Taste gedrückt Beim AtMega8 funktioniert das immer.
1. AvrOspII verwenden, der geht. 2. in C:\WinAVR-20071221\avr\include\avr\iomx8.h stehen alle gültigen I/O Register und wo sie sind (z.B. PIND _SFR_IO8 (0x09)) also muss gehen. Auch einige Versuch am SPI zeigten dass die Register alle richtig neu gesetzt werden müssen. Wenn z.B. nur ein oder zwei bits in einem Register gesetzt werden geht dass nicht, es müssen alle acht Bit's gesetzt werden. udo
Im AVR Studio muss natürlich ATmega168 eingestellt werden. Im GCC sind die entsprechenden Register so zu benennen wie sie im iomx8.h stehen. Der GCC sorgt dann selbst für die richtige Abarbeitung. Anders in Maschinensprache, hier muss genau gearbeitet werden wie es die Maschine verlangt. ; Hier ein Beispiel für Übergabe in das SPI Daten Register in Maschinensprache aus der GLCD V01 für das S65 mit LS020. ; Die Routine braucht dann schon knapp doppelt so lange für die Ausgabe! ;*** ATmega168 SPI_SEND: ; #Clocks push r31 ; 2 in r31, LCD_SPCR ; 1 sbr r31, SPE ; 1 out LCD_SPCR, r31 ; 1 out LCD_SPDR, T1 ; 1 load byte in SPI data register SPI_SEND_0: in r31, LCD_SPSR ; 1 sbrs r31, SPIF ; 1/2/3 rjmp SPI_SEND_0 ; 2 transmitt byte to LCD ; in r24,LCD_SPDR ; short time workaround to be fixed sbi LCD_PORT, LCD_CS ; 2 deselect Display pop r31 ; 2 ret ;(2) ; 14 Clocks ;*** ATmega8(L) SPI_SEND: ; #Clocks sbi LCD_SPCR,SPE ; 2 enable SPI out LCD_SPDR,T1 ; 1 load byte in SPI data register SPI_SEND_0: sbis LCD_SPSR,SPIF ; 1/2/3 rjmp SPI_SEND_0 ; 2 transmitt byte to LCD ; push r0 ; short time workaround to be fixed ; in r0,LCD_SPDR ; ; pop r0 ; sbi LCD_PORT,LCD_CS ; 2 deselect Display ret ;(2) ; 8 Clocks ; Hier ein Beispiel für Übergabe in das SPI Setup register in Maschinensprache. ; es müssen für ATmega168 alle acht Bits gestzt werden. ; setup serial data interface ; select clock phase positive going in middle of data ; master mode ; enable SPI ; speed is CPUclock/2 ;*** ATmega168 ldi r24,(0 << SPIE) | (1 << SPE) | (0 << DORD) | (1 << MSTR) | (0 << CPOL) | (0 << CPHA) | (0 << SPR1) | (0 << SPR0); out LCD_SPCR,r24 ldi r24,(1<<SPI2X) ; double speed bit out LCD_SPSR,r24 ;*** ATmega8(L) Hier werden nur die Bits gesetzt die gebraucht werden. ldi r24,(1<<MSTR) | (1<<SPE); | (1<<SPR0); ; Master Mode, Enable SPI, fCPU/16 clock out LCD_SPCR,r24 ldi r24,(1<<SPI2X) ; double speed bit out LCD_SPSR,r24
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.