Moin, ich schreibe demnächst meine Facharbeit im bereich Informatik zum Thema Mikrocontroller und habe mir die Aufgabe ausgesucht, ein Lauflicht zu Programmieren. Die verwendeten LED´s sollen dabei der Reihe nach aufleuchten und wieder ausgehen. Nun ist allerdings mein Problem, dass ich im Programmieren mit C++ noch nicht altso sicher bin und wollte deshalb euch mal fragen, ob dieser Code funktioniert, ob ihr verbesserungen habt, oder was ich falsch gemacht hab usw. Der code bezieht sich auf einen PIC16F54, die pinbezeichnung steht im anhang. Der code ist folgender: #include <avr/io.h> #ifndef F_CPU #define F_CPU 4000000UL #endif #include <util/delay.h> int main(void) { DDRA=0b00001111 DDRB=0b00111111 while(1) { PORTA=0b00000011 _delay_ms(175) PORTA=0b00000110 _delay_ms(175) PORTA=0b00001100 _delay_ms(175) PORTA=0b00001000 PORTB=0b00000001 _delay_ms(175) PORTA=0b00000000 PORTB=0B00000011 _delay_ms(175) PORTB=0b00000110 _delay_ms(175) PORTB=0b00001100 _delay_ms(175) PORTB=0b00011000 _delay_ms(175) PORTB=0b00110000 _delay_ms(175) PORTB=0b00100000 PORTA=0b00000001 _delay_ms(175) } } Vielen dank schonmal für eure Meinung. MFG Jan
Hmmmm...möchtest du einen PIC oder einen AVR programmieren??? Ich frage nur wegen dem hier: include <avr/io.h> und dem: DDRA=0b00001111 DDRB=0b00111111 Das hat mit PIC nicht viel zu tun. Sollte DDRA und DDRB ein "Synonym" für TRISA und TRISB für den PIC sein, dann wird das Programm nicht funkteonieren. Bei PORTA sind nämlich PA0...PA3 als Eingang und bei PORTB ist PB0...PB ebenfalls auf Eingang gestellt.
Wie wäre es wenn du es auf einem Steckbrett aufbauen würdest?
> Der code ist folgender Das ist kein C++, sondern stinknormales C, bei dem zudem tausende von Semikolons fehlen, und nicht für einen PIC, sondern für einen AVR, ausserdem liesse sich das eleganter mit einer Schleife erledigen. Ich denke, du wiederholst den Kurs besser nochmal.
Chris B. schrieb: > Hmmmm...möchtest du einen PIC oder einen AVR programmieren??? > Ich frage nur wegen dem hier: > include <avr/io.h> > und dem: > DDRA=0b00001111 > DDRB=0b00111111 > > Das hat mit PIC nicht viel zu tun. > > Sollte DDRA und DDRB ein "Synonym" für TRISA und TRISB für den PIC sein, > dann wird das Programm nicht funkteonieren. Bei PORTA sind nämlich > PA0...PA3 als Eingang und bei PORTB ist PB0...PB ebenfalls auf Eingang > gestellt. OK, danke, also muss ich nur das DDRA/B in TRISA/B ändern, damit es läuft? Sieht sonnst noch wer Probleme? @ Kevin (Gast): Die Schaltung dafür bau ich mir warscheinlich morgen, da ich noch nich dazu gekommen bin... @ MaWin (Gast): welcher Kurs? :) ja stimmt die simikolons fallen mir jetzt erst auf und für das mit c oder c++ entschuldige ich mich, ich hab kaum ahnung^^
:
Bearbeitet durch User
Jan Bankonier schrieb: > also muss ich nur das DDRA/B in TRISA/B ändern, damit es läuft? Nein tut ist es nicht und ich würde dir dringend empfehlen dir das Datenblatt runterzuladen - ich weiss nämlich nicht ob dieser Steinzeit-PIC auch Analogkomponenten hat und dann ist bei der Initialisierung einiges mehr zu beachten....
kopfkratz Mal in Deinen Studien-Unterlagen nachsehen da müsste sowas drinstehen: 1. Schaltung auf Papier zeichnen 2. benötigte Bauteile bestimmen 3. Bauteile besorgen 4. Datenblätter der Bauteile durchlesen 5. Nach Herstellerangaben aus dem Datenblatt die Schaltung aufbauen 6. Passende IDE herunterladen 7. µC nach Herstellerangaben mit der IDE programmieren 8. Schaltung mit Programm testen 9. Fehlersuche 10. Freuen wenn's richtig funktioniert Oder fehlt da noch ein Punkt ?
kopfkratzer schrieb: > 2. benötigte Bauteile bestimmen > 3. Bauteile besorgen > 4. Datenblätter der Bauteile durchlesen 2. benötigte Bauteile bestimmen 3. Datenblätter der Bauteile durchlesen 3a. Wenn's doch nicht passt, zurück zu 2 4. Bauteile besorgen
Jan Bankonier schrieb: > Moin, ich schreibe demnächst meine Facharbeit im bereich Informatik Welche Schulform, welches Bundesland? Nach dem Codebeispiel kann man eigentlich nur hoffen, dass Dein Lehrer die Facharbeit nicht akzeptiert und Dich nacharbeiten lässt. Wer seine Facharbeit in Informatik schreibt, sollte zuallermindest verstanden haben, was Schleifen sind und wie man sie einsetzt. Und wenn sich jemand (ich nehme mal an, freiwillig) für "etwas mit Mikrocontrollern" entscheidet, hätte ich eigentlich auch eine ereignisgesteuerte Lösung mit Timerinterrupt erwartet -- plus einer kleinen Betrachtung, was der Controller nebenbei alles noch tun könnte, weil ihn ein Lauflicht nun einmal gar nicht auslastet.
Gut, vielleicht kamm es etwas falsch rüber, ich bin zurzeit in der 10. Klasse Gymnasium und im Informatikunterricht haben wir was das Programmieren angeht gerade einmal die anfänge von HTML gelernt. Deshalb hab ich von der Schulseite aus keine Erfahrungen. Ich habe dieses Thema mir ausgesucht, da ich eigentlich irgentwas praktisches mit Hardware machen wollte,da aber alle Physiklehrer schon vergeben waren bin ich zu Informatk gegangen. Dort war denn der bestmögliche bogen der Mikrocontroller und ich wollte mich eh über dieses bis dato neuland informieren. - Ich weiß, dass war nicht gerade das schlauste, aber egal. Nun habe ich meine aufgaben und erfülle die so gut es geht. Dieser Quellcode entstand nach kurzer zeit und ich wollte eigentlich nur von euch wissen, was genau alles falsch ist und wie es hätte richtig sein müssen. Mir ist auch bewust, dass ein lauflicht einen Mikrocontroller nicht auslastet, und auch, dass ich schleifen verwenden kann. Dies wäre der Nächste Schritt und ich wollte erstmal nur wissen, wie es um diesen Teilabschnitt steht. Die Materialien hatte ich bereits alle da, und eine neubestellung ist mir zu teuer. Deshalb der gerne veraltete PIC16F54. Ich bitte euch daher um konstrucktive Kritik. MFG Jan
Die configs am Anfang fehlen. Hast du alles Richtig aufgebaut? 100nF zwischen Vss und Vdd? Quarz mit Lastkondensatoren? Pullup am Reset?
:
Bearbeitet durch User
> Dieser Quellcode entstand nach kurzer zeit Quatsch, den hast du irgendwoher kopiert, für einen anderen Prozessor, für eine andere Platine, und dann leidlich ein paar Befehle hin und her kopiert. Der Ansatz ist zwar richtig, aber man fängt schlauerweise mit einem Programm an, welches bekanntermassen funktioniert. > Nun habe ich meine aufgaben und erfülle die so gut es geht. Dann such erst mal ein C Quelldatei mit einem Programm welches bekanntermassen auf deiner PIC16F54 Platine läuft, vielleicht ein Programm welches eine LED blinken lässt, oder was sonst als Beispielprogramm existiert. Dann übersetze es, lade es auf den uC, und guck ob es arbeitet. Dann hast du erst mal den ersten Schritt hinbekommen und weisst, wenn nach einer Änderung von dir etwas nicht funktioniert, beispielsweise das Überstzen oder der Programmlauf, daß du in diesem Schritt einen Fehler gemacht hast, und kannst zurück auf den Punkt, an dem es noch ging. ... mach also dein Programm von oben, nur diesmel richtig ... Das überpringe ich jetzt mal. Dieser Code PORTA=0b00000011 _delay_ms(175) PORTA=0b00000110 _delay_ms(175) PORTA=0b00001100 _delay_ms(175) PORTA=0b00001000 PORTB=0b00000001 _delay_ms(175) PORTA=0b00000000 PORTB=0B00000011 _delay_ms(175) PORTB=0b00000110 _delay_ms(175) PORTB=0b00001100 _delay_ms(175) PORTB=0b00011000 _delay_ms(175) PORTB=0b00110000 _delay_ms(175) PORTB=0b00100000 PORTA=0b00000001 _delay_ms(175) lässt sich in 4 Zeilen zusammenpacken (eine davon das delay, zwei die PORT Zugriffe, und die dritte kann ein for sein oder ein shift. Du weisst also: Der weg zu einer guten Lösung ist nocht weit.
Du könntest dir dieses Tutorial anschauen: http://youtu.be/9aSL_FAF-Gg http://www.youtube.com/watch?v=x5PZDOp-148
:
Bearbeitet durch User
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.