Forum: Mikrocontroller und Digitale Elektronik Lauflichtprogramm für PIC16F54 in C++


von Jan B. (jan-b)


Angehängte Dateien:

Lesenswert?

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

von Chris B. (dekatz)


Lesenswert?

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.

von Kevin (Gast)


Lesenswert?

Wie wäre es wenn du es auf einem Steckbrett aufbauen würdest?

von MaWin (Gast)


Lesenswert?

> 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.

von Jan B. (jan-b)


Lesenswert?

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
von Chris B. (dekatz)


Lesenswert?

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....

von kopfkratzer (Gast)


Lesenswert?

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 ?

von Michael G. (mjgraf)


Lesenswert?

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

von Michael G. (mjgraf)


Lesenswert?

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.

von Jan B. (jan-b)


Lesenswert?

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

von Max H. (hartl192)


Lesenswert?

Die configs am Anfang fehlen.
Hast du alles Richtig aufgebaut?
100nF zwischen Vss und Vdd?
Quarz mit Lastkondensatoren?
Pullup am Reset?

: Bearbeitet durch User
von MaWin (Gast)


Lesenswert?

> 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.

von Max H. (hartl192)


Lesenswert?

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
Noch kein Account? Hier anmelden.