Forum: Compiler & IDEs AVR GCC, ATmega128, Compiler Problem?


von Guido (Gast)


Lesenswert?

Hallöchen!

Nach zwei Tagen tüfteln und wahrscheinlich unnötigen flashen meines AVR 
geb ich heute auf und Frage jetzt hier im Forum.

ich habe folgendes Testprogrämmchen geschrieben, kompiliert und 
erfolgreich getestet:

------------------------------------------------------------------------ 
-----------------------
#include <io.h>

int main(void){

    int i;

    outp(0xff, DDRB);  //Port B = Output
    outp(0x00, DDRA);  //Port A = Input
    for(;;){            //loop
        i=inp(PINA);
        outp(i, PORTB);
    }
}

Läut ohne Probleme. Nun möchte ich eine Funktion hinzufügen:

------------------------------------------------------------------------ 
-----------------------
Datei: delay.h

#define LoopCount 40

void delay(unsigned char us);

und die delay.c

#include "delay.h"

void delay(unsigned char us){
     int i, j, k, l;
     for (i=0; i < us; i++){
         for(j=0; j<255; j++){
             for(k=0; k<255; k++){
                 l++;
             }
         }
     }
}

Compiler sagt dazu folgendes:

------------------------------------------------------------------------ 
-----------------------
C:\avrgcc128\ctest>make
avr-gcc -c -g  -Os -Wall -Wstrict-prototypes -Wa,-ahlms=test3.lst 
-mmcu=atmega12
8 -I. test3.c -o test3.o
avr-gcc -c -g  -Os -Wall -Wstrict-prototypes -Wa,-ahlms=delay.lst 
-mmcu=atmega12
8 -I. delay.c -o delay.o
avr-gcc  test3.o delay.o   -Wl,-Map=test3.map,--cref -mmcu=atmega128 -o 
test3.el
f
avr-objcopy -O avrobj -R .eeprom test3.elf test3.obj
avr-objcopy -O ihex      -R .eeprom test3.elf test3.hex
elfcoff test3.elf coff test3.cof test3.sym
Ended
cp coff/test3.cof .
cp coff/* .
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" 
--change-section
-lma .eeprom=0 -O ihex   test3.elf test3.eep
avr-size test3.elf
   text    data     bss     dec     hex filename
    280       0       0     280     118 test3.elf
Errors: none
rm delay.o

Das verwendete makefile:

------------------------------------------------------------------------ 
-----------------------#  Simple Makefile Volker Oth (c) 1999
# edited by AVRfreaks.net nov.2001

########### change these lines according to your project 
##################

#put the name of the target mcu here (at90s8515, at90s8535, attiny22, 
atmega603 etc.)
    MCU = atmega128

#put the name of the target file here (without extension)
        TRG        = test3

#put your C sourcefiles here
        SRC        = $(TRG).c delay.c

#put additional assembler source file here
        ASRC    =

#additional libraries and object files to link
        LIB        =

#additional includes to compile
        INC        =

#assembler flags
        ASFLAGS = -Wa, -gstabs

#compiler flags
        CPFLAGS        = -g  -Os -Wall -Wstrict-prototypes 
-Wa,-ahlms=$(<:.c=.lst)

#linker flags
        LDFLAGS = -Wl,-Map=$(TRG).map,--cref


########### you should not need to change the following line 
#############
include avr_make

###### dependencies, add any dependencies you need here 
###################
$(TRG).o : $(TRG).c

Sieht doch eigentlich alles ok aus, oder???? Debugge ich das Programm im 
AVR Studio 4, funktioniert anscheinend alles völlig einwandfrei.
Lade ich das Programm in dem Prozessor, bleibt der Prozessor stehen bzw. 
steht wohl in einer Endlosschleife.

Ich habe langsam keine Idee mehr und vermute, daß ich hier gleich was 
bezüglich Header-Datei oder Variablendeklarationen zu hören bekomme und 
mich lächerlich mache, weil ich eine ganz einfache Sache übersehen habe. 
Fakt ist nur, das ich halt gerade anfange C zu lernen und zum ersten mal 
mit dem ATMEL's arbeite und vorher alles in Maschinensprache geschrieben 
habe. Hier komme ich einfach nicht weiter.

Noch was zu der IDE Umgebung:

Windows 2000 Proff.
AVR GCC für den ATmega 128 http://www.smartsolutionnet.de/avrgcc/
PonyProg2000 2.05a Beta
AVR Studio 4.02 Build 135

Für jede Hilfe Dankbar!!!

Guido

von Guido (Gast)


Lesenswert?

Nachtrag (irgendwas vergisst man ja immer)

Das Programm sieht mit der Funktion zusammen natürlich so aus:

#include <io.h>
#include "delay.h"

int main(void){

int i;

outp(0xff, DDRB); //Port B = Output
outp(0x00, DDRA); //Port A = Input
for(;;){ //loop
i=inp(PINA);
delay(255);
outp(i, PORTB);
}
}

von Sämi Lehner (Gast)


Lesenswert?

Dein Programm sollte so schon funktionieren, nur ist das delay nichts 
für ungeduldige :)  Dein delay braucht schätzungsweise > 2 minuten je 
nach Tacktfrequenz.

sam

von Guido (Gast)


Lesenswert?

oh ja, die Taktfrequenz hab ich auch noch vergessen:

ATmega128 @ 16MHz

Guido

von Guido (Gast)


Lesenswert?

und (schade das man im Forum nicht editieren kann) ich habe die Funktion 
delay auf eine Schleife reduziert, nichts passiert. Der Ausgang bleibt 
bei geschalteten Eingan auf low.

Wenn der Source OK ist, kann es ggf. der Compilerpatch sein. Die delay 
funktion sollte doch auch im Hauptproramm stehen können, muß ja keine 
includete Datei sein, oder?

Guido

von Guido (Gast)


Lesenswert?

ok, getestet. Delay als funktion gecancelt und funktionsinhalt an die 
stelle des Funktionsaufruf verschoben. GEHT!

Wenn mir jetz bitte noch jemand bestätigen kann das der Source korrekt 
ist oder ich irgendwas falsch gemacht habe, dann würd ich Marc darüber 
informieren bzw. den Prozessor bei optiCompo testen lassen - kann ja 
nicht sein, das ich spaghetticode schreiben muß..


Guido, n8

von Sämi Lehner (Gast)


Lesenswert?

Die delay Funktion scheint soweit in Ordnung zu sein. Ich denke dein 
Problem besteht darin, dass du keine Funktion aufrufen kannst da dein SP 
nicht richtig inizialisiert wurde. Du kannst mal versuchen mit dem 
original gcc-patch deinen Code zu übersetzen. Der atmega103 sollte zum 
atmega128 soweit kompatiebel sein. Sonst kannst du versuchen den SP von 
hand zu inizialisieren out (0xff, 0x3d); out (0x0f, 0x3e);

sam

von Guido (Gast)


Lesenswert?

Der StackPointer wird initialisiert mit 0x10FF:

6:   2411        CLR     R1               Exclusive OR
+00000047:   BE1F        OUT     0x3F,R1          Out to I/O location
+00000048:   E020        LDI     R18,0x00         Load immediate
+00000049:   95A8        WDR                      Watchdog reset
+0000004A:   BD21        OUT     0x21,R18         Out to I/O location
+0000004B:   E020        LDI     R18,0x00         Load immediate
+0000004C:   BF25        OUT     0x35,R18         Out to I/O location
+0000004D:   EF2F        SER     R18              Load immediate
+0000004E:   BF2D        OUT     0x3D,R18         Out to I/O location
+0000004F:   E120        LDI     R18,0x10         Load immediate
+00000050:   BF2E        OUT     0x3E,R18         Out to I/O location

Ich suche gerade im PDF nach der richtigen Grenze

Guido

von Guido (Gast)


Lesenswert?

ES Funktioniert!!! Die Idee mit dem SP war schon ganz gut :-)

Der ATmega128 wir im ATmega103 compatibilitätsmodus ausgeliefert und 
wenn dann der Stackpointer ordnungsgemäß bei 0x10FF initialisiert wird, 
zeigt diese Adresse ins Nirvana wenn man kein externes RAM drann hat 
gg

In PonyProg den ATmega103 Modus abschalten und schon klappt alles.

Gruß, Guido

von Bart (Gast)


Lesenswert?

Hallo,

ich hatte genau das selbe Problem und hing daran 2 Tage. Ich bin so
dankar, dass ich auf diese Lösung gestossen bin.

VIELEN VIELEN DANK....

Bart

von Jörg Wunsch (Gast)


Lesenswert?

FAQ lesen bildet. ;-)

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.