Forum: Mikrocontroller und Digitale Elektronik Bräuchte hilfe bei der Programmierung eines Atmega 32


von Sascha E. (baracuss)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe ein Problem und zwar muss ich ein Programm für einen 
Mikrocontroller schreiben um bei einem Werkzeugwechsler die 
Schrittmotoren anzusteuern.

Ich habe zwar schon ein paar Kenntnisse von C dadurch das wie in der 
Schule mit Keil in C Programmieren allerdings Programmieren wir einen 
80c552 von NXP.

Bei diesem Projekt musste ich leider einen Atmel Atmega32 verwenden und 
in AVRstudio4 programmieren und ich kenne mich mit beiden leider nicht 
sonderlich gut aus, weder mit dem Atmega32 noch mit dem AVRstudio4.

Als µcontrollerboard verwende ich den Atmel Evaluation-Board Version 
2.0.1 Bausatzt den man bei Pollin bestellen kann.

Nun habe ich das Programm geschrieben haber leider noch ein Paar Fehler 
drin so das er mir folgende error Meldungen anzeigt:

../Werkzuegwechsler.c:26: error: expected ';' before 'if'
../Werkzuegwechsler.c: At top level:
../Werkzuegwechsler.c:221: fatal error: opening dependency file 
dep/Werkzuegwechsler.o.d: No such file or directory

Um das Programm besser zu verstehen hier auch mal eine Kleine Programm 
info:

PortB = Eingänge
PortD = Ausgänge
PortC = Ausgänge

Wenn PortBO und PortB4 High sind solle PortC0 auf High gesetzt werden 
und an PortC1 sollen 80 Pulse rausgegeben werden.
Nach den 80 Pulsen soll PortD0 auf High gesetzt werden bis von PortB5 
ein High kommt.

Wenn PortB1 und PortB4 High sind solle PortC0 auf Low gesetzt werden und 
an POrtC1 sollen 80 Pulse rausgegeben werden.
Nach den 80 Pulsen soll PortD1 auf High gesetzt werden bis von PortB5 
ein High kommt.

Der Rest des Programms ist imprinzip noch einmal das selbe nur mit 
anderen Ein-/Ausgänge.


Es wäre sehr net von euch wenn ihr mir helfen könntet warum er mir die 
Error Meldungen anzeigt und vieleicht euch mal das Programm ankucken 
könntet ob ich das richtig gemacht habe.

Schon einmal im vorraus danke für eure Hilfe.

Wer Rechtschreibfehler findet darf sie gerne behalten XD.

von (Ein) (Gast)


Lesenswert?

Ich weiß nicht, ob das schon den Fehler behebt, aber wenn du eine 
Variable auf einen bestimmten Wert vergleichen möchtest, solltest du 
"==" anstatt "=" nehmen.

Also: if(j == 80){}

von (Ein) (Gast)


Lesenswert?

Achso, der Fehler sollte sich so beheben lassen:

if(PIND & (1<<PD0))
{
...
}

analog für die anderen.

von Sascha E. (baracuss)


Angehängte Dateien:

Lesenswert?

(Ein) schrieb:
> Achso, der Fehler sollte sich so beheben lassen:
>
> if(PIND & (1<<PD0))
> {
> ...
> }

Leider weiss ich jetzt nicht so ganz was du mir damit sagen wolltest 
habe allerdings das Programm noch mal geändert und jetzt auch == 
verwendet bei vergleichen allerdings macht er mir immer noch die 
gleichen Fehlermeldungen

von Felix (Gast)


Lesenswert?

(Ein) meinte, dass du nicht einfach PD0 mit einem Wert vergleichen 
kannst, falls du damit den Status des Pins abfragen willst. Diese ganzen 
Pin-Bezeichner sind Konstanten zum Ansprechen der entsprechenden Bits in 
den I/O-Registern. Du vergleichst also diese Konstante mit irgendwas. 
Entweder ist das also immer wahr oder immer falsch. Das hat absolut 
NICHTS mit dem Lesen und anschließenden Entscheiden nach einem Wert in 
einem I/O-Register zu tun.

Das sind echt die elementarsten Grundlagen. Du kannst nicht einfach 
irgendwas hinschreiben und hoffen das der Compiler schon weiß was du 
meinst. Arbeite das AVR-GCC-Tutorial durch und schau dir das Datenblatt 
zum Controller an. Atmel hat gerade bei der Atmega-Reihe echt sehr gute 
Datenblätter, da steht alles übersichtlich und geordnet drin.

