Forum: Mikrocontroller und Digitale Elektronik Benötige Hilfe beim Programm


von cash w. (school93)


Lesenswert?

Guten Abend.

Ich bin zum ersten Mal in diesem Forum und benötige dringenst Hilfe! Wir 
machen gerade in der Schule ein Projekt, 2 Klassenkollegen und ich haben 
nur mehr bis Dienstag Zeit, dann müssen wir es präsentieren. Wir machen 
gerade einen Ultraschall-Abstandsmesser mit LCD-Anzeige....
Also Hardwaremäßig haben wir schon alles, sprich fertiggelötet usw... 
Allerdings hängt alles vom Programm ab und dieses funktioniert nicht 
ganz.
Vorab, ich bin überhaupt kein Experte in diesem Gebiet, ein richtiger 
Amateur und kenn mich sehr wenig aus... Die Schaltung und das Programm 
bekamen wir vom Bruder des Teamkollegen und er meinte, bei ihm hat es 
letztes Jahr funkttioniert.

Programm im Avr-Studio....
In der Schaltung haben wir Atmega8, jedoch meinte er dass wir das 
Programm im Avr-Studio unter Atmega48 simulieren sollen. (hmmm?!)

Naja hier mal das Programm bzw Error:

#define F_CPU 8000000

#include <avr/io.h>
#include <inttypes.h>
#include <stdio.h>
#include <avr/interrupt.h>

#include <distance.h>
#include <util/delay.h>

/** Prototypen **/

static int send_receive_ping (void); // Sends a rectangle-signal and 
tests for response
static int compute_distance (int ticks); // Difference in timer-ticks 
between send and receive
static void        show_result (int distance); // Send the result to the 
display
static void        setup_timer (void);    //Sets up the required 
time-register
static void        setup_ports (void); //Sets up io-Ports
static void        stop_timer (void); // Stops the timer

volatile uint8_t ticks=0; // current Timer Ticks
volatile uint8_t speaker_state=0;

/** Some defines to adjust the correct timing **/

#define CNT_SEND_TICKS 10
#define CNT_TIMEOUT       40
#define CNT_INTERIM       40
#define CNT_SIGNALS    50        // real 8
#define CCNT_SIGNALS   100        //real 16

#define TIMER_PRELOAD  200        //real 100

#define ever;;

/**
    Ablauf
    Programm sendet 4 Rechtecksignale mit 40kh via Port 2 an die 
Schaltung
    Dann wartet das Programm (?)
    Einlesen von Port 2 ob ein Signal ansteht.
    Errechnen der Laufzeit und Ausgabe des Ergebnisses.
**/

int main()
{ int    delay,i;
  int    distance;
  uint8_t tv1,tv2;

  lcd_init();
  setup_ports();

  for(ever)
  { delay=send_receive_ping();
      for(i=0;i<500;i++)_delay_ms(5);

    if(delay) // Timer is stopped
    { tv1=TCNT0; // Read the Current Timervalue 8Mhz
      tv2=ticks; //Count of Interrupts 80kh

      distance=compute_distance(ticks*TIMER_PRELOAD+tv1); //in mm
      show_result(distance);
    }
  }
  return(0); //prevents a compiler warning
 }

 /** Local functions **/

 static int compute_distance(int ticks) // Difference in timer-ticks 
between send and receive
{ int rc;

rc=(33*ticks)/125; // Unter 4mm
return(rc);
}
static void show_result(int distance)
{ char buffer [32];

lcd_clear();
lcd_home();
sprintf(buffer,"DIST=%dmm",distance);
lcd_string(buffer);
}
/** Predifined Function. This function is always called from the 
processor when the timer-Interrup occurs.
In this function we increment the "current ticks".
**/
ISR(TIMER0_COMPA_vect) // kommt mit 80 kHz
{if (ticks < CNT_SIGNALS)
{ if(!speaker_state)
{PORTB&=0x7F;
speaker_state=1;
}
else
{ PORTB|=0x08;
speaker_state=0;
}
}
ticks++;
}
static void setup_timer()
{ ticks=0;
TCCR0A=0x02;
TCCR0B=0x85;
OCR0A=TIMER_PRELOAD;
TIMSK0=0x02;
}
static void setup_ports()
{ DDRB = 0xFF;
PORTB=0x3F;

DDRD=0x00;
PORTD=0xFF;
}
void set_led(int8_t led,int8_t status)
{ if(!status)
{ PORTB|=1<<led;
}
else
{PORTB&=~(1<<led);
}
}
int send_receive_ping()
{uint8_t echo_state;

set_led(0,1);
set_led(2,0);
set_led(1,0);


ticks=0;
setup_timer();
sei();

while(ticks<CCNT_SIGNALS)
{ echo_state=PIND; // Test for response
if (!(echo_state&0x1)) // Got a response ?
{ stop_timer(); //Save the Timerstate
set_led(0,0);
set_led(1,1);
return(1); // Return "Response received"
}}
set_led(0,0);
stop_timer(); // Always stop the timer
return(0);
}


