www.mikrocontroller.net

Forum: Compiler & IDEs Schleife wird nur einmal durchlaufen


Autor: Brocken Sei (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.
/*******************************************Header*************************************************
Projektname:
Projektbeschreibung:
Programmierer:
Zuletzt aktualisiert:
**************************************************************************************************/
#include <avr/io.h>
#include <stdint.h>
#include <util/delay.h>
#include <stdlib.h>
#include "lcd-routines.h"

int main(void) {
#include "lcd-routines.c"

//************************************Initialisierungen*******************************************
//ADC-INIT:
  ADMUX = 0b01100000;//externe Referenzspannung
  ADCSRA = 0b10000111;//Ergebnis = 8bit Auflösung, enable ADC

  ADCSRA |= (1<<ADSC); //erste Messung starten, dann Free running, dh kein Setzen mehr des ADSC, nur noch MUX

//LCD-INIT:
  lcd_init();
  lcd_clear();
//**********************************Variablendeklarationen****************************************
uint8_t Schleife = 1;

//Variablen für LCD output
  char SEN0[10];
  char SEN1[10];
  char SEN2[10];
  char SEN3[10];
  char SEN4[10];

struct{
  unsigned Sensor0:8;
  unsigned Sensor1:8;
  unsigned Sensor2:8;
  unsigned Sensor3:8;
  unsigned Sensor4:8;
} Line;      //Jeder Sensor 8 Bit Breit.


//****************************************Ein/Ausgabe*********************************************

//**************************************Programmstart*********************************************
  do
  {
  //Lese Sensoren aus und schreibe sie in Line---------
    //Sensor0:
    ADMUX &=~ ((1<<MUX0) | (1<<MUX1) | (1<<MUX2));
    Line.Sensor0 = ADCH;
    //An Display anzeigen:
      itoa(Line.Sensor0, SEN0, 10);
      lcd_setcursor(0,1);
      lcd_string(SEN0);

    //Sensor1:
    ADMUX |= (1<<MUX0);
    Line.Sensor1 = ADCH;
    //An Display anzeigen:
      itoa(Line.Sensor1, SEN1, 10);
      lcd_setcursor(4,1);
      lcd_string(SEN1);

    //Sensor2:
    ADMUX |= (1<<MUX1); ADMUX &=~ (1<<MUX0);
    Line.Sensor2 = ADCH;
    //An Display anzeigen:
      itoa(Line.Sensor2, SEN2, 10);
      lcd_setcursor(8,1);
      lcd_string(SEN2);

    //Sensor3:
    ADMUX |= (1<<MUX0) | (1<<MUX1);
    Line.Sensor3 = ADCH;
    //An Display anzeigen:
      itoa(Line.Sensor3, SEN3, 10);
      lcd_setcursor(12,1);
      lcd_string(SEN3);

    //Sensor3:
    ADMUX |= (1<<MUX2); ADMUX &=~ ((1<<MUX0) | (1<<MUX1));
    Line.Sensor4 = ADCH;
    //An Display anzeigen:
      itoa(Line.Sensor4, SEN4, 10);
      lcd_setcursor(16,1);
      lcd_string(SEN4);

  //--------------------------------------------------------------------

  }
  while(Schleife != 0);

//Unterprogramme**************************************************************

}



Gruß Bro

Autor: dito (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was bedeutet "und dann geht er wieder auf die LCD Initialisierungen"? 
Woran machst du das fest?

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Brocken Sei schrieb:
> #include "lcd-routines.c"

das hat nichts in der main zu tun.

Autor: Brocken Sei (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Olek (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Brocken Sei schrieb:
> #include "lcd-routines.c"

*Pfui!*  C-Files werden niemals inkludiert! Nicht mal unter Androhung 
von Gewalt!

Autor: manu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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!

Autor: dito (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die itoa-Funktion könnte Probleme machen. Nimm die mal testweise überall 
raus und probiere...

Autor: Brocken Sei (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Brocken Sei (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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!

Autor: Brocken Sei (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Mano Wee (Firma: ---) (manow)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Mano Wee (Firma: ---) (manow)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Brocken Sei (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.
#include <avr/io.h>
#include <stdint.h>
#include <util/delay.h>
#include <stdlib.h>
#include "lcd-routines.h"

int main(void) {

//************************************Initialisierungen*******************************************
//ADC-INIT:
  //ADMUX = 0b01100000;//externe Referenzspannung
  //ADCSRA = 0b10000111;//Ergebnis = 8bit Auflösung, enable ADC

//LCD-INIT:

//**********************************Variablendeklarationen****************************************



//****************************************Ein/Ausgabe*********************************************

//**************************************Programmstart*********************************************
  while(1)
  {
    Hallo();
  }
}
void Hallo()
{
  DDRB = 255;
}

Ich werds mal bei dem hier belassen, und wie Klaus gesagt hat ein 
nützliches Buch besorgen. Danke allen trotzdem für die Hilfe.

Gruß Bro

Autor: Mano Wee (Firma: ---) (manow)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist wohl angebracht, aber so schwer ist das auch nicht.

In diesem Fall musst Du es z.B. so
void Hallo()
{
  DDRB = 255;
}

int main(void) {

...

while(1)
  {
    Hallo();
  }
}
oder so
void Hallo();

int main(void) {

...

while(1)
  {
    Hallo();
  }
}
void Hallo()
{
  DDRB = 255;
}
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:
...
# Target file name (without extension).
TARGET = main

# List C source files here. (C dependencies are automatically generated.)
SRC  = $(TARGET).c
# SRC = $(TARGET:%=%.c)
# other c-files
SRC += lcd-routines.c
...

Autor: Brocken Sei (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.