PIC 16F627A Blinkprogramm spinnt?

#3983960
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
#3984099
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 ?
#3984165
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?
#3984175
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 ?
#3984192
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.
#3984748
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?
Gast #3985338
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
Angehängte Dateien:
#3985441
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?
Angehängte Dateien:
#3985520
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
Gast #3985588
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....)
Angehängte Dateien:
Gast #3985651
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.
Angehängte Dateien:
#3985688
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 ?
Angehängte Dateien:
#3986278
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?
#3986432
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 ;-)

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