Das Programm springt zuerst in die Routine wo das LCD initialisiert
wird, und dann ins Hauptprogramm (do...while Schleife).
Nachdem er sie einmal durchläuft macht er sie nochmal und dann geht er
wieder auf die LCD Initialisierungen und nach denen stürzt er laut
Simulator ab. Und das passiert auch scheinbar im uC.
Ich sehe am Display genau 5 mal den Zustand der ersten Sensors was ich
mir auch nicht erklären kann, weil ich ja ADC im Free Running Modus
benutze und immer den Kanal wechsle.
dito schrieb:> Was bedeutet "und dann geht er wieder auf die LCD Initialisierungen"?> Woran machst du das fest?
Der Simulator sagt es, und irgendwann nachher stürzt er ab.
Floh schrieb:> das hat nichts in der main zu tun.
Ich habs vorhin unten dort wo steht Unterprogramme hingetan, aber dann
macht er die Schleife einmal durch geht auf lcd-routines.c (keine ahnung
warum weil es ja nicht in der do..while schleife steht, dann macht er
wieder einmal das HP und dann geht wieder auf routines und stürzt dann
ab laut Simulator.
Und im Kontroller sehe ich nur den einmal gemessenen Wert der Ersten
Sensors 5mal obwohl ich Multiplexe zwischendurch.
Gruß Bro
Brocken Sei schrieb:> Floh schrieb:>> das hat nichts in der main zu tun.>> Ich habs vorhin unten dort wo steht Unterprogramme hingetan, aber dann> macht er die Schleife einmal durch geht auf lcd-routines.c (keine ahnung> warum weil es ja nicht in der do..while schleife steht, dann macht er> wieder einmal das HP und dann geht wieder auf routines und stürzt dann> ab laut Simulator.
Zunächst mal werden includes am Anfang des Programms gemacht.
Außerdem ist es nicht empfehlenswert, Sourcedateien (*.c) zu
inkludieren, dafür schreibt man ja Headerdateien.
Dann solltest du für deine Sensorwerte einen Datentyp verwenden, für 8
bit entweder "unsigned char" oder "uint8_t".
Admux kann man übrigends auch einfach inkrementieren. :-)
Ich weiß grad nicht ob itoa den Ergebnisstring terminiert? Könnte auch
noch eine Fehlerquelle sein.
in der schleife wird ja "Schleife" nicht geändert. da kannst doch ne
while(1) nehmen und wenns sein muss mit pin abfrage ein break setzen.
Die do..while verwirrt mich :) und den compiler vielleicht auch...
Brocken Sei schrieb:> Und im Kontroller sehe ich nur den einmal gemessenen Wert der Ersten> Sensors 5mal obwohl ich Multiplexe zwischendurch.
Das kann ja gut sein, Du wartest ja nicht bis der ADC die nächste
Wandlung folendet hat, sondern liest sofort ein. Schau dir nochmal an
wie der ADC funktioniert!
Floh schrieb:> Brocken Sei schrieb:>> #include "lcd-routines.c">> das hat nichts in der main zu tun.
Auch wenn wir nicht wissen was da genau drinnen steht, das hat nichts in
der main zu suchen!
Floh schrieb:> Zunächst mal werden includes am Anfang des Programms gemacht.
Ist mir schon klar, aber als ich das gemacht habe hatte ich ne menge
Fehlermeldungen. Außerdem sit int main der Programmstart, und nicht das
Hauptprogramm, ich wüsste nichts was dagegen sprechen könnte.
Floh schrieb:> Dann solltest du für deine Sensorwerte einen Datentyp verwenden, für 8> bit entweder "unsigned char" oder "uint8_t".
Habe ich gemacht, aber im Tutorial steht dass man auch nur unsigned
schreiben kann oder vielleicht auch muss weil die Größe gebe ich ja nach
dem Doppelpunkt an oder irre ich mich?
Floh schrieb:> Ich weiß grad nicht ob itoa den Ergebnisstring terminiert? Könnte auch> noch eine Fehlerquelle sein.
Nein, Quelle ist tutorial, es funktioniert auch ich sehe ja werte und
auch richtige Werte jedoch nur von einem Sensor 5*.
Die ganze Sach mit dem Simulator hat mich etwas verwirrt, ich habe zwar
viele Beiträge gefunden wo es Komplikationen gibt aber ich benutze ja
auch seit gestern Eclipse was ich ziemlich angenehm finde. Ich habe aber
gerade herausgefunde, dass wenn ich das include"lcd routines.c" rausgebe
ich es immer noch funktioniert. Dh er springt nachher trotzdem in
lcd.routines.c hinein.
Sie sind aber im selben Ordner, vielleicht führt eclipse alle *.c Datein
beim überspielen zusammen?
Gruß Bro
Olek schrieb:> Die do..while verwirrt mich :) und den compiler vielleicht auch...
do...while bewirkt genau das selbe, bzw sollte es weil ich es simuliert
habe. Aber auch wenn ich eine while(1) setzt (die mich etwas irritiert,
aber in C scheint das so definiert zu sein, oder es hat irgend einen
Grund, dass wenn 1 steht er sie immer wieder wiederholt) dann passiert
das selbe wie bei do...while.
Klaus schrieb:> *Pfui!* C-Files werden niemals inkludiert! Nicht mal unter Androhung> von Gewalt!
ok, habs schon verstanden Klaus.
manu schrieb:> Das kann ja gut sein, Du wartest ja nicht bis der ADC die nächste> Wandlung folendet hat, sondern liest sofort ein. Schau dir nochmal an> wie der ADC funktioniert!
Da hast du leider recht wie ich gerade selbst draufgekommen bin, hmm,
danke!!
manu schrieb:> Auch wenn wir nicht wissen was da genau drinnen steht, das hat nichts in> der main zu suchen!
Also ich hab das vom Tutrial einfach rausgenommen, wieso sollte ich
sowas neu entwickeln?
Aber es macht ja Probleme, vielleicht führt nichts drum herum, wer weiß.
Gruß Bro
Tu uns bitte allen einen Gefallen, und lese endlich ein C-Buch! Was soll
denn das sinnlose und aussichtslose rumprobieren, ohne jegliche Ahnung?
Das führt zu nix!
Klaus schrieb:> Tu uns bitte allen einen Gefallen
Achso versteh schon, wenn du mir nicht mehr helfen willst dann lass es
doch, aber treib nicht alle anderen wieder aus dem Thread raus, dann hat
ja keiner was davon.
Klaus schrieb:> und lese endlich ein C-Buch!
Was ist? Kann ich nicht lesen und gleichzeitig ausprobieren?
Spricht das etwa gegen deine Prinzipien?
Also ich finde nur lesen ohne Praxis is fürn Pfurz!
Klaus schrieb:> denn das sinnlose und aussichtslose rumprobieren
also gibst du auf? Sehe ich das richtig Klausi?
Klaus schrieb:> ohne jegliche Ahnung?
Das ist nun echter Schwachsinn. Ich habe lediglich nur eine neue IDE
ausprobiert. Dass das Probleme macht da komme ich gerade selbst drauf.
Klaus schrieb:> Das führt zu nix!
Ok wenn du meinst, aber mich kannst du damit nicht demotivieren.
Gruß Bro
Brocken Sei schrieb:> manu schrieb:>> Auch wenn wir nicht wissen was da genau drinnen steht, das hat nichts in>> der main zu suchen!>> Also ich hab das vom Tutrial einfach rausgenommen, wieso sollte ich> sowas neu entwickeln?> Aber es macht ja Probleme, vielleicht führt nichts drum herum, wer weiß.
Also ich habe jetzt mal schnell deinen Code zusammen mit den aus dem
Tutorial versucht zu kompilieren, aber:
...
In file included from main.c:14:
lcd-routines.c: In function 'main':
lcd-routines.c:14: error: invalid storage class for function
'lcd_enable'
lcd-routines.c:23: error: invalid storage class for function 'lcd_out'
make: *** [main.o] Error 1
Das läuft bei dir schon durch?
Der Preprocessor ersetzt die Zeile "#include "lcd-routines.c"" mit dem
Inhalt der Datei lcd-routines.c und dieser Inhalt hat an dieser Stelle
nichts zu suchen.
Mano Wee schrieb:> Der Preprocessor ersetzt die Zeile "#include "lcd-routines.c"" mit dem> Inhalt der Datei lcd-routines.c und dieser Inhalt hat an dieser Stelle> nichts zu suchen.
Ich glaube ich werd wohl doch nicht so schnell ein funktionierendes
Programm hinbekommen, da ich noch nicht mal weiß warum ich bei diesem
Code nicht das UP aufrufen kann.
Ist wohl angebracht, aber so schwer ist das auch nicht.
In diesem Fall musst Du es z.B. so
1
voidHallo()
2
{
3
DDRB=255;
4
}
5
6
intmain(void){
7
8
...
9
10
while(1)
11
{
12
Hallo();
13
}
14
}
oder so
1
voidHallo();
2
3
intmain(void){
4
5
...
6
7
while(1)
8
{
9
Hallo();
10
}
11
}
12
voidHallo()
13
{
14
DDRB=255;
15
}
schreiben. (Ungetestet, sollte aber passen - zu dieser späten Stunde)
Wenn Du mit einem Makefile arbeitest, dann darfst Du die lcd-routines.c
nicht vergessen mit zu kompilieren. Bei mir sieht es dann so aus:
1
...
2
# Target file name (without extension).
3
TARGET=main
4
5
# List C source files here. (C dependencies are automatically generated.)
Mano Wee schrieb:> Wenn Du mit einem Makefile arbeitest, dann darfst Du die lcd-routines.c> nicht vergessen mit zu kompilieren. Bei mir sieht es dann so aus:
Ja, wie gesagt danke!
Gruß Bro