Das was du generell im Programm machst ist auch nicht gerade günstig, 
diese ganzen Warte-Zustände in denen dein Controller einfach nur noch 
wartet und sonst nichts mehr anderes tun kann zum Beispiel. Das kann dir 
mal ganz schnell Ärger machen wenn du das Programm irgendwann mal 
erweitern musst und die weitere Funktion eben nicht mit dem warten 
kompatibel ist.

Die Fehlermeldungen sind doch selbsterklärend. Es fehlt für den Compiler 
auf Zeile 26 ein Semikolon. Also schau dir den Bereich davor an und 
finde was da syntaktisch falsch ist. Was mit der fehlenden 
Abhängigkeitsdatei ist, kann ich nicht sagen, da wäre ein makefile 
hilfreich um zu sehen was du eingebunden hast. Kann auch einfach ein 
Folgefehler sein, weil aus der fehlerhaften C-Datei keine Objekt-Datei 
erzeugt wird.

von Sascha E. (baracuss)


Angehängte Dateien:

Lesenswert?

So habe es Jetzt noch mal geändert wie es in der Tutorial steht! Hoffe 
ich zumindest allerdings ist der Fatale error immer noch nicht weg!

Wäre super wen ihr mir nochmal deswegen weiterhelfen könntet.

Hier einmal die komplette Meldung die beim Compallieren generiert wird:

Build started 1.2.2011 at 18:31:08
      0 [main] sh 4496 sync_with_child: child 3652(0x124) died before 
initialization with status code 0x0
  20295 [main] sh 4496 sync_with_child: *** child state waiting for 
longjmp
/usr/bin/sh: fork: Resource temporarily unavailable
avr-gcc  -mmcu=atmega32 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char 
-funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT 
Werkzuegwechsler.o -MF dep/Werkzuegwechsler.o.d  -c 
../Werkzuegwechsler.c
../Werkzuegwechsler.c:223: fatal error: opening dependency file 
dep/Werkzuegwechsler.o.d: No such file or directory
compilation terminated.
make: *** [Werkzuegwechsler.o] Error 1
Build failed with 1 errors and 0 warnings...

von So nicht! (Gast)


Lesenswert?


von Karl H. (kbuchegg)


Lesenswert?

Sascha Enste schrieb:
> So habe es Jetzt noch mal geändert wie es in der Tutorial steht!

Nope, hast du nicht.
Du hast die Dinge geändert auf die hier im Forum der Finger gelegt wurde 
und dann auch nur dann, wenn dir der Antworter direkt die Zeile 
hingeschrieben hat. Allerdings hast du die Korrekturen zum größten Teil 
nicht verstanden, wie dein Programm belegt.

Dein Programm ist furchtbar und die Aussage, dass du schon C so 
einigermassen kannst, die glaub ich dir nicht.

Es ist jetzt schwer zu entscheiden ob man dir hilft, wenn man dieses 
Programm komplett neu richtig schreibt und dir zum Studium gibt. Das 
beste wärs, denn so wird das nichts. Das ist als ob man einen 
ABC-Schützen in die Geheimnisse der Trigonometrie einweihen soll. Egal 
was man ihm erzählt, es fehlt einfach an allen Ecken und Enden.

> Build started 1.2.2011 at 18:31:08
>       0 [main] sh 4496 sync_with_child: child 3652(0x124) died before
> initialization with status code 0x0
>   20295 [main] sh 4496 sync_with_child: *** child state waiting for
> longjmp

Wenn ich Compiler wäre würde ich bei so einem Programm auch abstürzen.

von So nicht! (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Es ist jetzt schwer zu entscheiden ob man dir hilft

Ach, findest du?

von Karl H. (kbuchegg)


Lesenswert?

Dieses Konstrukt
1
    for(j=0; j<10; j++)
2
    {
3
       ....
4
5
       if(j==10)
6
       {
7
          ....
8
       }
9
    }

muss man sich ja auf der Zunge zergehen lassen. Das hat das Zeug für 
einen echten Klassiker.
Es zeigt so richtig, dass hier jegliche Grundlagen fehlen und der Autor 
die ersten Hausübungen, in denen es um Schleifen geht (traditionell in 
einer der ersten Stunden), komplett geschwänzt hat.

von Karl H. (kbuchegg)


Lesenswert?

So nicht! schrieb:
> Karl heinz Buchegger schrieb:
>> Es ist jetzt schwer zu entscheiden ob man dir hilft
>
> Ach, findest du?

:-)
Ja, finde ich.
Jeder hat sich erst mal Hilfe verdient, solange Aussicht besteht, dass 
die Hilfe auch was nützt. Aber in diesem paar Programmzeilen finden sich 
soviele Probleme, dass ich zweifle - verzweifle. Da weiß man gar nicht 
wo man mit erklären anfangen soll, denn im Grunde müsste man bei Adam 
und Eva anfangen.

