Forum: Mikrocontroller und Digitale Elektronik PIC 16F627A Blinkprogramm spinnt?


von Joh R. (joh525)


Lesenswert?

Nachdem mir zum Thema Start mit Mikrocontrollern hier schon einmal sehr 
hilfreich weitergeholfen wurde, hab ich nun mehr oder weniger 
erfolgreich einen PIC 16F627A zum laufen gebracht. Es soll einfach eine 
LED, die mit einem Vorwiederstand an RA0 angeschlossen ist, blinken. Tut 
sie auch, nur irgentwann hört sie einfach auf zu blinken und geht aus, 
bis sie dann irgentwann weiterblinkt. Ich hab mir schon gedacht dass 
vielleicht mein Steckbrett nen Wackelkontakt oder sowas hat also hab ich 
ein neues genommen, nur das Problem besteht weiterhin.

Die Schaltung besteht aus dem PIC, einem 4 MHz Quarz das an OSC1 und 
OSC2 angeschlossen ist, jeweils ein 18p kondensator von jedem Pin des 
Quarzes zur Masse und eben die LED mit Wiederstand an RA0. Der Code ist 
mit MPLABX IDE v2.00 geschrieben, ich verwende den XC9 Compiler und das 
Pickit 3, welches die Schaltung auch mit 5v versorgt.
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <xc.h>
4
5
6
#pragma config FOSC = XT        // Oscillator Selection bits (XT oscillator: Crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
7
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
8
#pragma config BOREN = OFF      // Brown-out Detect Enable bit (BOD disabled)
9
10
#define _XTAL_FREQ 4000000
11
12
int main(int argc, char** argv) {
13
14
    TRISA = 0x00;
15
16
    while(1){
17
   
18
    PORTAbits.RA0 = 1;
19
    _delay(100000);
20
    PORTAbits.RA0 = 0;
21
    _delay(100000);
22
23
    return (EXIT_SUCCESS);
24
}
25
}

das ist der c Code, ich hoffe ich hab keine wichtige Information 
vergessen.

Ich hätte auch noch ein paar Fragen bezüglich des Codes, und zwar ob ich 
das _XTAL_FREQ überhaupt brauche wenn ich einen externen Takt verwende 
(die LED blinkt auch ohne xtal) und warum die __delay_ms(x); Funktion 
nicht geht, funktioniert die bei PIC 16 überhaupt nicht oder hab ich was 
falsch gemacht?

danke schonmal
Joh

von Kai (Gast)


Lesenswert?

lass das  return (EXIT_SUCCESS); auf der while schleife weg ;)

von Volker S. (vloki)


Lesenswert?

Die Templates sind eigentlich nicht für deinen Compiler geeignet !

#include <stdio.h>      löschen
#include <stdlib.h>     löschen

(nur xc.h)

int main(int argc, char** argv) -> void main(void)

und wie Kai schon erwähnt hat, KEIN return in main !
(auch nicht außerhalb der while(1) Schleife)

Wegen der delay... Funktionen: Was sagt denn der User Guide ?

: Bearbeitet durch User
von Joh R. (joh525)


Lesenswert?

ok ich mal rausgemacht was nicht reingehört (war in dem Tutorial was ich 
gesehen habe halt drin, und der hat auch den XC8 verwendet)

Volker SchK schrieb:
> Was sagt denn der User Guide ?

der user guide vom PIC oder vom XC8? ich weiß nicht so recht wo ich da 
suchen soll...


und wenn ich den Pic ohne pickit betreiben will, muss ich doch einfach 
nur VDD und VSS an 5v anschließen oder?

von Volker S. (vloki)


Lesenswert?

Joh R. schrieb:
> der user guide vom PIC oder vom XC8? ich weiß nicht so recht wo ich da
> suchen soll...

Also der User Guide vom PIC heißt Data Sheet und da sind keine 
Beschreibungen von Funktionen irgendwelcher Compiler drin!

Wenn du den PIC im Debug Modus programmiert hast, dann läuft der nicht 
ohne das PicKit.

