Forum: Mikrocontroller und Digitale Elektronik PIC erste versuche (blinkled) mit 16F630 klappt nicht!


von Josep (Gast)


Lesenswert?

Hallo,
versuche gerade mit einem Olimex Board 
(https://www.olimex.com/Products/PIC/Proto/PIC-P14-20MHz/) ein Led 
blinken lasen.

IDE und Compiler von Microchip installiert, Proger ist ein Pickit3

Problem:

schreibe folgende Code:
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <pic16F630.h>
4
5
6
//Just simple delay
7
void Delay(unsigned long cntr) {
8
  while (--cntr != 0);
9
}
10
11
// main function
12
13
int main()
14
{
15
  unsigned char i;
16
17
  ANSEL = 0b00000000;            //All I/O pins are configured as digital
18
  CMCON0 = 0b00000111;           //Coperators turned OFF
19
  PORTC = 0x00;                  //write 0 to port C
20
  TRISC = 0x00;                  //set RC0 as output pin / set TRIS register BIT 0 to 0
21
22
  i = 0;
23
24
  // loop forever - echo
25
  while(1) {
26
27
    // Toggle led
28
    PORTC ^= 0x04;
29
    // Simple delay
30
    Delay(50000);
31
  }
32
}


aber der Compiler meldet folgende Fehler:

1
main.c:48: error: (192) undefined identifier "ANSEL"
2
make[2]: *** [build/default/production/main.p1] Error 1
3
make[1]: *** [.build-conf] Error 2
4
main.c:49: error: (192) undefined identifier "CMCON0"
5
make: *** [.build-impl] Error 2


was ist da falsch?

von Schnell (Gast)


Lesenswert?

Josep schrieb:
> #include <pic16F630.h>

wenn es der XC-Compiler ist, bitte ändern in
#include <pic.h>

CMCON0 bitte auch in CMCON ändern

Bisher halt nicht definiert.

von Josep (Gast)


Lesenswert?

Schnell schrieb:
> wenn es der XC-Compiler ist, bitte ändern in
> #include <pic.h>
>
> CMCON0 bitte auch in CMCON ändern

Ok beide Sachen geendert aber hängt jetzt noch an "ANSEL" Fehlermeldung 
ist jetzt:

1
(908) exit status = 1
2
make[2]: *** [build/default/production/main.p1] Error 1
3
make[1]: *** [.build-conf] Error 2
4
make: *** [.build-impl] Error 2
5
main.c:48: error: (192) undefined identifier "ANSEL"
6
make[2]: Leaving directory `E:/Microkontroller/PIC/Test Win8/led.X'
7
make[1]: Leaving directory `E:/Microkontroller/PIC/Test Win8/led.X'

von Martin (Gast)


Lesenswert?

ja weil der PIC16F630 kein ANSEL Rergister (kein AD Funktion) hat (nur 
der PIC16F676 wie im DS, P: 10 steht)

von Martin (Gast)


Lesenswert?

und CMCON0 => CMCON ändern

von Josep (Gast)


Lesenswert?

Martin schrieb:
> ja weil der PIC16F630 kein ANSEL Rergister (kein AD Funktion) hat (nur
> der PIC16F676 wie im DS, P: 10 steht)

Hmm... ok wie definiere ich in disem Fall die I/O's? nur mit
TRISC = 0x00; ?

von Josep (Gast)


Lesenswert?

Sorry mit CMCON ?

von Martin (Gast)


Lesenswert?

Da kein AD gibt sind alle IOs digital (vielleicht noch den Comparator 
configurieren) und es sollte funktionieren.
P.S.: der PIC16F630 hat nur 1K, das wird schnell mit der C 
Programmierung geschafft, also lieber mit Assembler anfangen.
Bei den 35 Befehlen ist es auch nicht kompliziert (Nur auf die 
Bankumschaltung achten!)

von Josep (Gast)


Lesenswert?

Martin schrieb:
> Da kein AD gibt sind alle IOs digital (vielleicht noch den Comparator
> configurieren) und es sollte funktionieren.

Ok Compilieren klappt jezt ABER blink kein LED ;-( warum jetzt?

Martin schrieb:
> P.S.: der PIC16F630 hat nur 1K, das wird schnell mit der C
> Programmierung geschafft, also lieber mit Assembler anfangen.

Danke für den Hinweis, möchte eingentlich mit Assembler nichts haben.

von Max H. (hartl192)


Lesenswert?

Josep schrieb:
> Hmm... ok wie definiere ich in disem Fall die I/O's? nur mit
> TRISC = 0x00; ?

Damit definierst du alle IOs als output.

Für den PIC16 würde ich auch ASM empfehlen. Für C würde ich den PIC18 
nehmen.

Josep schrieb:
> Ok Compilieren klappt jezt ABER blink kein LED ;-( warum jetzt?
Configs Richtig eingestellt?

Was ist wenn du in der main die LEDs nur einschaltest?

: Bearbeitet durch User
von Martin (Gast)


Lesenswert?

Josep schrieb:
> Martin schrieb:
> Ok Compilieren klappt jezt ABER blink kein LED ;-( warum jetzt?
=> Poste mal wieder dei Programm.

von Josep (Gast)


Lesenswert?

Max H. schrieb:
> Damit definierst du alle IOs als output.

Jap, habe ich oben schnell korrigiert:

Josep schrieb:
> Sorry mit CMCON ?

Max H. schrieb:
> Für den PIC16 würde ich auch ASM empfehlen. Für C würde ich den PIC18
> nehmen.

Ok aber für ein Led blinken lassen sollte reichen oder nicht?
Der PIC18 ist auch mit 14 Beinchen? sonst ist mein Board quasi um sonst 
;-(

von Max H. (hartl192)


Lesenswert?

Josep schrieb:
> Ok Compilieren klappt jezt ABER blink kein LED ;-( warum jetzt?
Das solltest du genaue spezifizieren: Was macht die LED, ist der Pin 
Ausgang oder hochohmig.

Mit welcher Frequenz arbeitet der PIC?

Und nochmal: Sind die Configs richtig eingestellt?

: Bearbeitet durch User
von bluppdidupp (Gast)


Lesenswert?

Der XC-Compiler kennt auch __delay_ms(x) und __delay_us(x)
(Nicht das er die Delay()-Funktion unter Umständen wegoptimiert ;D)

von Ro R. (rond_es)


Lesenswert?

Ist der LED-Jumper gesetzt auf dem Board?

von Josep (Gast)


Lesenswert?

Bin wieder da.
Also mit folgende einfache Code (denke ich), sollten alle PORTC-Pin's 
als Ausgang definiert sein und dann alle Ausgänge ein sein oder nicht?

Laut Schaltplan ist der LED auf PINC2 sollte dann AN sein, ist aber AUS.

1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <pic.h>
4
5
#define _XTAL_FREQ 20000000
6
7
8
#pragma config MCLRE = ON, CP = OFF, CPD = OFF, BOREN = OFF, WDTE = OFF
9
#pragma config PWRTE = OFF, FOSC = INTRCIO
10
11
// main function
12
void main( void ) {
13
14
15
  INTCON   = 0x0;      // Disable inerupt
16
  WPUA   = 0x0;      // pull-up disable
17
  CMCON   = 0x07;            // port as Digital IO
18
  //TRISC2   = 0;      // Led pin as output
19
  TRISC   = 0x0;      // alle Ports als Ausgang def.
20
        
21
  PORTC = 0x1111111;   // alle Ausgänge einschalten
22
23
  while(1) {
24
          
25
  }
26
}

von Ro R. (rond_es)


Lesenswert?

Ja, aber gemäss Schaltplan leuchtet die LED wenn die Outputs aus sind, 
weil die LED sinking angeschlossen ist. Damit die LED leuchtet muss der 
Strom in den Port fliessen, also der Output low sein.

von Martin (Gast)


Lesenswert?

- Ist der (LED) Jumper gesetzt?
- Kannst du das Programm debuggen? oder ist es nur ein programmiergerät?

von Max H. (hartl192)


Lesenswert?

Also den LED-Jumer setzen und PORTC=0x00; schreiben.

von Josep (Gast)


Lesenswert?

Ro R. schrieb:
> Ja, aber gemäss Schaltplan leuchtet die LED wenn die Outputs aus sind,
> weil die LED sinking angeschlossen ist. Damit die LED leuchtet muss der
> Strom in den Port fliessen, also der Output low sein.

ja mit 0x0000000 sollte dann leuchten, leuchtet nicht.

Martin schrieb:
> - Ist der (LED) Jumper gesetzt?

ist gesetzt

> - Kannst du das Programm debuggen? oder ist es nur ein programmiergerät?

bin noch überfragt!

Max H. schrieb:
> Also den LED-Jumer setzen und PORTC=0x00; schreiben.

schon gemacht und nichts

von Josep (Gast)


Lesenswert?

Ok, irgendwie ist der PIC hinüber, habe ein anderes genommen Programm 
geflash und LED brennt.

Herzlizen Dank für die nette Hilfe.

von Josep (Gast)


Lesenswert?

NACHTRAG:

Der PIC ist doch in Ordnung! das Flash Program "MPLAB IPE" hat nen "hold 
in reset" funktion und war gesetzt, ich vermute das hat den µC in reset 
gehalten.

Mit dem Code hier sehe mein LED ganz schön blinken:
1
#include  <pic.h>
2
3
// ext reset, no code protect, no brownout det ect, no watchdog,
4
// power - up timer enabled, int RC clock
5
#pragma config MCLRE = ON, CP = OFF, CPD = OFF, BOREN = OFF, WDTE = OFF
6
#pragma config PWRTE = OFF, FOSC = INTRCIO
7
8
9
//Just simple delay
10
void Delay(unsigned long cntr) {
11
  while (--cntr != 0);
12
}
13
14
15
int main()
16
{
17
              
18
  CMCON = 0b00000111;            // port as Digital IO
19
  
20
  TRISC = 0x00;                  // alle Ports als Ausgang def.
21
  PORTC = 0x00;                  //write 0 to port C
22
23
24
  while(1) {
25
26
    // Toggle led
27
    PORTC ^= 0x04;
28
    // Simple delay
29
    Delay(2000);
30
  }
31
}

Vielen Dank!

von Max H. (hartl192)


Lesenswert?

Das erklärt auch warum niemand hier den Fehler gefunden hat.

von Josep (Gast)


Lesenswert?

Max H. schrieb:
> Das erklärt auch warum niemand hier den Fehler gefunden hat.

Jap, Software ist ein wenig gewöhnungsbedürftig, es gibt ein extra 
Software für's flashen (da ist diese "holt reset" funktion) aber das IDE 
hat auch so eine Funktion.

von Michael S. (rbs_phoenix)


Lesenswert?

Martin schrieb:
> P.S.: der PIC16F630 hat nur 1K, das wird schnell mit der C
> Programmierung geschafft, also lieber mit Assembler anfangen.
> Bei den 35 Befehlen ist es auch nicht kompliziert (Nur auf die
> Bankumschaltung achten!)

Ich programmiere mittlerweile nur noch in C. Und doch kriege ich es 
immerwieder hin einen kleinen PIC nutzen zu können.

Man müsste sich mal die Mühe machen und ein Programm in C als auch in 
ASM zu schreiben. Dann könnte man mal vergleichen ob der/die C-Compiler 
wirklich so viel schlechter sind. Ich hab mir mal spaßeshalber ein paar 
vom Compiler erstellte asm-Dateien angeguckt. Nicht viel anders als ich 
es gemacht hätte. Im Gegenteil: Der Compiler hat schon n paar Kniffe 
drauf, was ich umständlicher gemacht hätte. Naja. Ansichtssache. Ich 
komme damit aus und sollte es doch mal eng werden, spare ich mir ein 
bisschen Code oder nehme den nächst größeren PIC.

von Max H. (hartl192)


Lesenswert?

Welches Programmiergerät hast du?
Ich habe das PICkit (2&3) bis jetzt 3 Jahren lang Problemlos aus MPLAB 
(ohne X) verwendet.

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