von Sascha E. (baracuss)


Lesenswert?

Karl heinz Buchegger schrieb:
>
1
>     for(j=0; j<10; j++)
2
>     {
3
>        ....
4
> 
5
>        if(j==10)
6
>        {
7
>           ....
8
>        }
9
>     }
10
>
>
> Es zeigt so richtig, dass hier jegliche Grundlagen fehlen und der Autor
> die ersten Hausübungen, in denen es um Schleifen geht (traditionell in
> einer der ersten Stunden), komplett geschwänzt hat.

Um erhlich zu sein habe ich das so gelernt in der Schule gelernt ich 
Könnte euch sogar ein Programm von meinem Lehrer zeigen was er uns 
gegebn hatt. Und dort steht es genauso drin wie ich es gemacht habe nur 
halt für eine andere funktion.

von Sascha E. (baracuss)


Lesenswert?

Es wäre echt super net von euch wenn ihr mir mal ein konkrettes beispiel 
geben könntet wie ich es den Programmieren soll, wenn es so komplett 
falsch ist.

von So nicht! (Gast)


Lesenswert?

Sascha Enste schrieb:
> Um erhlich zu sein habe ich das so gelernt in der Schule gelernt ich
> Könnte euch sogar ein Programm von meinem Lehrer zeigen was er uns
> gegebn hatt. Und dort steht es genauso drin wie ich es gemacht habe nur
> halt für eine andere funktion.
Das will ich sehen, aber bitte mit Beweis dass der Lehrer es wirklich 
exakt so geschrieben hat!

Karl heinz Buchegger schrieb:
> Ja, finde ich.
Du bist halt ein unverbesserlicher Gutmensch. ;-)
Ich hätte längst zugemacht, nach dem ersten Auftritt.

von Karl H. (kbuchegg)


Lesenswert?

1) Kann ich mir das schwer vorstellen.
   Denn innerhalb der Schleife nimmt j alle möglichen Werte an,
   aber 10 wird es mit Sicherheit nie

2) Auch eine for Schleife ist irgendwann einmal zu Ende,
   nämlich dann, wenn sie genügend Durchgänge gemacht hat und die
   Schleifenbedingung nicht mehr zutrifft (in deinem Fall, dass j
   kleiner als 10 sein muss, damit die Schleife eben noch einmal
   ähh schleift)

   Der "Abschnitt B" in
1
   for( j = 0; j < 10; ++j )
2
   {
3
     Abschnitt A;
4
   }
5
   Abschnitt B;
   wird ganz von alleine genau dann ausgeführt, wenn die Schleife ihre
   10 Durchgänge fertig hat. Denn dann fällt die Programmausführung
   ganz von alleine aus der Schleife raus und macht mit der nächsten
   Anweisung nach der Schleife weiter.
   Siehe: Übungsstunde 3, in der es darum geht, einen Diamanten
   aus '*'-zeichen auszugeben

             *
            ***
           *****
            ***
             *

   welches ganz natürlich so implementiert wird, dass man 2 Schleifen
   hintereinander setzt, eine für den oberen Teil, eine für den unteren
   Teil und wenn die Schleife für den oberen Teil fertig ist, kommt
   als nächste Anweisung dann eben die Schleife für den unteren Teil
   zum Zug.

3) Wenn das tatsächlich so von eurem Lehrer kommt (was ich mir
   nicht vorstellen kann), dann sag deinem Lehrer einen schönen Gruss
   und er möge doch bitte erst einmal C und Programmieren lernen,
   ehe er zum unterrichten geht.
   Aber wie gesagt: Ich bezweifle, dass das so von eurem Lehrer kommt.
   Ich denke eher, dass du damals nicht aufgepasst hast und auch seither
   deine Hasuaufgaben nicht selbst gelöst hast.

von Patrick (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:

> Wenn ich Compiler wäre würde ich bei so einem Programm auch abstürzen.

Karl Heinz: You made my day :) ROFL

von Sascha E. (baracuss)


Angehängte Dateien:

Lesenswert?

So habe jetzt das Programm noch mal Verändert und mal nur den Ersten 
teil genommen.

