www.mikrocontroller.net

Forum: Compiler & IDEs ATmega8 durch ATmega168 ersetzen


Autor: Carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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/...
http://www.atmel.com/dyn/resources/prod_documents/...

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.

Autor: Carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super vielen Dank! Genau das löst das Problem!

Autor: EDAconsult Udo Kuhn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sehr witzig,
jetzt verstehe ich es auch.

Autor: EDAconsult Udo Kuhn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gerhard Glatzl (gerdschi63)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: EDAconsult Udo Kuhn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: EDAconsult Udo Kuhn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.