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
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); } }
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
oh ja, die Taktfrequenz hab ich auch noch vergessen: ATmega128 @ 16MHz Guido
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
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
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
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
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
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
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.