UND DIE FEHLERMELDUNG:

../Werkstätte.c:8:22: error: distance.h: No such file or directory

also fehlt was in der library?!

help pls :D

danke schonmal im vorraus

von Justus S. (jussa)


Lesenswert?

die Fehlermeldung sagt doch genau, was der Fehler ist...mehr Hilfe kommt 
hoffentlich nicht...

von cash w. (school93)


Lesenswert?

ja aber was soll ich da machen... wenn die library fehlt

von Blödmann (Gast)


Lesenswert?

Na den Fehler korrigieren. Wird Dir wohl nichts anderes übrigbleiben, 
wenn Du das Programm zum laufen bringen willst.

Kleiner Hinweis: Wie kommst Du darauf, das eine Library fehlt? Lies 
nochmal genau die Fehlermeldung:

../Werkstätte.c:8:22: error: distance.h: No such file or directory


Weisst Du was eine Library ist?

von Muggel (Gast)


Lesenswert?

Hast du denn die Library in deinem Projektordner?

-->Wenn ja, dann musst du "distance.h" schreiben.

-->Wenn nicht, dann solltest du sie dir besorgen.

Grüße

von cash w. (school93)


Lesenswert?

wie gesagt, ich bin ein ziemlicher amateur, und wie ihr seht, hab ich 
das programm natürlich nicht selbst geschrieben...

von cash w. (school93)


Lesenswert?

ja das ist das problem... wir sind eben nciht dazu fähig, eine zu 
schreiben.... ist das aufwendig? sonst könnte uns morgen ein lehrer 
helfen... denke ich

von Blödmann (Gast)


Lesenswert?

>wie ihr seht, hab ich das programm natürlich nicht selbst geschrieben

Woran soll man das sehen? An den Serifen, oder was?

Deutlicher geht es ja nun wirklich nicht.
Wenn Du entweder nicht lesen oder Texte nicht verstehen kannst, dann 
hast Du Deine Note verdient. So einfach ist das.

Beitrag "Einheitlicher Umgang mit faulen Schülern etc.?"

von Muggel (Gast)


Lesenswert?

Hast du denn mal deinen Rechner nach einer Datei namens distance.h 
durchsucht und eventuell doch etwas gefunden?

So wie es mir scheint ist die lib doch Elementar für eure gewünschte 
Funktion und ich kann nicht sagen, ob euer Lehrer überhaupt die Zeit 
investiert euch die Datei nochmal zurecht zu kauen.

Grüße

von Blödmann (Gast)


Lesenswert?

Lass Dich von Muggel nicht irreführen. Was Dir da fehlt ist keine 
Library.

von cash w. (school93)


Lesenswert?

das sieht man, weil - ich gebs zu- ich nichtmal den fehler beheben kann, 
bzw genau weiß, worum es geht...

"Deutlicher geht es ja nun wirklich nicht.
Wenn Du entweder nicht lesen oder Texte nicht verstehen kannst, dann
hast Du Deine Note verdient. So einfach ist das."

Das eine hat mit dem anderen nix zu tun... ich kann lesen bzw texte 
verstehen, das heißt trotzdem nicht, dass ich nun ein 
super-programmierer bin und den fehler behebe

von Muggel (Gast)


Lesenswert?

Hast ja recht. Dir fehlt die Header-Datei. Sorry für die Verwechslung. 
Trotzdem würde ich sie erst mal suchen gehen.

von Blödmann (Gast)


Lesenswert?

>dass ich nun ein super-programmierer bin und den fehler behebe

Sehr ungeschickt. Bei solchen Antworten fühlen wir uns hier erst recht 
verarscht.
Um das Problem zu lösen muss kein "Superprogrammierer" sein.

von cash w. (school93)


Lesenswert?

