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.
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){}
Achso, der Fehler sollte sich so beheben lassen: if(PIND & (1<<PD0)) { ... } analog für die anderen.
(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
(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.
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...
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.
Karl heinz Buchegger schrieb: > Es ist jetzt schwer zu entscheiden ob man dir hilft Ach, findest du?
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.
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.
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.
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.
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.
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.
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
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.
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.
Entschuldigt bitte falsche Datei hier noch mal die C version.
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
Schade, der Faulpelz hat mal wieder gewonnen. :-(((
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.
Zumal du was übersehen hast. Nobody is perfect - even not a moderator. ;-)
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 :-)
Karl heinz Buchegger schrieb: > Der war schon Absicht. Das kann ja jeder sagen. :-) Is gut, ich geh ins Bett. ;-) SCNR
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!)
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!"
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.