Forum: Compiler & IDEs ATmega8 durch ATmega168 ersetzen


von Carsten (Gast)


Lesenswert?

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

von Johannes M. (johnny-m)


Lesenswert?

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.

von Carsten (Gast)


Lesenswert?

Super vielen Dank! Genau das löst das Problem!

von EDAconsult Udo Kuhn (Gast)


Lesenswert?

sehr witzig,
jetzt verstehe ich es auch.

von EDAconsult Udo Kuhn (Gast)


Lesenswert?

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.

von Gerhard G. (gerdschi63)


Lesenswert?

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.

von EDAconsult Udo Kuhn (Gast)


Lesenswert?

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

von EDAconsult Udo Kuhn (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.