Hallo,
also mir würden diese Sternchen am Anfang und am ende erstmal auffallen,
probiers mal ohne in den jeweiligen Zeilen die er anmeckert.
er schreibt ja so schön:
syntax error before 'void'
dann schau mal vor das void
Hi,
ich habe eine Zeit lang keine große Lust gehabt mich in die C-Programmierung meines AVR einzuarbeiten. Jetzt hab ich sie wieder und hab gerade die ganzen Packages unter Suse Linux 10.0 installiert, die man so braucht, also gcc-core, avr-libc, uisp, binutils. Dann wollte ich das Testprogramm das man auf http://www.tldp.org/linuxfocus/Engli...ticle352.shtml findet kompilieren, die Fehlermeldung lautete:
Ich poste auch mal das Makefile und den Code, weiß nicht ob das hilft aber schaden kanns ja nicht:Code:linux:/home/mathias/Desktop # make avr-gcc -g -mmcu=atmega8 -Wall -Wstrict-prototypes -Os -mcall-prologues -Os -c avrm8ledtest.c avrm8ledtest.c:27: error: syntax error before 'void' avrm8ledtest.c:34: warning: type defaults to 'int' in declaration of 'outer1' avrm8ledtest.c:34: warning: data definition has no type or storage class avrm8ledtest.c:36: error: syntax error before 'while' avrm8ledtest.c:78: error: syntax error before numeric constant avrm8ledtest.c:78: warning: type defaults to 'int' in declaration of 'delay_ms' avrm8ledtest.c:78: warning: function declaration isn't a prototype avrm8ledtest.c:78: warning: data definition has no type or storage class avrm8ledtest.c:80: error: syntax error before 'volatile' avrm8ledtest.c:81: error: syntax error before numeric constant avrm8ledtest.c:81: warning: type defaults to 'int' in declaration of 'delay_ms' avrm8ledtest.c:81: warning: function declaration isn't a prototype avrm8ledtest.c:81: warning: data definition has no type or storage class make: *** [avrm8ledtest.o] Fehler 1
Make:
Code:# makefile, written by guido socher MCU=atmega8 CC=avr-gcc OBJCOPY=avr-objcopy # optimize for size: CFLAGS=-g -mmcu=$(MCU) -Wall -Wstrict-prototypes -Os -mcall-prologues #------------------- all: avrm8ledtest.hex #------------------- help: @echo "Usage: make all|load|load_pre|rdfuses|wrfuse1mhz|wrfuse4mhz|wrfusecrystal" @echo "Warning: you will not be able to undo wrfusecrystal unless you connect an" @echo " external crystal! uC is dead after wrfusecrystal if you do not" @echo " have an external crystal." #------------------- avrm8ledtest.hex : avrm8ledtest.out $(OBJCOPY) -R .eeprom -O ihex avrm8ledtest.out avrm8ledtest.hex avrm8ledtest.out : avrm8ledtest.o $(CC) $(CFLAGS) -o avrm8ledtest.out -Wl,-Map,avrm8ledtest.map avrm8ledtest.o avrm8ledtest.o : avrm8ledtest.c $(CC) $(CFLAGS) -Os -c avrm8ledtest.c #------------------ load: avrm8ledtest.hex ./prg_load_uc avrm8ledtest.hex # here is a pre-compiled version in case you have trouble with # your development environment load_pre: avrm8ledtest_pre.hex ./prg_load_uc avrm8ledtest.hex # loaduisp: avrm8ledtest.hex ./prg_load_uc -u avrm8ledtest.hex # here is a pre-compiled version in case you have trouble with # your development environment load_preuisp: avrm8ledtest_pre.hex ./prg_load_uc -u avrm8ledtest.hex #------------------- # fuse byte settings: # Atmel AVR ATmega8 # Fuse Low Byte = 0xe1 (1MHz internal), 0xe3 (4MHz internal), 0xe4 (8MHz internal) # Fuse High Byte = 0xd9 # Factory default is 0xe1 for low byte and 0xd9 for high byte # Check this with make rdfuses rdfuses: ./prg_fusebit_uc -r # use internal RC oscillator 1 Mhz wrfuse1mhz: ./prg_fusebit_uc -w 1 # use internal RC oscillator 4 Mhz wrfuse4mhz: ./prg_fusebit_uc -w 4 # use external 3-8 Mhz crystal # Warning: you can not reset this to intenal unless you connect a crystal!! wrfusecrystal: @echo "Warning: The external crystal setting can not be changed back without a working crystal" @echo " You have 3 seconds to abort this with crtl-c" @sleep 3 ./prg_fusebit_uc -w 0 #------------------- clean: rm -f *.o *.map *.out *t.hex #-------------------
Code:
Das Problem ist eben auch, dass ich weder den Code verstehe, noch weiß was die Sache mit dem Makefile soll. Also Ahnung von Programmieren hab ich schon allerdings nur in Java (hilft mir ja hier nicht weiter schätz ich mal)Code:/********************************************* * vim: set sw=8 ts=8 si : * Author: Guido Socher, Copyright: GPL * This program is to test the led connected to * PC5. * See http://linuxfocus.org/English/November2004/ * for details. * Chip type : ATMEGA8 * Clock frequency : Internal clock 1 Mhz (factory default) *********************************************/ #include <avr/io.h> //#define OLD 1 #ifdef OLD /* compatibilty macros for old style */ #ifndef cbi *#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))* #endif #ifndef sbi *#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))* #endif #endif /*OLD*/ *void delay_ms(unsigned short ms)* /* delay for a minimum of <ms> */ /* with a 1Mhz clock, the resolution is 1 ms */ { // Note: this function is faulty, see avrm8ledtest-0.2.tar.gz for // updated code. unsigned short outer1, outer2; outer1 = 50; while (outer1) { outer2 = 1000; while (outer2) { while ( ms ) ms--; outer2--; } outer1--; } } #ifdef OLD // old style now depricated: *void main(void)* { // enable PC5 as output sbi(DDRC,PC5); while (1) { // led on, pin=0 cbi(PORTC,PC5); delay_ms(500); // set output to 5V, LED off sbi(PORTC,PC5); delay_ms(500); } } #else /* new style */ *void main(void)* { /* INITIALIZE */ /* enable PC5 as output */ DDRC|= _BV(PC5); /* BLINK, BLINK ... */ /* PC5 is 5 (see file include/avr/iom8.h) and _BV(PC5) is 00100000 */ while (1) { /* led on, pin=0 */ PORTC &= ~_BV(PC5); delay_ms(500); /* set output to 5V, LED off */ PORTC|= _BV(PC5); delay_ms(500); } } #endif /*OLD*/
Ich hoff ihr könnt mir helfen.
mfg
jagdfalke
Hallo,
also mir würden diese Sternchen am Anfang und am ende erstmal auffallen,
probiers mal ohne in den jeweiligen Zeilen die er anmeckert.
er schreibt ja so schön:
syntax error before 'void'
dann schau mal vor das void
Ok, das hätten wir schon mal, danke. Ich hab den Code mal im Archive runtergeladen und da waren diese * von vornherein ncht.
Mit dem Befehl "make load" sollte ja das Programm rübergeschoben werden. Der output von make load ist;
Was mich etwas iritiert ist, dass immer von avrdude gesprochen wird (2x). Ich habe aber nie avrdude installiert. Gehts wohl nicht ohne?./prg_load_uc avrm8ledtest.hex
+ avrdude -p m8 -c dapa -e -U flash:w:avrm8ledtest.hex
./prg_load_uc: line 35: avrdude: command not found
+ set +x
Kann mir jemand nen Link geben, wo ich Schritt für Schritt avr-c lerne?
mfg
jagdfalke
Mit irgenwas muss das Programm ja uebertragen werden und da ist avrdude ganz gut fuer geeignet. Das wirst du wohl oder uebel installieren muessen. uisp kannst du auch nehmen aber das unterstuetzt meines Wissens nicht die neuesten AVRs.
Arbeite dich da mal durch: http://www.mikrocontroller.net/artic...R-GCC-Tutorial
Ok, also wir kommen der Sache schon näher
Mittlerweile sieht das ganze so aus:
Sieht recht gut aus, abgesehen davon, dass der Controller nicht antwortet. Strom ist angeschlossen, JSP-Dongle am parport0. Kann es was mit dem PrinterSpooler von Linux zu tun haben? Wenn ja, wie schalte ich den aus?linux:/home/mathias/avr programm/avrm8ledtest-0.3 # make load
./prg_load_uc avrm8ledtest.hex
+ avrdude -p m8 -c dapa -e -U flash:w:avrm8ledtest.hex
avrdude: AVR device not responding
avrdude: initialization failed, rc=-1
Double check connections and try again, or use -F to override
this check.
avrdude done. Thank you.
+ set +x
mfg
jagdfalke
JSP-Dongle sagt mir leider mal garnichts. Vllt musst du das Device noch mit -P angeben. Schau auch ob du die noetigen Berechtigungen auf parport0 hast.
Ich glaub nicht, dass da ein Spoller dazwischenfunkt. SUSE hat sicher irgendein Tool womit man das Teil probehalber einfach beenden kann.
Es muss natürlich ISP heißen, nicht JSP. (Das Kabel mit dem man den Controller mit dem PC verbindet.
Ich hab mal den Aufruf von avrdude mit einem -F versehen. make load schaut jetzt so aus:
Das F bewirkt ja, dass er nicht drauf achtet ob der Controller antwortet oder nicht. Ist das Programm jetzt drauf?linux:/home/mathias/avr programm/avrm8ledtest-0.3 # make load
./prg_load_uc avrm8ledtest.hex
+ avrdude -F -p m8 -c dapa -e -U flash:w:avrm8ledtest.hex
avrdude: AVR device not responding
avrdude: initialization failed, rc=-1
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0xffffff
avrdude: Yikes! Invalid device signature.
avrdude: erasing chip
avrdude: AVR device not responding
avrdude: reading input file "avrm8ledtest.hex"
avrdude: input file avrm8ledtest.hex auto detected as Intel Hex
avrdude: writing flash (204 bytes):
Writing | ################################################## | 100% 0.11s
avrdude: 204 bytes of flash written
avrdude: verifying flash memory against avrm8ledtest.hex:
avrdude: load data flash data from input file avrm8ledtest.hex:
avrdude: input file avrm8ledtest.hex auto detected as Intel Hex
avrdude: input file avrm8ledtest.hex contains 204 bytes
avrdude: reading on-chip flash data:
Reading | ################################################## | 100% 0.08s
avrdude: verifying ...
avrdude: verification error, first mismatch at byte 0x0000
0x0c != 0xff
avrdude: verification error; content mismatch
avrdude: safemode: Fuses OK
avrdude done. Thank you.
+ set +x
Na ueberleg mal, wenn er den mega8 vorher nicht gefunden hat bzw er nicht antwortet, dann haste das Programm ins Nirvana geschrieben.
Uberpruef mal die Verkabelung. MISO MOSI vertauscht und so.
Man kann sich ja leider nicht immer darauf verlassen, was einem der PC erzählt. Denn das Writing sieht ja aus also obs geklappt hätte.
Die Verkabelung kann kaum falsch sein: richtig am Controller angeschlossen ist es und am PC kann man eh nix falsch machen.
Weiß keiner Rat?
Hier nochmal die Files (dürften jetzt etwas anders sein):
.c-File
MakeFile:Code:/********************************************* * vim: set sw=8 ts=8 si : * Author: Guido Socher, Copyright: GPL * This program is to test the led connected to * PC5. * See http://linuxfocus.org/English/November2004/ * for details. * Chip type : ATMEGA8 * Clock frequency : Internal clock 1 Mhz (factory default) *********************************************/ #include <avr/io.h> #include <inttypes.h> //#define OLD 1 #ifdef OLD /* compatibilty macros for old style */ #ifndef cbi #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) #endif #ifndef sbi #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) #endif #endif /*OLD*/ void delay_ms(unsigned short ms) /* delay for a minimum of <ms> */ /* with a 1Mhz clock, the resolution is 1 ms */ { uint8_t inner,inner1; while (ms) { inner = 100; while (inner) { inner--; inner1 = 70; while (inner1) { inner1--; } } ms--; } } #ifdef OLD // old style now depricated: void main(void) { // enable PC5 as output sbi(DDRC,PC5); while (1) { // led on, pin=0 cbi(PORTC,PC5); delay_ms(500); // set output to 5V, LED off sbi(PORTC,PC5); delay_ms(500); } } #else /* new style */ void main(void) { /* INITIALIZE */ /* enable PC5 as output */ DDRC|= _BV(PC5); /* BLINK, BLINK ... */ /* PC5 is 5 (see file include/avr/iom8.h) and _BV(PC5) is 00100000 */ while (1) { /* led on, pin=0 */ PORTC &= ~_BV(PC5); delay_ms(500); /* set output to 5V, LED off */ PORTC|= _BV(PC5); delay_ms(500); } } #endif /*OLD*/
prg_load_ucCode:# makefile, written by guido socher MCU=atmega32 CC=avr-gcc OBJCOPY=avr-objcopy # optimize for size: CFLAGS=-g -mmcu=$(MCU) -Wall -Wstrict-prototypes -Os -mcall-prologues #------------------- all: avrm8ledtest.hex #------------------- help: @echo "Usage: make all|load|load_pre|rdfuses|wrfuse1mhz|wrfuse4mhz|wrfusecrystal" @echo "Warning: you will not be able to undo wrfusecrystal unless you connect an" @echo " external crystal! uC is dead after wrfusecrystal if you do not" @echo " have an external crystal." #------------------- avrm8ledtest.hex : avrm8ledtest.out $(OBJCOPY) -R .eeprom -O ihex avrm8ledtest.out avrm8ledtest.hex avrm8ledtest.out : avrm8ledtest.o $(CC) $(CFLAGS) -o avrm8ledtest.out -Wl,-Map,avrm8ledtest.map avrm8ledtest.o avrm8ledtest.o : avrm8ledtest.c $(CC) $(CFLAGS) -Os -c avrm8ledtest.c #------------------ load: avrm8ledtest.hex ./prg_load_uc avrm8ledtest.hex # here is a pre-compiled version in case you have trouble with # your development environment load_pre: avrm8ledtest_pre.hex ./prg_load_uc avrm8ledtest.hex # loaduisp: avrm8ledtest.hex ./prg_load_uc -u avrm8ledtest.hex # here is a pre-compiled version in case you have trouble with # your development environment load_preuisp: avrm8ledtest_pre.hex ./prg_load_uc -u avrm8ledtest.hex #------------------- # fuse byte settings: # Atmel AVR ATmega8 # Fuse Low Byte = 0xe1 (1MHz internal), 0xe3 (4MHz internal), 0xe4 (8MHz internal) # Fuse High Byte = 0xd9 # Factory default is 0xe1 for low byte and 0xd9 for high byte # Check this with make rdfuses rdfuses: ./prg_fusebit_uc -r # use internal RC oscillator 1 Mhz wrfuse1mhz: ./prg_fusebit_uc -w 1 # use internal RC oscillator 4 Mhz wrfuse4mhz: ./prg_fusebit_uc -w 4 # use external 3-8 Mhz crystal # Warning: you can not reset this to intenal unless you connect a crystal!! wrfusecrystal: @echo "Warning: The external crystal setting can not be changed back without a working crystal" @echo " You have 3 seconds to abort this with crtl-c" @sleep 3 ./prg_fusebit_uc -w 0 #------------------- clean: rm -f *.o *.map *.out *t.hex #-------------------
Code:#!/bin/sh prg="adude" if [ "$1" = "-u" ]; then shift; prg="uisp" fi if [ -z "$1" -o "$1" = "-h" -o "$1" = "--help" ]; then echo "prg_load_uc -- load a .hex file into a atmega8 microcontroller" echo "" echo "Usage: prg_load_uc [-hu] File.hex" echo "" echo "OPTIONS: -h this help" echo " -u use uisp instead of avrdude" echo " avrdude can automatically detect dapa or avrusb500." echo " uisp can only be used with the parallel port dapa." echo "" echo "This script can be easily adapted to different Programmer types" exit 0 fi pfile="$1" if [ "$prg" = "uisp" ]; then set -x uisp -dlpt=/dev/parport0 --erase -dprog=dapa uisp -dlpt=/dev/parport0 --upload if="$pfile" -dprog=dapa -v=3 --hash=32 --verify set +x fi if [ "$prg" = "adude" ]; then if grep "Vendor=0403 ProdID=6001" /proc/bus/usb/devices > /dev/null ; then set -x avrdude -F -p m8 -c avrusb500 -e -U flash:w:"$pfile" set +x else set -x avrdude -F -p m8 -c dapa -e -U flash:w:"$pfile" set +x fi fi
Lesezeichen