Joh R. schrieb:
> Die Schaltung besteht aus dem PIC, einem 4 MHz Quarz das an OSC1 und
> OSC2 angeschlossen ist, jeweils ein 18p kondensator von jedem Pin des
> Quarzes zur Masse und eben die LED mit Wiederstand an RA0.

Da fehlt noch ein 100nF Blockkondensator am VDD Pin nach Ground!
Was hast du mit dem MCLR Pin gemacht, hängt der ohne Pickit in der 
Luft ?

: Bearbeitet durch User
von Max H. (hartl192)


Lesenswert?

Joh R. schrieb:
> der user guide vom PIC oder vom XC8? ich weiß nicht so recht wo ich da
> suchen soll...
Vom XC8, der PIC an sich kennt keine C, nur ASM oder um genau zu sein 
Maschinensprache. Der XC8 übersetzt den C-Code (inkl. delay) dann in 
Maschinensprache.
> und wenn ich den Pic ohne pickit betreiben will, muss ich doch einfach
> nur VDD und VSS an 5v anschließen oder?
Vss kommt an 0V, am /MCLR Pin sollte noch ein Pullup sein.

Joh R. schrieb:
> Die Schaltung besteht aus ...
Ein kompletter Schaltplan nicht in Prosa wäre besser.

> und zwar ob ich
> das _XTAL_FREQ überhaupt brauche wenn ich einen externen Takt verwende
Ja, damit sagst du dem Compiler für welche Oszillatorfrequenz er die 
Delay-Schleifen berechnen soll.

: Bearbeitet durch User
von Joh R. (joh525)


Lesenswert?

also es funktioniert jetzt soweit alles danke :) nur irgentwie nicht 
ohne das Pickit, also wenn ich die Schaltung an 5v anschließe, leuchtet 
die LED nur.

Volker SchK schrieb:
> Was hast du mit dem MCLR Pin gemacht, hängt der ohne Pickit in der
> Luft ?

der ist mit einem 10k Widerstand mit +5v verbunden (10k hab ich mal bei 
einer Beispielschaltung gesehen) stimmt der Wert für den Pic überhaupt? 
Wie find ich denn raus was für einen Widerstand ich brauch, im 
Datenblatt hab ich nichts dazu gefunden (oder war ich nur zu doof zum 
suchen?) und liegt es an dem MCLR dass die LED nur leuchtet?

von Max H. (hartl192)


Lesenswert?

Joh R. schrieb:
> stimmt der Wert für den Pic überhaupt?
Ja
> Wie find ich denn raus was für einen Widerstand ich brauch
Nicht so wichtig, ist nur ein Pullup, ich nehme immer irgendwas zischen 
10k und 100k, je nachdem was da ist.

Post mal einen richtigen Schaltplan, der deinem Aufbau entspricht.

: Bearbeitet durch User
von Volker S. (vloki)


Lesenswert?

Joh R. schrieb:
> also es funktioniert jetzt soweit alles danke :) nur irgentwie nicht
> ohne das Pickit, also wenn ich die Schaltung an 5v anschließe, leuchtet
> die LED nur.

NOCHMALK die Frage: "Hast du den PIC im Debug Mode programmiert ?"

(oder Release, Button mit einen grünen Pfeil der nach unten zeigt)

: Bearbeitet durch User
von Joh R. (joh525)


Lesenswert?

Volker SchK schrieb:
> NOCHMALK die Frage: "Hast du den PIC im Debug Mode programmiert ?"
>
> (oder Release, Button mit einen grünen Pfeil der nach unten zeigt)

oh sorry die Frage hab ich wohl übersehen, ich programmier den wohl im 
Release, also der Knopf mit dem grünen Pfeil der nach unten auf so nen 
chip zeigt

von Klaus (Gast)


Angehängte Dateien:

Lesenswert?

Joh R. schrieb:
> der ist mit einem 10k Widerstand mit +5v verbunden (10k hab ich mal bei
> einer Beispielschaltung gesehen) stimmt der Wert für den Pic überhaupt?
> Wie find ich denn raus was für einen Widerstand ich brauch, im
> Datenblatt hab ich nichts dazu gefunden

