Forum: Mikrocontroller und Digitale Elektronik Probleme beim Compilieren von .c zu .hex


von Oli (Gast)


Angehängte Dateien:

Lesenswert?

Hallo, ich habe mein erstes PIC-Programm (Steuerung einer Binäruhr) 
geschrieben, habe aber Probleme es zum HEX-File zu Compilieren.

Geschrieben habe ich das Programm in C (hätte man wahrscheinlich viel 
kompakter schreiben können, aber ist wie gesagt mein erstes 
PIC-Programm).

Beim Compilieren mit CC5X (student version) in MPLAB erhalte ich immer 
folgende Fehlermeldung:

Error[1] C:\Programme\CC5X\16F872.H 3 : Duplicate chip definition
 (Multiple chip definitions detected (option -p<chip> and #include 
<header.h>).The #include statement should be removed)

Wenn ich den Header "#include <16F872.H>" weglasse, dann kommen 
massenweise Fehler, dass die Eingänge und Ausgänge nicht definiert 
seien.
Hab keine Ahnung ob irgendwas an meinem geschriebenen Programm falsch 
ist oder ob ich mit dem Compiler irgendwas falsch mache.


Für Tipps wäre ich sehr Dankbar!

Oli

von Otto (Gast)


Lesenswert?

Hallo oli,

die Binärausgabe geht auch deutlich einfacher...... wie sieht denn die 
".h" - Datei aus?

Otto

von holger (Gast)


Lesenswert?

> (Multiple chip definitions detected (option -p<chip> and #include
><header.h>).The #include statement should be removed)

Dann steht bei "option -p<chip>" in MPLAB ein anderer Prozessor
als 16F872 drin.

von holger (Gast)


Lesenswert?

Nur mal so nebenbei, der Code wurde nicht für CC5x
geschrieben.

TRISA0 = 1; //unbekannt

TRISA.0 = 1; // ist besser

  while(true) //unbekannt

  while(1) // ist besser

 RB2 = 0; //unbekannt
 PORTB.2 = 0; // ist besser

Das zieht sich komplett durch den Code.

von Oli (Gast)


Angehängte Dateien:

Lesenswert?

Oh achso, ich wusste nicht dass verschiedene Compiler auch verschiedenen 
Code benutzen. Habe mir verschiedene fertige Programme angeschaut und 
mir daraus den Code zur Ansteuerung der Ein- und Ausgänge 
zusammengereimt.
Dann versuche ich mal, das Programm entsprechend zu ändern.

Wo finde ich denn in MPLAB die "option -p<chip>"? Habe am Anfang bei 
'Project Wizard' den Pictyp eingestellt.

von Oli (Gast)


Lesenswert?

So, habe das Programm jetzt nach den Vorschlägen von holger 
umgeschrieben, jetzt scheint das Compilieren (prinzipiell) zu 
funktionieren. Allerdings kommt nun folgende Meldung:

Error[1] C:\Dokumente und Einstellungen\Oliver Pohl\Desktop\main.c 937 : 
Code size exceeded (FREE compiler limitation)

So groß ist das Programm doch eigentlich nicht, dass es über die Grenze 
der Demoversion hinausgeht, oder? Kann man das irgendwie umgehen oder 
evtl. etwas Code einsparen?

von Ralph (Gast)


Lesenswert?

lass den Müll weg :

    if(sekunde == 0)
     .
     .



und schreib es so :
PORTB = (sekunde & 0x3f); /* 0x3f = 0b111111 */
und entspreched für Minute und Stunde

Wie hast du die Pins nummeriert ?
RB0 --> RB7 oder
RB1 --> RB8 ; in diesem Fall :PORTB = ((sekunde & 0x3f)<1); /* 0x3f = 
0b111111 */

von Oli (Gast)


Lesenswert?

RA1 bis RA5 für Stunden, RB1 bis RB6 für Minuten und RC1 bis RC6 für 
Sekunden (Sind jeweils nur 6 LEDs, soll eine echte Binäruhr werden, 
nicht mit BCD's für jede Ziffer).
Wäre das dann für die Minuten entsprechend PORTC = ((minute & 0x3f)<1); 
und für die Stunden PORTC = ((stunde & 0x3f)<1); ?
Und diese 3 Zeilen bewirken genau das, was meine 500 Zeilen machen??

von holger (Gast)


Lesenswert?

>und für die Stunden PORTC = ((stunde & 0x3f)<1); ?
>Und diese 3 Zeilen bewirken genau das, was meine 500 Zeilen machen??

Nein, weil sie falsch sind :(

PORTB &= 0x81; // PB1-PB6 auf 0 setzen, PB0 und PB7 beibehalten
PORTB |= (sekunde << 1); // PB1-PB6 auf Sekundenwert setzen

Damit spartst du dir alle "if(sekunde == wert)".

Das machst du dann ähnlich für PORTC und PORTA.

von Oli (Gast)


Angehängte Dateien:

Lesenswert?

Wunderbar, jetzt hat das Compilieren funktioniert, danke!
Die Uhr läuft auch soweit, allerdings vieeeel zu schnell. Die Sekunden 
verticken so schnell, dass man die ersten LED-Stellen garnicht mehr 
blinken sieht.
Was könnte ich denn falsch gemacht haben? Für den Takt habe ich einen 
Quarz mit 4,194304 Mhz benutzt.

von Tom (Gast)


Lesenswert?

Ist doch cool, so ne schnelle Uhr ...

von CaH (Gast)


Lesenswert?

Du musst die Zeit schon normieren...
Praktisch ist da immer ein ms-Timer ;)

von Oli (Gast)


Lesenswert?

Wie normiere ich die denn? Kann ich nicht einfach über einen Befehl auf 
die Frequenz des Quarz zugreifen und die dann auf 1Hz runterteilen?

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.