Liebes Forum,
wir haben in der Schule zurzeit ein Schulprojekt und dazu muss ein
Microcontroller programmiert werden, der eine Steuerung für ein Auto mit
Brennstoffzelle übernimmt. Dafür haben wir uns für dieses Projekt
entschieden. Hierzu wird ein ATTiny2313 verwendet. Als ich nun den Code
in AVR-Studio eingegeben habe kam dies hier raus:
Build started 17.5.2011 at 13:13:02
avr-gcc -mmcu=attiny2313 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char
-funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT uart.o -MF
dep/uart.o.d -c ../../Downloads/Wrtilty/Wrtilty/AVR/uart.c
../../Downloads/Wrtilty/Wrtilty/AVR/uart.c: In function 'UART_Init':
../../Downloads/Wrtilty/Wrtilty/AVR/uart.c:6: error: 'UBRRL' undeclared
(first use in this function)
../../Downloads/Wrtilty/Wrtilty/AVR/uart.c:6: error: (Each undeclared
identifier is reported only once
../../Downloads/Wrtilty/Wrtilty/AVR/uart.c:6: error: for each function
it appears in.)
../../Downloads/Wrtilty/Wrtilty/AVR/uart.c:15: error: 'UCSRB' undeclared
(first use in this function)
../../Downloads/Wrtilty/Wrtilty/AVR/uart.c:15: error: 'RXEN' undeclared
(first use in this function)
../../Downloads/Wrtilty/Wrtilty/AVR/uart.c:15: error: 'TXEN' undeclared
(first use in this function)
../../Downloads/Wrtilty/Wrtilty/AVR/uart.c:17: error: 'UCSRC' undeclared
(first use in this function)
../../Downloads/Wrtilty/Wrtilty/AVR/uart.c:17: error: 'UCSZ1' undeclared
(first use in this function)
../../Downloads/Wrtilty/Wrtilty/AVR/uart.c:17: error: 'UCSZ0' undeclared
(first use in this function)
../../Downloads/Wrtilty/Wrtilty/AVR/uart.c: In function 'UART_InChar':
../../Downloads/Wrtilty/Wrtilty/AVR/uart.c:22: error: 'UCSRA' undeclared
(first use in this function)
../../Downloads/Wrtilty/Wrtilty/AVR/uart.c:22: error: 'RXC' undeclared
(first use in this function)
../../Downloads/Wrtilty/Wrtilty/AVR/uart.c:24: error: 'UDR' undeclared
(first use in this function)
../../Downloads/Wrtilty/Wrtilty/AVR/uart.c: In function 'UART_OutChar':
../../Downloads/Wrtilty/Wrtilty/AVR/uart.c:29: error: 'UCSRA' undeclared
(first use in this function)
../../Downloads/Wrtilty/Wrtilty/AVR/uart.c:29: error: 'UDRE' undeclared
(first use in this function)
../../Downloads/Wrtilty/Wrtilty/AVR/uart.c:31: error: 'UDR' undeclared
(first use in this function)
make: *** [uart.o] Fehler 1
Build failed with 15 errors and 0 warnings...
Der Code ist jeweils: Uart.c
1
/* Initialize UART */
2
voidUART_Init(unsignedlongbaudrate){
3
/* Set the baud rate */
4
//Assumes 8Mhz clock in single speed (U2X=0) mode
5
switch(baudrate){
6
case9600:UBRRL=51;break;//.2% error
7
case19200:UBRRL=25;break;//.2% error
8
case38400:UBRRL=12;break;//.2% error
9
case57600:UBRRL=8;break;//-3.5% error
10
case115200:UBRRL=1;break;//8.5% error
11
default:UBRRL=12;
12
}
13
14
/* Enable UART receiver and transmitter */
15
UCSRB=(1<<RXEN)|(1<<TXEN);
16
/* set to 8 data bits, 1 stop bit */
17
UCSRC=(1<<UCSZ1)|(1<<UCSZ0);}
18
19
/* Read and write functions */
20
unsignedcharUART_InChar(void){
21
/* Wait for incomming data */
22
while(!(UCSRA&(1<<RXC)));
23
/* Return the data */
24
returnUDR;
25
}
26
27
voidUART_OutChar(unsignedchardata){
28
/* Wait for empty transmit buffer */
29
while(!(UCSRA&(1<<UDRE)));
30
/* Start transmittion */
31
UDR=data;
32
}
und Wrtilty.c
1
/* wrtilty.c
2
*
3
* Code to control a motor and a servo using an ATTiny2313. The ATTiny receives
4
* commands through the UART and sets its PWM or servo pulse accordingly.
5
*
6
* John Boiles
7
* 31 October 2008
8
*/
9
10
#include<inttypes.h>
11
#include<avr/io.h>
12
#include<avr/interrupt.h>
13
#include<avr/sleep.h>
14
#include"uart.c"
15
16
#define OC0 PB2
17
#define OCR OCR0A
18
#define DDROC DDRB
19
#define TIMER0_TOP 255 /* 8-bit PWM */
20
//Set COM0A1:0 = 2 for non-inverted pwm and 3 for inverted pwm
Du wirst die Headerdateien (#include...) auch in die uart.c einfügen
müssen.
Ein C-Compiler sieht immer nur die eine *.c, die er gerade kompiliert,
und wenn er also uart.c kompiliert weiß er nichts von wrtility.c und
den #include darin.
Als Schüler eines neusprachlichen Gymnasiums war uns stets der Zugang zu
einem richtigen Informatikunterricht verwehrt. Auch Lehrkräfte die uns
unterstützen können fehlen. Unser Lehrer der das Projekt betreut weis
davon Bescheid, dass wir hier im Internet fragen und hat auch nichts
dagegen. Es ist gehöhrt zum P-Seminar, einem neuen Fach im G8 in Bayern,
sowohl mit Lehrer als Team zu agieren, und zu erkennen, wenn man selbst
nicht mehr weiter weiß und dann sich an Profis wendet. Deshalb fände ich
es gut wenn ihr uns helfen würdet.
unix1970
Frage dich doch einfach mal, WARUM die Fehler auftreten.
Soviel Zeit MUSST du dir nehmen, und soviel Zeit muss man dir auch
zugestehen.
Der Fehler ist einfach, die "neuen Fehler" hast du ja nicht gepostet,
und ich persönlich werde nicht die Zeit aufbringen, Avr Studio zu
starten,
den Code per Copy/Paste reinzuhängen und auf Compile zu klicken.
Gerne helfe ich, wenn du eine konkrete Frage hast, aber das, was da
oben so steht, das zeigt, das blindes Kopieren ohne Verstehen angewendet
wird.
Sagt, was passiert eigentlich mit dem Auto und der Brennstoffzelle,
wenn der Code nen Fehler hat ? Ist dann der Schuld, der die obigen
Zeilen
kompiliert und hier gepostet hat?
Was du da fragst, sind relativ simple Grundlagen, wie man in C ein
Projekt auf mehrere Dateien aufteilt, so dass alles Compilierbar ist.
Grunprinzip ist:
* jedes C-File wird unabhängig von allen anderen compiliert
* Der Compiler fängt oben mit dem Lesen des Quelltextes an und arbeitet
sich in einem Lauf nach unten durch
* Wenn der Compiler beginnt, dann kennt er erst mal nur die
Grundelemente von C. Alles andere muss ihm erst mal beigebracht
werden. Dabei gilt:
Man kann nur Dinge benutzen, die man vorher auch zumindest deklariert
hat.
Eine Variable kann man zb nur dann verenden, wenn man vorher eine
Deklaration gesetzt hat. Oder anders ausgedrückt:
So rum ist es falsch
1
voidfoo()
2
{
3
i=5;
4
inti;
5
}
Ehe man i in einer Zuweisung verwenden kann, muss man es vorher
deklarieren (in diesem Fall sogar definieren)
1
voidfoo()
2
{
3
inti;
4
i=5;
5
}
Dasselbe gilt auch für Funktionen: Damit man eine Funktion aufrufen
kann, muss man den Compiler erst mal mit der Funktion bekannt machen.
Das kann auf mehrere Arten geschehen. Entweder man definiert die
Funktion vor der ersten Verwendung
1
voidfoo(void)
2
{
3
...
4
}
5
6
intmain()
7
{
8
foo();
9
}
oder man präsentiert dem Compiler eine Deklaration in Form eines
Protoypen. (Man sagt dem Compiler, dass es die Funktion tatsächlich
gibt und welche Argumentliste sie hat)
1
voidfoo(void);// Prototyp
2
3
intmain()
4
{
5
foo();// da der Compiler durch den Protoypen schon weiß
6
// das es die Funktion gibt und dass "foo" hier nicht
7
// einfach nur ein Tippfehler ist, geht das auch.
8
// Selbst wenn die eigentliche Funktion hier noch gar
9
// nicht bekannt ist
10
}
11
12
voidfoo(void)
13
{
14
// und hier ist sie nun:
15
// die eigentliche Funktion
16
}
Dabei muss die eigentliche Funktion noch nicht mal im selben C-File
sein. Um den Funktionsaufruf zu compilieren, benötigt der Compiler
nur den Prototypen. Die Implementierung der Funktion kann in einer
ganz anderen Datei sein
Nach diesem Vorgeplänkel, wäre dieser Thread als vertiefende Lektüre,
warum man da jetzt mit Header Files an die Sache rangeht, zu empfehlen
Beitrag "Den Befehl extern"
aber auch
http://www.mikrocontroller.net/articles/FAQ#Globale_Variablen_.C3.BCber_mehrere_Dateien
schlägt in etwa in diese Kerbe.
So wie auch jedes, aber auch wirklich jedes C-Buch, das da draussen
kreucht und fleucht.
Ach mist, nu hab ichs doch getan..
#include "uart.c" durch #include "uart.h" ersetzt, die uart.h noch
schnell zusammengeschrieben, 3 Zeilen .. und natürlich noch nen #include
<avr/io.h> in die uart.c gepackt..
Und nun ?
../../Downloads/Wrtilty/Wrtilty/AVR/wrtilty.c: In function 'main':
5
../../Downloads/Wrtilty/Wrtilty/AVR/wrtilty.c:108: warning: implicit declaration of function 'UART_Init'
6
../../Downloads/Wrtilty/Wrtilty/AVR/wrtilty.c:115: warning: implicit declaration of function 'UART_InChar'
7
../../Downloads/Wrtilty/Wrtilty/AVR/wrtilty.c: At top level:
8
../../Downloads/Wrtilty/Wrtilty/AVR/wrtilty.c:135: warning: conflicting types for 'UART_Init'
9
../../Downloads/Wrtilty/Wrtilty/AVR/wrtilty.c:108: note: previous implicit declaration of 'UART_Init' was here
10
../../Downloads/Wrtilty/Wrtilty/AVR/wrtilty.c:153: error: conflicting types for 'UART_InChar'
11
../../Downloads/Wrtilty/Wrtilty/AVR/wrtilty.c:115: note: previous implicit declaration of 'UART_InChar' was here
12
make: *** [wrtilty.o] Fehler 1
13
Build failed with 1 errors and 3 warnings...
Das ist der neue Fehlercode. Das Problem ist, dass Ich nicht sehr viel
Erfahrung mit der Programmierung von Microcontrollern habe. Das ganze
Projekt ist sehr wichtig, da die Note die aus dem Seminar hervorgeht
direkt ins Abitur einbezogen werden muss im G8. Auch aus diesem Grund
hoffe ich ihr könnt mir helfen. Was auch gut möglich ist, ist dass ich
mich einfach viel zu dumm anstelle beim Arbeiten mit AVR-Studio.
Sehe ich das richtig, dass die Variable UART_InChar zweimal deklariert
wird und hier der Fehler liegt? Das heißt im Code ist jetzt ein Fehler
unix1970
Maximilian A. schrieb:> ../../Downloads/Wrtilty/Wrtilty/AVR/wrtilty.c: In function 'main':> ../../Downloads/Wrtilty/Wrtilty/AVR/wrtilty.c:108: warning: implicit> declaration of function 'UART_Init'
Na da haben wir es doch schon.
Der COmpiler geht von oben nach unten durch wrtilty.c durch (und nur
durch wrtilty.c! die Datei uart.c interessiert ihn nicht)
Dabei stösst er auf einen Aufruf einer Funktion UART_Init.
Nur: Von dieser Funktion hat er noch nie gehört!
Daher die Warnung: Es treten Standardannahmen in Kraft.
> ../../Downloads/Wrtilty/Wrtilty/AVR/wrtilty.c:115: warning: implicit> declaration of function 'UART_InChar'> ../../Downloads/Wrtilty/Wrtilty/AVR/wrtilty.c: At top level:> ../../Downloads/Wrtilty/Wrtilty/AVR/wrtilty.c:135: warning: conflicting> types for 'UART_Init'
Tja. Und da steht jetzt im Klartext, dass die Standardannahmen Scheisse
waren und offenbar nicht stimmen können.
> Das ist der neue Fehlercode. Das Problem ist, dass Ich nicht sehr viel> Erfahrung mit der Programmierung von Microcontrollern habe.
Warum machst du dann so ein Projekt.
Und PS: Das ganze hat nichts mit Mikrocontrollern zu tun, sondern damit
ob man eine bestimmte Programmiersprache, nämlich C so leidlich kann.
> Das ganze> Projekt ist sehr wichtig, da die Note die aus dem Seminar hervorgeht> direkt ins Abitur einbezogen werden muss im G8.
Abitur?
Dann bin ich raus.
> Auch aus diesem Grund> hoffe ich ihr könnt mir helfen. Was auch gut möglich ist, ist dass ich> mich einfach viel zu dumm anstelle beim Arbeiten mit AVR-Studio.
Das ganze hat weder etwas mit AVR-Studio, noch mit µC oder sonstwas zu
tun, sondern ausschliesslich damit, dass du die Programmiersprache C
nicht gut genug kennst.
Was das Problem ist, hab ich weiter oben schon ausführlich erklärt. Wenn
es dazu noch Fragen gibt: OK, her damit. Aber die Lösung auf einem
Silbertablett, das spielts nicht. Zumal die Lösung sehr einfach ist.
Das Problem ist ich hatte nicht die große Wahl mit meinem P-Seminar. Da
dieses Fach verpflichtend ist hatte ich nur die Wahl zwischen einem
künstlerischen P-Seminar("Menschen im Isartal") und einem
Naturwissenschaftlichen ("Energie aus Wasser"). Da ich vollkommen
untalentiert im malen bin Wählte ich das P-Seminar "Energie aus Wasser".
Unser Lehrer legte dann den genaueren Kurs für das Seminar fest.
Zum Code:
Da Funktion die main Funktion im Wrtilty.c und nicht im UART.c und UART
in Wrtilty.c integriert wird, wird der Code aus UART.c nicht ausgelesen.
Deshalb sollte nun UART.c in main integriert werden. Dort kam nun der 2.
Fehler.
Liege ich jetzt richtig, dass A.N. beide Dateien in UART.h integrieren
möchte, welche vor der Main funktion ausgelesen wird.
Na mal ganz ehrlich ...
.. die Note ist bislang wohl eindeutig Mangelhaft, egal wie gut die
Hardware ist.
Nun ists Zeit, C zu lernen, wenn es denn die Programmiersprache der
Wahl ist, um die Note von mangelhaft auf besseres niveau zu heben.
zumindest soweit zu lernen, das man versteht, warum der hier
beschriebene
Fehler auftritt.. dabei ists noch nichtmal ein Programmierfehler im
Sinne
von falscher Logik hinter dem Code...
Glücklicher Weise ist ja zum glück nicht die Platine die Steuerung nicht
das Hauptding, sondern das organisieren von Sponsorengeldern, die Wahl
der richtige Brenstoffzelle, organisierung von hochreinen Wasserstoff,
abstimmen des Chassis (selbstentwurf) auf die Gegebenheiten (wenig
leistung von der Brennstoffzelle, trotz hohen Preises, nutzung der
Motoren). Die Steuerung wäre nun das Tüpfelchen auf dem i. Kann mir
jemand sagen ob es mit der vorgeschlagen Headerdatein funktionieren
würde?
Oh gott.. es wird immer schlimmer.
Hast du die beiden Postings von KHB überhaupt gelesen ??
Meine UART.H enthält nur die drei Zeilen mit den Funktionsdefinitionen
der uart.c - hey, so hab ich das glaub ich mal hier im C-Tutorial
gelesen.
Maximilian A. schrieb:> Glücklicher Weise ist ja zum glück nicht die Platine die Steuerung nicht> das Hauptding, sondern das organisieren von Sponsorengeldern, die Wahl> der richtige Brenstoffzelle, organisierung von hochreinen Wasserstoff,> abstimmen des Chassis (selbstentwurf) auf die Gegebenheiten (wenig> leistung von der Brennstoffzelle, trotz hohen Preises, nutzung der> Motoren)
... und das Schnorren der Programmierung.
Dann muss ich also in der Header Datei die beiden problematischen
Funktionen deklarieren. Und das war's? Wenn ich den Artikel richtig
gelesen habe müsste es so dann stimmen, oder?
Probiers aus.
Lies die Fehlermeldung, überlege was sie bedeutet und mach deine
Änderungen danach. Das nötige Rüstzeug hast du ja jetzt.
Mehr als das du andere Fehlermeldungen bekommst, kann dir nicht
passieren.
Aber: So lernt man!
Ich habe das ganze jetzt in eine Datei gepackt. Fehler spuckt der
Compiler keine mehr aus aber ich würde von euch gerne wissen ob durch
die Änderung immer noch die Funktionalität der Datei gegeben ist.
1
/* wrtilty.c
2
*
3
* Code to control a motor and a servo using an ATTiny2313. The ATTiny receives
4
* commands through the UART and sets its PWM or servo pulse accordingly.
5
*
6
* John Boiles
7
* 31 October 2008
8
*/
9
10
#include<inttypes.h>
11
#include<avr/io.h>
12
#include<avr/interrupt.h>
13
#include<avr/sleep.h>
14
//#include "uart.c"
15
16
#define OC0 PB2
17
#define OCR OCR0A
18
#define DDROC DDRB
19
#define TIMER0_TOP 255 /* 8-bit PWM */
20
//Set COM0A1:0 = 2 for non-inverted pwm and 3 for inverted pwm
>Könnte denn keiner was dazu sagen, da ich so viele Fehlerquellen wie>möglich ausschließen möchte?
Das möchte ich auch, aber es ist jetzt an *dir*+ es selber
auszuprobieren. Oder wischt dir Mamma noch.....
Also mal im Ernst, du wirst später jeden Tag Probleme lösen müssen. Wenn
du nicht langsam anfängst, dir eine Problemlösungsstrategie zu überlgen
wirst du nicht weiter kommen. Sachen wie "ich hatte keine Wahl" zählen
dann nicht mehr.
Außerdem willst du Abi machen, später ne Führungsposition besetzen und
gutes Geld verdiehnen, also tu verdammt nochmal was dafür. Is schon fast
dreist.
Knut
So den letzten Code habe ich auf AVR Studio 5 gebuilded: keine Fehler;
dann noch einmal auf AVR Studio 4 gebuilded und 14 Fehler. Jetzt
verstehe ich die Welt nicht mehr.
Ist ein gutes Zeichen.
Meistens ist es dann irgendeine Kleinigkeit, die man vergessen hat und
die weite Kreise zieht. Behebe die Kleinigkeit und alle 14 Fehler
verschwinden mit einem einzigen mal.
Aber ohne Fehlermeldung und das worauf sie sich bezieht, kann man halt
so gar nichts konkretes sagen.
Ob das ganze funktioniert wird sich erst in ein paar Tagen
herrausstellen wenn alle Komponenten da sind aber bis hierher vielen
Dank für die Tipps!
Unix1970
Maximilian A. schrieb:> Unser Lehrer legte dann den genaueren Kurs für das Seminar fest.
Ich frage mich, wie etwas geprüft werden und ausschlaggebend für eine
Note sein kann, dessen Rahmenbedingungen sich in verwehrtem Unterricht
und fehlenden Lehrkräften manifestieren.
Also entweder verarschst Du uns oder das deutsche Schulsystem ist doch
schlechter als ich dachte.
Außerdem, wie will der Lehrer denn entscheiden, welche Note für das
Ergebnis eines Projektes gerechtfertigt ist, dessen Grundlagen nie
gelehrt wurden und von dem er selber keine Ahnung hat?
Und wenn er Ahnung hat, wieso erklärt er vorher nicht die Grundlagen?
Dazu gibt es den Unterricht doch eigentlich.
42m
unix1970 schrieb:> Aber neue Fehler tauchen auf. Könnte jemand das> vielleicht builden und dann hier posten?holger schrieb:>>Passt das noch so?>> Zu faul zum selber ausprobieren?Maximilian A. schrieb:> Könnte denn keiner was dazu sagen, da ich so viele Fehlerquellen wie> möglich ausschließen möchte?holger schrieb:>>So den letzten Code habe ich auf AVR Studio 5 gebuilded: keine Fehler;>>dann noch einmal auf AVR Studio 4 gebuilded und 14 Fehler.>> Welche Fehler?Maximilian A. schrieb:> Mit fast allen variablen gibst probleme
vs.:
Maximilian A. schrieb:> Teamfähigkeit zu erlernen,
dann mal los!
Maximilian A. schrieb:> Es geht in dem Seminar gemeinsam mit aussenstehenden Partnern ein> Projekt auf die Beine zu stellen, Teamfähigkeit zu erlernen,> Organisationstalent zu beweisen, etc. Kultusministerium Bayern:
Also ist es vollkommen egal, ob die Steuerung funktioniert und was sie
macht?
Dann lasst eine LED blinken und erklärt - am besten mit ner schönen
Powerpoint-Präsentation - daß genau das blinken der Beweis ist, daß
alles total toll funktioniert. Und wenn Ihr die LED nicht zum blinken
bekommt, dann erklärt Ihr eben, warum das ein Zeichen für korrekte
Funktion ist.
Wer will es denn überprüfen? Und vor allem, wen interessiert das
Ergebnis, wenn der Weg das Ziel zu sein scheint?
> Dort findet man alles, was dieses Thema betrifft
Offensichtlich findet man dort nicht alles, ein gutes C-Tutorial scheint
dort zumindest zu fehlen.
42m
> gemeinsam mit aussenstehenden Partnern> ein Projekt auf die Beine zu stellen
gegeben, alle betroffenen und Beteiligten vom MC-Board sind bereits
eingespannt
> Organisationstalent zu beweisen
auch bereits erfolgt. Codeschnipsel wurden organisiert, und in einer
Datei zusammen gefügt
> Teamfähigkeit zu erlernen,
passt auch. Er lernt ja grade noch.
> Also ist es vollkommen egal, ob die Steuerung funktioniert und was sie
macht?
Ja, siehe:
>> Autor: Maximilian A. (unix1970)>> Datum: 17.05.2011 21:46>> Glücklicher Weise ist ja zum glück nicht die Platine>> die Steuerung nicht das Hauptding, sondern>> ...>> Die Steuerung wäre nun das Tüpfelchen auf dem i.
--> Maximilian ist mit seinem Projekt fast fertig.
Ich habe das ganze mal in WinAVR reingeschoben ohne Veränderung und auf
einmal ging das ganze durch wie Butter. Kann mir jemand sagen warum es
da funktioniert und bei AVR Studio nicht?
Das Seminar heißt "Energie aus Wasser" und nicht "Wie bastle ich einen
RC Ersatz mit einem Microcontroller". Da Microconroller nicht so ganz
mein Gebiet sind, mein lieber Herr Lehrer jedoch das Ganze ganz schön
fände, wende ich mich an euch in der Hoffnung auf Hilfe. Jedoch macht
ihr euch fast alle nur über mich lustig, was definitiv nicht der Sinn
eines Forums ist.
Lies dir deine Fragestellung noch einmal durch.
Überlege welche Information du gegeben hast.
Dann frag dich selber: Aufgrund welcher INformation soll irgendwer in
der Lage sein, deine Frage zu beantworten.
Tschüss (denn das war nicht das erste mal, dass man dir die Würmer aus
der Nase ziehen muss. Und dazu haben die meisten hier einfach keine Lust
mehr)