Wäre es den jetzt so richtig?
Ansonsten wüste ich gerne was ich noch ändern soll.

von eszgd (Gast)


Lesenswert?

Sascha Enste schrieb:
> Ansonsten wüste ich gerne was ich noch ändern soll.
Ein ".c" am Ende der Datei wäre schon ganz gut...

...weniger Arbeit für uns auf dem Weg zum Lachanfall.

von Sascha E. (baracuss)


Angehängte Dateien:

Lesenswert?

Entschuldigt bitte falsche Datei hier noch mal die C version.

von Karl H. (kbuchegg)


Angehängte Dateien:

Lesenswert?

Beenden wir das Trauerspiel, das tut ja schon körperlich weh.

* Wenn du nach jeder Zeile grundsätzlich eine Leerzeile einfügst,
  dann erreichst du hauptsächlich eines:
  Das sich dein Code in die Länge zieht.

  Übersicht gewinnst du so keine.

* Deine Kommentare kannst du größtenteils in die Tonne klopfen.
  Da steht genau dasselbe dort, was auch im Code auch schon steht.
1
          j=0;                    //Setze j auf 0
  No, na. Da hätte ich jetzt gedacht, dass j = 0 eine quadratische
  Gleichung löst.

* Nach einer Schleife brauchst du das j nicht mehr abfragen.
  Die Schleife hat bereits 80 Pulse erzeugt. Was willst du da
  noch großartig abfragen?

* Einen Pin frägt man anders ab. Du vergleichst 2 Konstante.
  Ungefähr so:
   if( 6 == 8 )
  das das keinen Sinn macht, wurde dir schon im anderen Thread
  erklärt.

* Wenn du auf etwas warten musst, dann wird wohl ein if nicht
  ausreichen. Ein if ist nun mal kein Schleifenkonstrukt. Da wird
  nichts wiederholt.
  Warten bedeutet aber nunmal ein Schleifenkonstrukt, dass dann
  abgebrochen wird, wenn eine bestimmte Bedingung eingetroffen ist.

* Die Warterei bei der Pulsgenerierung.
  Gut. Kann man so machen, muss man aber nicht. Wenn du sowieso
  warten willst (was schlecht ist) indem Zeit verbrutzelt wird,
  dann tut es auch ein stink normaler _delay_ms. Da muss man nicht so
  komplizierte Konstrukte mit einem Timer machen. Ist auch nicht
  genauer als ein hundsordinärer _delay_ms

von So nicht! (Gast)


Lesenswert?

Schade, der Faulpelz hat mal wieder gewonnen. :-(((

von Karl H. (kbuchegg)


Lesenswert?

So nicht! schrieb:
> Schade, der Faulpelz hat mal wieder gewonnen. :-(((


Warten wirs ab.
Das ist ja noch nicht alles :-)

Ausserdem hab ich ihm einen Fehler drinnen gelassen.

von So nicht! (Gast)


Lesenswert?

Zumal du was übersehen hast.
Nobody is perfect - even not a moderator. ;-)

von Karl H. (kbuchegg)


Lesenswert?

So nicht! schrieb:
> Zumal du was übersehen hast.
> Nobody is perfect - even not a moderator. ;-)

:-)  Der war schon Absicht.
Wenn er mit der konkreten Syntax zur Pin-Abfrage Schwierigkeiten hat, 
dann kann ich damit leben. Aber diesen Fehler muss er selber finden. er 
hat ihn ja auch selber eingebaut :-)

von So nicht! (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Der war schon Absicht.
Das kann ja jeder sagen. :-)

Is gut, ich geh ins Bett. ;-) SCNR

von So nicht! (Gast)


Lesenswert?

Und dann auch noch nachträglich klammheimlich seinen oberen Beitrag 
editieren und den Hinweis auf den Fehler einfügen. Betrug, 
Machtmissbrauch, Skandal! :-)

(Jetzt hör ich wirklich auf. Gute Nacht!)

von Karl H. (kbuchegg)


Lesenswert?

So nicht! schrieb:
> Und dann auch noch nachträglich klammheimlich seinen oberen Beitrag
> editieren und den Hinweis auf den Fehler einfügen. Betrug,
> Machtmissbrauch, Skandal! :-)


:-)

In Österreich gibts für solche Beschwerden eine Behörde.
"Geh doch aufs Salzamt!"

von Sascha E. (baracuss)


Lesenswert?

Erst mal dankeschön für die Hilfe werde mir die Datei mal ankucken und 
hoffe das ich den fehler finde.

Viellen Dank!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

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.