Hat ja auch mit Prozessor nichts wirklich zu tun, sondern mit dem 
PICKIT.

Es gibt da ein Poster (auch als PDF), zu groß um es hier hochzuladen, 
abert ein Ausschnitt

MfG Klaus

von Max H. (hartl192)


Lesenswert?

Klaus schrieb:
> Hat ja auch mit Prozessor nichts wirklich zu tun, sondern mit dem
> PICKIT.
Wenn der Reset floatet und den Chip dadurch immer wieder resetet, hat 
das mit dem Chip sehr wohl was zu tun...

von Joh R. (joh525)


Angehängte Dateien:

Lesenswert?

Max H. schrieb:
> Post mal einen richtigen Schaltplan, der deinem Aufbau entspricht.

müsste so aussehen. Wenn ich alles am Pickit hängen hab blinkt die LED 
so wie sie soll, wenn ich die Schaltung ans Netzteil hänge, leuchtet sie 
nur noch, hab ich irgent ein Bauteil vergessen oder liegt der Fehler im 
Code?

von Max H. (hartl192)


Lesenswert?

Joh R. schrieb:
> hab ich irgent ein Bauteil vergessen
100nF Kerko zwischen Vdd und Vss, so nahe wie Moglich am Chip.

von Peter (Gast)


Lesenswert?

Joh R. schrieb:
> Wenn ich alles am Pickit hängen hab blinkt die LED
> so wie sie soll, wenn ich die Schaltung ans Netzteil hänge, leuchtet sie
> nur noch, hab ich irgent ein Bauteil vergessen oder liegt der Fehler im
> Code?

Stell mal von Debug auf Release um in MPLAB.

von Volker S. (vloki)


Lesenswert?

Joh R. schrieb:
> oh sorry die Frage hab ich wohl übersehen, ich programmier den wohl im
> Release, also der Knopf mit dem grünen Pfeil der nach unten auf so nen
> chip zeigt
Das mit dem 100nF hast du dann wohl auch übersehen.
(Stand genau daneben ;-)

Ok, wenigstens bist du im Release mode.
Was tust du genau ?

Ich würde vorschlagen, du deaktivierst die Versorgung über das PICKIT
und programmierst von Anfang an mit externer Versorgung.
Wenn das läuft, ziehst du das PICKIT ab und schaust, ob es weiter 
blinkt.
Wenn auch das funktioniert, dann schaltest du die Versorgung ab und 
wieder an und schaust, ob es wieder anfängt zu blinken.

Noch was - Spezifiziere IMMER ALLE Config Bits !
(Ist ja mit dem integrierten Tool wohl kein Akt)
1
#pragma config FOSC = XT
2
#pragma config WDTE = OFF
3
#pragma config PWRTE = ON
4
#pragma config MCLRE = OFF
5
#pragma config BOREN = OFF
6
#pragma config LVP = OFF
7
#pragma config CPD = OFF
8
#pragma config CP = OFF

: Bearbeitet durch User
von Toxic (Gast)


Angehängte Dateien:

Lesenswert?

Das Register COMCON wird bei einem Reset auf b0000 0000 gesetzt,was 
moeglicherweise das Problem ist.

Ich wuerde folgende Portinitialisierung vornehmen:


TRISA = 0x00;
COMCON = 0x03; => dadurch werden die Komparatoren deaktiviert.

Sowie Komparatoren aktiv sind ,sind die PortA-Pins teils auch in 
Analogmode(zumdindest sieht es so nach dem Datenblatt aus....)

von Toxic (Gast)


Lesenswert?

Aaargh - es muesste
COMCON = 0x07, sein.....

von Volker S. (vloki)


Lesenswert?

Toxic schrieb:
> Sowie Komparatoren aktiv sind ,sind die PortA-Pins teils auch in
> Analogmode(zumdindest sieht es so nach dem Datenblatt aus....)

Das "sollte" bei Nutzung als Ausgang keine Rolle spielen, aber schaden 
kann es auf keinen Fall, die Komparatoren ab zu schalten.

von Toxic (Gast)


Angehängte Dateien:

Lesenswert?

Volker SchK schrieb:
> aber schaden
> kann es auf keinen Fall

So sehe ich das auch ;-)
Ich hab die Komparatoren in meinen Projekten noch nie benoetigt,habe 
aber grundseatzlich die COMCON -Initialisierung vorgenommen (auch um 
Energie zu "sparen".
Sowie Komparatoren aktiv sind duerfen Analogsignale angelegt werden.Es 
sieht so aus als wenn COMCON-Anweisung den TRIASA-Befehl uebergeordnet 
sind - siehe Bild.

von Volker S. (vloki)


Angehängte Dateien:

Lesenswert?

Toxic schrieb:
> Es sieht so aus als wenn COMCON-Anweisung
> den TRIASA-Befehl uebergeordnet sind - siehe Bild.

Ich sehe nichts, meinst du das Bild ;-)
Nur über dem Bild steht:
>Figure 10-1 shows the eight possible modes.
>The TRISA register controls the data direction
>of the comparator pins for each mode.


Trotzdem, für alle Fälle COMCON (oder COMCONbits.CM) = 0x07;

Was machst du mit dem LVP config bit ?

: Bearbeitet durch User
von Joh R. (joh525)


Lesenswert?

Jaa es funktioniert endlich, danke für eure Hilfe :)

Volker SchK schrieb:
> Spezifiziere IMMER ALLE Config Bits !

daran lags wohl auch, dass die Schaltung nur mit dem Pickit funktioniert 
hat, LVP stand bei mir auf ON was die Ursache dafür war.

Toxic schrieb:
> COMCON = 0x03; => dadurch werden die Komparatoren deaktiviert.

es hat jetzt zwar auch ohne funktioniert, aber wenn ihr meint es wär 
besser würd ich es gerne mit reinnehmen, nur kommt immer wenn ich COMCON 
= 0x07; schreib, wird die Zeile als Fehler markiert und als Info darüber 
steht dran unable to resolve identifier COMCON, kennt der PIC 16 die 
Funktion nicht oder woran könnte das liegen?

von Chris B. (dekatz)


Lesenswert?

Joh R. schrieb:
> nur kommt immer wenn ich COMCON
> = 0x07; schreib, wird die Zeile als Fehler markiert und als Info darüber
> steht dran unable to resolve identifier COMCON, kennt der PIC 16 die
> Funktion nicht oder woran könnte das liegen?

Weil beim 16F627A das Register nicht COMCON (wie bei vielen neueren PIC) 
sondern CMCON heisst.
BTW: wenn du dir schon mal da Datenblatt angesehen hättest, wäre das 
wohl aufgefallen ;-)

von Joh R. (joh525)


Lesenswert?

Chris B. schrieb:
> BTW: wenn du dir schon mal da Datenblatt angesehen hättest, wäre das
> wohl aufgefallen ;-)

ja.. reingeschaut hab ich schon, da ich aber gerade erst mit den PICs 
angefangen hab, weiß ich noch nicht immer wo ich da überall in den 178 
Seiten suchen muss

von Max H. (hartl192)


Lesenswert?

Joh R. schrieb:
> weiß ich noch nicht immer wo ich da überall in den 178
> Seiten suchen muss
Wenn man sucht wie man den Komparator deaktiviert, sucht man im Kapitel
"10.0 COMPARATOR MODULE"

von Volker S. (vloki)


Lesenswert?

So schwer ist das doch nicht.
Wenn es darum geht einen Pin anzusteuern, dann schaut man eben in das 
entsprechende Kapitel.
5 1 PORTA and TRISA Registers

Wenn da der Komparator erwähnt wird, dann schaut man eben im 
entsprechenden Kapitel weiter.
10 0 COMPARATOR MODULE


14 1 Configuration Bits muss auch sein ;-)

<edit> zu langsam ;-)

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