Lauflichtprogramm für PIC16F54 in C++

OP #3454377
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
Angehängte Dateien:
#3454401
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.
Gast #3454443
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.
OP #3454445
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^^
Gast #3454454
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 ?
#3454477
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.
OP #3454582
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
Gast #3455729
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren