PIC 16F627A Blinkprogramm spinnt?

OP #3983960
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
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 ?
OP
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?
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 ?
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.
OP
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?
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.
Gast
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:
Gast
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.
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
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
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:
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:
OP
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?
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 ;-)
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 ;-)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.