ich bezweife erstmal das deine
void pause_us (int us)
funktion in der Praxis funktioniert. Der compiler ja nicht dumm und wird
sie dir komplett wegoptimieren.
Lade mal die echten Dateien hoch, sonst hat man dcoh kein überblick was
in welcher Datei steht.
Das ist Mumpitz.
Was soll man mit einem *.jpg anfangen?
Kopiere die erste Fehlermeldung als Klartext hier rein.
Und dann hänge benanntes *.h ran, damit man die benannte Zeile sehen
kann.
Bzw. auch die *.c, welche das *.h einbindet.
Peter
Der größte Teil der Probleme kommt daher, daß du in deinen
(zusammenkopierten???) header-Files keine include guards benutzt, und
diese mehrfach eingebunden werden.
http://de.wikipedia.org/wiki/Include_Guard
Die dann noch verbleibenden Fehlermeldungen lassen sich mit Hilfe eines
C-Buchs einfach lösen.
Oliver
Du hast Definitionen von Funktionen in den Includedateien (*.H). Und
weil du die Includedatei zweimal in Hauptprogramm1.c includierst, einmal
direkt und einmal indirekt über MP3_Driver.h, werden die
Redefinition-Fehlermeldungen provoziert.
> void Delay1TCY;
Da fehlen die Funktionsklammern was zum Fehler
"C:\Users\Dave\Desktop\NN\Programm\Projekt.X\display_help.h:8:Error
[1178] illegal declaration of object of type void" führt.
Den eigentliche Sinn der Includedateien, nämlich darin Deklarationen
(Prototypen) für Funktionen anzugeben, machst du mit den extern
Deklarationen in Hauptprogramm1.c. Weil die Deklarationen dort aber
nicht 100% zu den Definitionen in der Includedateien passen, kommt es zu
den Tedeclaration-Fehlermeldungen.
> unsigned char buf[20];> buf = "Next druecken!";
Geht in C nicht. Schau dir die strcpy() Funktionen aus den C-Library an,
wie man Arrays zur Laufzeit ändert. Oder wie man Arrays
(String-Variablen) zur Compilezeit initialisiert.
Die Fehlermeldung ist klar, du inkludierst ein .c File als .h File.
Möglich, aber wenn du dann gleichzeitig die bereits definierten
Funktionen
als "extern" declarierst, hast du ein Deklarierungsproblem. Dies meldet
der Compiler. Du includierst ja schon display_help.h, dann brauchst du
sie nicht nochmals declarieren.
Weiters, nach dem include von delay.h kannst du die Funktionen nutzen
und nicht nochmals declarieren.
void Delay1TCY;
void Delay10TCYx ( unsigned char unit ); // Delay in multiples of 10
void Delay100TCYx ( unsigned char unit ); // Delay in multiples of 100
void Delay1KTCYx ( unsigned char unit ); // Delay in multiples of 1,000
void Delay10KTCYx ( unsigned char unit ); // Delay in multiples of
Normalerweise declariert man eine Variable z.B. für 4Mhz OSC
#define _XTAL_FREQ 4000000
und dann z.B.
#if _XTAL_FREQ/(1000*4)/4/10 > 255
#define delay_250us()
(Delay100TCYx((1599+_XTAL_FREQ)/(999*4)/4/100),Delay10TCYx(9))
#else
#if _XTAL_FREQ/(1000*4)/4 > 255
#define delay_250us() Delay10TCYx((159+_XTAL_FREQ)/(999*4)/4/10),
#else
#define delay_250us() do { char _t=(_XTAL_FREQ+15)/(999*4)/4;
while(_t--) Delay1TCYx(); } while(0)
#endif
#endif
#endif
delay_ms(int val) { if(val) while(val--) {
delay_250us();
delay_250us();
delay_250us();
delay_250us();
}
}
Das display_help.h ist eigentlich ein .c File , da dort Funktionen
definiert sind.
Richtig wäre ein display_help.h zu erstellen mit folgendem Inhalt:
void display_init(void);
void display_clear(void);
void display_text(char *text);
void display_ptext(char *text,int zeile,int spalte);
void display_position(int z, int s);
void display_enable(void);
void display_send(char byte);
void display_data(char byte);
void display_command(char byte);
void controller_init(void);
zusammen mit folgenden code
#define LCD_DATAPORT PORTD //Port für die 4 Datenleitungen
#define LCD_DATAPORTDR DDRD
#define LCD_DATA0 4
#define LCD_DATA1 5
#define LCD_DATA2 6
#define LCD_DATA3 7
#define LCD_SETPORT PORTA //Port für die 4 Steuerleitungen
#define LCD_SETPORTDR DDRA
#define LCD_E 0
#define LCD_RS 2
#define LCD_RESET 3
//-----------------------------------------------------------------//
// Display Befehle
//-----------------------------------------------------------------//
#define LCD_CLEAR 0b00000001 //Löschen des Display, Cursor auf
Home
#define LCD_FUNCTION 0b00100100 //4-Bitmodus, RE=1
#define LCD_FUNCTION2 0b00100000 //4-Bitmodus, RE=0
#define LCD_CONTROL 0b00001100 //Display ON, Cursor OFF, Blinken
OFF
#define LCD_CONTROL2 0b00001101 //Display ON, Cursor OFF, Blinken
ON
#define LCD_CONTROL3 0b00001110 //Display ON, Cursor ON, Blinken
OFF
#define LCD_CONTROL4 0b00001111 //Display ON, Cursor ON, Blinken
ON
#define LCD_EXTENDED 0b00001001 //5-Dot Fontwidth, Normal Cursor,
4 Lines
#define LCD_ENTRYMODE 0b00000110 //Segment Bidirectional Function
(Seg1->Seg60)
#define LCD_DDRAM 0b10000000 //DDRAM Adresse setzen
//-----------------------------------------------------------------//
// Zeilenadressen und Länge einer Zeile
//-----------------------------------------------------------------//
#define LCD_LINE1 0x00
#define LCD_LINE2 0x20
#define LCD_LINE3 0x40
#define LCD_LINE4 0x60
und in display_help.c
ein #include "display_help.h" haben
sowie die defines abändern wie folgt als Beispiel.
#ifndef LCD_DDRAM
... dieselben defines wie oben
#endif
Und natürlich das display_help.c zum Projekt hinzufügen.
auch die definitionen von Delay... sind falsch und führen zu
Fehlermeldungen, und sind bereits in <delay.h> includiert.
Hey Leute,
ich dank euch, habt ihr echt geholfen.
Aber ich hab paar Fehler, die eigentlich keinen Sinn machen.
Denn eigentlich müsste es korrekt sein oder seh ich das was falsch.
Hab die neuen Codes angehängt mit den Fehlermeldungen.
Gruß Dave
Dein
"int display_text(unsigned char Info,unsigned char k)"
tut bestimmt nicht das, was Du Dir erhoffst, wenn Du es aufrufst.
Evtl. verschwindet der Großteil der Fehler, wenn Du die Funktion richtig
machst. 3 Post hier drüber von Chris ist ja schon ein Hinweis dazu drin
;)
Kevin schrieb:> und was ist mit dem Syntak Error.> Der macht doch keinen Sinn, halt ganz am Schluss vom C Main File.
Typischerweise geht man "von pben nach unten" vor. Weiter unten können
durchaus Folgefehler aufgeführt sein, welche gar keine Fehler sind. Der
Compiler ist halt durch den ersten Fehler aus dem Tritt gekommen, und
weiß unten nicht mehr ob er Männlein oder Weiblein ist, und meldet
merkwürdige Sachen ...
Was ist denn mit dem Fehler in Zeile 129? Hast du den denn schon
beseitigt?
Dan schrieb:> Hey Leute,>> ich dank euch, habt ihr echt geholfen.> Aber ich hab paar Fehler, die eigentlich keinen Sinn machen.> Denn eigentlich müsste es korrekt sein oder seh ich das was falsch.> Hab die neuen Codes angehängt mit den Fehlermeldungen.>> Gruß Dave
Servus,
ich hab mir mal deinen Code ein bisschen angeschaut. Was kommt ist
allgemeine Kritik, einfach z.T. "nicht üblicher" Code. Ich denke mal du
bist noch ein bisschen Anfänger ....
>LATA = LATB = LATC = LATD = LATE = 0x00;
Sowas macht man nicht. Die Operatorenreihenfolge ist zwar von rechts
nach links aber machen tut man's nicht.
1
display_text('MP3-Wecker',1);
Mich wundert, dass dein Compiler dich nicht mit Fehlermeldungen
überschüttet. In C sind Zeichenketten Strings immer in doppelten
Anführungsstrichen (") zu indizieren. Mit einfachem Hochkomma werden nur
einzelne Zeichen indiziert 'a' bzw. die Hilfszeichen '\n' sobald es aber
mehr als ein Zeichen ist, ist z.B. "MP3-Wecker" Pflicht. Das sind auch
einige Fehler die weiter unten kommen.
1
unsignedintk;
2
unsignedintm;
3
unsignedintl;
4
intg;
5
intb;
6
intc;
7
intd;
8
inte;
9
intf;
10
inth;
11
intx;
12
intz;
13
unsignedinty;
14
x=0;
15
z=0;
16
y=2012;
Du musst generell Code übersichtlicher gestalten. Ansonsten kann man
gerade wenn man dir helfen will nicht so gut erkennen was du vor hast.
Obriger Code ist auf wenige Zeilen komprimierbar:
Alle Kontrollstrukturen (wie if, ...) die in ihrem Anweisungblock nur
eine einzige Anweisung haben (wie hier "entprell();"), da kann man sich
die geschweiften Klammern sparen:
Das solltest du vielleicht mal Konsquent bei deinem Code anwenden.
Des weiteren musst du strikter Formatieren. So verliert man einfach den
Überblick. Du hast dich z.B. zum glück für eine einheitliche
Formatierung entschieden. z.B
1
do
2
{
3
if(irgendwas)
4
{
5
}
6
else
7
{
8
}
9
}
jetzt hast du aber noch asslig viel drin in dieser do-Schleife. Da kann
keiner den Überblick behalten. Darum solltest du dann einrücken.
1
do
2
{
3
if(irgendwas)
4
{
5
}
6
7
else
8
{
9
}
10
}
So kann man es schon besser erkennen!
Noch eine letzte Sache
@Dan:
unsigned int k;
unsigned int m;
unsigned int l;
int g;
int b;
int c;
int d;
int e;
int f;
int h;
int x;
int z;
unsigned int y;
x=0;
z=0;
y=2012;
Und du bist dir sicher, daß du in einer Woche noch weißt, welche
Funktion die einzelnen ein-buchstabigen Bezeichner haben, und warum
grade der Wert 2012 verwendet wurde (möglicherweise das Geburtsdatum
deines Hamsters?)
Ist den bei PIC nicht erlaubt, Bezeichner mit mehreren Buchstaben zu
benutzen?
Wenn du Bezeichner nutzt wie zaehlindex_links, zaehlindex_rechts,
zwischenzaehler_taste1, etc. dann ist es zwar EINMAL etwas mehr
Schreibaufwand, aber das Programm liest sich danach "wie ein Buch", d.h.
es ist ab dann immer und überall lesbar und durch die sprechenden
Bezeichner-Namen direkt kommentiert.
@hachja: ich verstehs grad nicht, habs so gemacht wie Chris es mir
empfholen hat
@B. Limer: Naja habs jetzt gemacht wie du es empholen hast, aber
geholfen hats nicht. Und ich finds jetzt ein bisschen unübersichtlicher,
aber ist halt geschmackssache, trotzdem danke ;)
_DAN_ schrieb:> Guten Tag, Leute._Kevin_ schrieb:> habs jetzt gemacht wie du es empholen hast,> aber geholfen hats nicht
Tja, ist ein Fall von Persönlichkeitsspaltung. Deswegen funktioniert es
auch nicht ;-)
@Wegstaben Verbuchsler:
Wir sind zu zweit, wenn man darüber länger nachdenkt,
dann kommt man selber drauf oder??
Und von dir kamen bisher keine Lösungsvorschläge... ;)
Ich beziehe mich auf die oben geposteten Files + Error.
Hast du dir die Zeilen mal angesehen wo der error rauskommt + Warning ?
LATA=LATB=LATC=0; ist gängige C Programmierung wennauch sie hier weniger
Sinn macht, das stimmt, aber darum geht es ja nicht.
Warning ist, weil du 'text' anstelle von "text" benutzt, das ist
eigentlich ein Error.
Aber da ist noch ein großer Fehler bei dir im Kopf,
int display_text(unsigned char Info, unsigned char k);
wobei du es aber so benutzt,
display_text('Fehler',1)
wie auch
y=2012;
y++;
display_text(y,1);
unsigned char ist ein Wert zwischen 0 und 255
vielleicht wolltest du :
int display_text(unsigned char *Info, unsigned char k);
oder willst vielleicht in Python programmieren, wo egal ist ob
char oder int oder string.
Das Error ist
ALARM_EIN = 1
wobei
#define ALARM_EIN 4
definiert ist,
also
4 = 1
da aber eien Zuweisung auf eine nicht Variable ein Fehler ist,
syntax error.
Kevin schrieb:> Und von dir kamen bisher keine Lösungsvorschläge... ;)
Der Vorschlag, sprechende Bezeichner zu verwenden, hab ich nicht aus Jux
gemacht, sondern dir (euch) in euren Programmierfähigkeiten zu
unterstützen.
Desgleichen der Hinweis auf "Fehler von oben nach unten abarbeiten", und
auch mal die gleichartigen Fehler in Zeile 129 und folgende zu verstehen
und zu beseitigen.
Wurde aber anscheinend nicht so wahrgenommen.
Chris hat es zwar nun schon verdeutlicht aber:
Du hast gemacht:
int display_text(unsigned char Info,unsigned char k);
Der Vorschlag war:
int display_text(unsigned char *Info, unsigned char k);
Der kleine Stern macht einen großen Unterschied (Stichwort: Pointer /
Zeiger)
Ja, aber er macht auch solchen Code:
y=2012;
y++;
display_text(y,1);
Also eine reine Änderung in char* sowie Änderung von 'text' in "text"
ist zwar der halbe Weg, aber eben nicht alles, bzw kann das dann auch
zum Absturz des Programmes führen, wenn nicht führt sicher zum Absturz
des
Programmes.
itoa als Beispiel, ev. mit display_num() .
Was ich ausdrücken wollte, die Funktion display_text(char*s,char i)
macht nicht das was man erwarten würde, da fehlt noch was an
funktionalität.
Chris schrieb:> LATA=LATB=LATC=0; ist gängige C Programmierung
Nö, sondern nur ne schlechte Angewohnheit.
Erzeugt erstens mehr Code, da die IO-Register zurückgelesen werden
müssen.
Und zweitens kann es Fehler bewirken. Wenn in einem Register nicht alle
Bits implementiert sind, liest man Unsinn zurück und weißt es dem
nächsten Register zu.
Peter
> Chris schrieb:>> LATA=LATB=LATC=0; ist gängige C Programmierung>> Nö, sondern nur ne schlechte Angewohnheit.>> Erzeugt erstens mehr Code, da die IO-Register zurückgelesen werden> müssen.
Alle Register werden direkt auf 0 gesetzt. Da wird nichts zurückgelesen.