mikrocontroller.net

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


Autor: Oli (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo oli,

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

Otto

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oli (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Oli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Ralph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 */

Autor: Oli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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??

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oli (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist doch cool, so ne schnelle Uhr ...

Autor: CaH (Gast)
Datum:

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

Autor: Oli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.