ok thx, hab gerade eine im inet gefunden, dass das dann aber passt, 
bezweifle ich, man kanns ja versuchen :D

von Blödmann (Gast)


Lesenswert?

Das sind absolut elementare Grundlagen.

von cash w. (school93)


Lesenswert?

Blödmann schrieb:
> Sehr ungeschickt. Bei solchen Antworten fühlen wir uns hier erst recht
> verarscht.
> Um das Problem zu lösen muss kein "Superprogrammierer" sein.

Ich bin aber nicht einmal ein durchschnittlicher programmierer, sondern 
ein anfänger.... und ich fühle mich eher von dir verarscht, wenn du mir 
nicht helfen willst, und versuchst, mich anzuprangern, dann sei 
wenigstens ein wenig hilfreich, indem du gar nix schreibst

von Muggel (Gast)


Lesenswert?

Warum versuchst du die Datei nicht von dem jenigen zu kriegen, der dir 
dein Projekt ja eigentlich schon gemacht hat?

von Floh (Gast)


Lesenswert?

cash warren schrieb:
> Die Schaltung und das Programm
> bekamen wir vom Bruder des Teamkollegen und er meinte, bei ihm hat es
> letztes Jahr funkttioniert.

Dann frag doch den, wo er die distance.h hat.

von cash w. (school93)


Lesenswert?

ja stimmt, nur ist sein bruder bloß beim bundesheer und kommt erst in 
monaten zurück

von Muggel (Gast)


Lesenswert?

Du hast doch hier Hilfe erwartet. Aber wenn du deine Aufgabe übermütig 
ausgewählt hast und 2 Tage vor Abgabe feststellst, dass du doch keine 
Ahnung hast, von dem was du machst, dann können wir dir auch nicht 
helfen. Wir besitzen auch keine Glaskugel, die uns verrät, was da drin 
steht.

Die aus dem Internet kannst du vergessen, da diese Datei bestimmt 
speziell auf das Projekt zugeschnitten ist. Ohne Kenntnisse von C 
deinerseits sehe ich da keine Lösung in Sicht.

von cash w. (school93)


Lesenswert?

ok stimmt, ohne c-kenntnisse sollte ich sowwas wirklich vergessen, thx 
trotzdem und sorry @blödmann dass ich ein wenig frech geworden bin.... 
ich verdiene diese note, die ich bekommen werde....

man sieht (liest) sich :D

von Blödmann (Gast)


Lesenswert?

Tja. Leider dumm gelaufen. Hoffe es reisst Dich nicht allzu sehr rein, 
mit Deinem Notendurchschnitt.

von zwiebackfräser (Gast)


Lesenswert?

Hallo chash warren,
wenn deine Datei distance.h im Verzeichnis deines 'Projektes' steht
dann mach mal #include "distance.h", statt #include <distance.h>

Die Meldung sagt aus die Datei dinstance.h nicht in dem von dir
angebenen Verzeichnis gefunden wird.

Aber das liest du dir am Besten mal in einem Buch über 'Grundlagen C'
durch.

Gruß J.

von Yalu X. (yalu) (Moderator)


Lesenswert?

cash warren schrieb:
> Wir machen gerade in der Schule ein Projekt, 2 Klassenkollegen und ich
> haben nur mehr bis Dienstag Zeit, dann müssen wir es präsentieren.

Da habt ihr euch ja was vorgenommen :)

> Vorab, ich bin überhaupt kein Experte in diesem Gebiet, ein richtiger
> Amateur und kenn mich sehr wenig aus...

Das sind ja die besten Voraussetzungen :))

Kann einer von euch wenigstens ein Bisschen C programmieren?

> Die Schaltung und das Programm bekamen wir vom Bruder des Teamkollegen

Was habt ihr denn dann noch selber gemacht, außer die Schaltung nachge-
baut?

> und er meinte, bei ihm hat es letztes Jahr funkttioniert.

Ziemlich sicher nicht mit dieser Programmversion.Wahrscheinlich gibt es
eine neuere, die aber nicht mehr auffindbar ist :)))

> In der Schaltung haben wir Atmega8, jedoch meinte er dass wir das
> Programm im Avr-Studio unter Atmega48 simulieren sollen. (hmmm?!)

Simulieren könnt ihr lange. Wenn ihr die Schaltung aber real vorführen
wollt, braucht ihr einen ATmega48 oder einen anderen aus der gleichen
Serie (ATmega88, -168 oder -328). Ihr könnt natürlich auch das Programm
umschreiben, dass es auf einem ATmega8 läuft.

