C Kompilierung für Atmega168 mit AVRStudio

IZN

Neues Mitglied
07. Mai 2012
4
0
0
Sprachen
Hallo,

Ich habe ein Programm die ich auf einem Atmega168 übertragen möchte. Leider kriege ich einen Kompilationsfehler:

Code:
'DDRA' undeclared (first use in this function)

Wo kann ich die Deklaration für DDRA, DDRB, PORTA, usw finden? Irgendwo muss es ein File geben.

Die Device ist in Project->Properties->Device spezifiziert, aber trotzdem sagt "ASF Wizard" "No defined board". Das ist doch ein Widerspruch?

Ich weiss nicht warum, aber unter Device steht es "Speed = 0". Das kann nicht korrekt sein? (Natürlich habe ich in global.h die Frequenz eingetragen.)

Ich benutze die letzte ../avrlib (alle relevante Dateien sind im Projekt inkludiert).
 
Hallo IZN,

der ATmega168 besitzt keinen PORTA, es gibt also somit auch keine "Register" DDRA, PORTA, PINA.
Der Compiler meldet also richtigerweise den Fehler: 'DDRA' undeclared (first use in this function)

Wegen dem "Speed": Es muss ggf. F_CPU bekannt sein. Kann man zum Beispiel in den Projektdefinitionen (im Prinzip im make-File) definieren.

Gruß,
Dirk
 
Hinter DDRA (und den ganzen anderen Registernamen) verbirgt sich nur die Adresse des Registers. Statt DDRB kann man (in Assembler) auch 0x04 schreiben (beim 168er). Wie Dirk bereits sagte, gibt es den ganzen Port-A beim Mega168 gar nicht. (Was Dir aber bereits beim anpassen der Hardware hätte auffallen sollen...).
Jedenfalls gibt es für jeden Controller eine zu includierende Datei, in der die ganzen Registernamen (und Bitnamen) definiert/initialisiert werden (sind ja in Deinem Programm dann Konstanten.)
Diese Datei ist beim Mega168 meiner Meinung nach "m168def.inc". Wenn man sich die ansieht, findet man im wesentlichen die ganzen Bit- und Registernamen mit ".ecu" als Konstante definiert. Die Namen und Werte sollten der Tabelle im Datenblatt des Controllers entsprechen.
 
Ok, verstanden.

Ich bin eigentlich nicht der Hardwarekonstrukteur (habe nie früher mit AVRs gearbeitet), aber ich habe einen Fehler in der Firmware gefunden, den ich korrigieren will. Deswegen sind auch meine Fragen ganz basic.

Port A gibt es beim Atmega168 nicht - was muss ich dann mit den DDRA-einträgen im Library (wo ich Fehler kriege) machen? Muss ich sie wirklich löschen?
 
Port A gibt es beim Atmega168 nicht - was muss ich dann mit den DDRA-einträgen im Library (wo ich Fehler kriege) machen? Muss ich sie wirklich löschen?

Das kann dir sicher keiner beantworten. Das aktuelle Programm wurde ja anscheinend nicht für den ATmega168 geschrieben und müsste nun für diesen Mikrocontroller (falls überhaupt möglich) angepasst werden. Hmmm, ohne Schaltplan und Software muss ich passen. Entfernen kannst du DDRA nur dann, wenn am PORTA nichts angeschlossen war. Ich vermute aber mal, hier passt Hardware und Software in mehreren Bereichen nicht zusammen. Auch wenn der Compiler keinen Fehler mehr meldet, heißt dies nicht, dass die Software mit deiner Hardware fehlerfrei läuft.
 
Also, das Programm (die Firmware) ist nur für den Atmega168 geschrieben (da gibt es keine Fehler/DDRA's o.ä.). Aber avrlib soll ja für alle Atmega's funktionieren, und der Fehler ensteht nur da. Ich habe verstanden, dass ich Änderungen zum Library ( = avrlib) machen muss, z.B. global.h ( F_CPU ), aber nicht dass weitere Änderungen erforderlich sind. Ich meine, die DDRA usw. -problematik hätte die Avrlibersteller mit Kompilatordirektiven lösen können (z.B. mit #ifdef #ifndef)?

Hier krieg ich den Fehler:
http://gitorious.org/avrlib/avrlib/blobs/master/rsl/avrcore.c

Reihe 33: "outb(DDRA, 0x00);"
 
Ok, jetzt verstehe ich.

"avrlib" kenne ich nicht. Du könntest versuchen, in avrcore.c die Einträge zu entfernen. Der ATmega168 hat PORTB, PORTC und PORTD. Du wirst also auch für PORTE und PORTF Fehlermeldungen erhalten. Testweise kannst du mal versuchen, die Einträge zu entfernen, ich weiß allerdings nicht, ob sonst irgendwo in der lib auf Register zugegriffen wird, die es nicht gibt. Versuche es einfach mal.

Code:
void avrcoreInit(void)

{

    // initialize ports to input with pullup

    // (this is done to avoid contentions and input-pin oscillation)

    outb(DDRB, 0x00);

    outb(DDRC, 0x00);

    outb(DDRD, 0x00);

    outb(PORTB, 0xFF);

    outb(PORTC, 0xFF);

    outb(PORTD, 0xFF);


    // turn on RAM interface

    sbi(MCUCR, SRE);

    // initialize RAM page

    avrcoreSetRamPage(0);

    // initialize LEDs

    avrcoreSetLeds(0);

    // set serial power to on by default

    avrcoreSetSerialPortPower(1);

}
 
Hallo,

Ich habe verstanden, dass ich Änderungen zum Library ( = avrlib) machen muss, z.B. global.h ( F_CPU ),
Du musst den Wert für F_CPU nicht zwangsläufig in deiner "global.h" Datei abspeichern. Alternativ kannst du den Wert auch direkt mittels
Code:
-D F_CPU=16000000UL
an deinen Compiler (denke mal avr-gcc) übergeben.
Stand letztens vor dem selben Problem... :)

Gruß
Fabi
 
Ok danke.

Ich versuchte mein Projekt einmal ohne AVRStudio kompilieren (durch Command Line), und da hatte ich endlich Erfolg. Nun habe ich viele Dateien, z.B. : main.o rprintf.o master.eep .elf .hex .lss usw. Jetzt muss ich, soweit wie ich verstehe, die .eep und .hex übertragen. Welche Programme werden dafür benutzt? (Die Kommunikation ist seriell). Gibt es einige die ich durch CMD benutzen kann? Was empfehlt ihr?
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)