> ../Werkstätte.c:8:22: error: distance.h: No such file or directory

Wie schon geschrieben wurde: Euch fehlt die Datei distance.h.

Ein heißer Tipp: Das ist euer allergeringstes Problem. Habt ihr mal
probiert, was passiert, wenn ihr die Zeile im Programm einfach löscht?

Der Teufel steckt aber wo ganz anders: Wie oben schon angedeutet,
scheint dieses Programm nicht die letzte Version zu sein, da es noch
grobe Fehler enthält.

So ist bspw. die Funktion stop_timer noch nicht implementiert. Man kann
sich aber denken, was sie wohl tun soll und sie unter Zuhilfenahme des
Datenblatts nachprogrammieren. Wahrscheinlich enthält sie sogar nur eine
einzige Anweisung.

Da liegt aber noch mehr im Argen:
1
ISR(TIMER0_COMPA_vect) // kommt mit 80 kHz
2
{if (ticks < CNT_SIGNALS)
3
  { if(!speaker_state)
4
    {PORTB&=0x7F;
5
      speaker_state=1;
6
    }
7
    else
8
    { PORTB|=0x08;
9
      speaker_state=0;
10
    }
11
  }
12
  ticks++;
13
}

Mal abgesehen davon, dass ein ATmega wesentlich bessere Möglichkeiten
bietet, ein 40kHz-Signal zu erzeugen: Von den beiden Konstanten 0x7F und
0x08 sind bei einer die Ziffern vertauscht. Aus dem Schaltplan sollte
aber hervorgehen, wie es richtig ist.

Wahrscheinlich gibt es noch mehr Fehler von der Sorte.

Wenn ihr ehrlich seid, müsst ihr zugeben, dass ihr die Sache vergeigt
habt. Ihr seid wahrscheinlich in der Annahme an die Sache herangegangen,
dass Schaltplan und Software ja schon von anderen gemacht worden sind
und ihr jetzt nur noch die Dinge zusammenbauen müsst, wozu ja locker ein
Wochenende (oder vielleicht sogar nur der heutige Tag) ausreicht. Also
mit wenig Aufwand die große Show ;-)

Aber noch ist es zu früh zum Aufgeben. Ihr dürft nur nicht erwarten,
dass auch den Rest andere für euch machen.

Wenn ihr euch massivst auf den Hosenboden setzt, bis Dienstag auf Disse,
Computerspiele, Fernsehen & Co verzichtet, habt ihr noch eine Chance,
das Ding zum Laufen zu bekommen, vorausgesetzt, ihr habt wenigstens ein
ganz kleines Bisschen Ahnung von Mikrocontrollern und C-Programmierung
(wenn nicht, frage ich mich, warum ihr die Sache überhaupt angefangen
habt).

Ihr solltet als erstes versuchen, den kompletten Programmcode zu verste-
hen, so riesig ist er ja auch wieder nicht. Nur so könnt ihr eventuelle
weitere Fehler aufdecken und korrigieren.

Für das stop_timer-Problem solltet ihr ungefähr verstanden haben, was
der Timer im AVR tut. Dazu gibt es hier ein AVR-Tutorial und natürlich
das Datenblatt. Wenn ihr das verstanden habt, sollte es auch nicht
schwer sein, das Programm vom ATmega48 auf den ATmega8 zu portieren, da
ihr dazu praktisch nur die wenigen Zeilen Timer-Code anpassen müsst.

Es wäre von Vorteil, wenn ihr ein Oszilloskop zur Verfügung hättet, um
zu sehen, ob die Sende- und Empfangssignale des Sensors in Ordnung sind.
Sicher hat eure Schule eins, das ihr benützen könnt. Damit euch das Oszi
etwas nützt, müsst ihr natürlich auch die Schaltung verstanden haben.

Es gibt also drei Baustellen: Software, Timer und Schaltung.

Und ihr seid drei junge, hochmotivierte und lernfähige Burschen :D

Wenn jeder von euch eines der Themen anpackt und morgen früh sofort
anfängt, bekommt ihr das bis Dienstag hin (falls es doch nicht ganz
reichen sollte, gibt euch der Lehrer ja vielleicht auch eine Fristver-
längerung bis Mittwoch oder Donnerstag).

Ich wünsche euch viel Erfolg :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.