Forum: Mikrocontroller und Digitale Elektronik PIC-Start Glückssache?


von Steffen (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Elektronikgemeinde,

Aus Verzweiflung wende ich mich an Euch. Ich weiss nicht mehr weiter und 
bräuchte ein drittes..viertes Auge, vielleicht seht ihr was ich nicht 
sehe.

Also, ich möchte ein Wecker-Programm in Hi Tech C schreiben. Zum 
Experimentieren verwende ich vorerst den PIC16F818 weil vorrätig. Aber 
soweit komme ich erst gar nicht, da sich der PIC nur sehr zufällig zur 
Arbeit überreden lässt (das gleiche Problem übrigens mit zwei anderen 
PICs 16F819,16F88). Ich verwende zur Fehlersuche untenstehendes simples 
Programm, welches einfach nur Ausgänge invertieren soll um Lebenszeichen 
zu geben.

RA0 toggel bei TMR0 überlauf
RA1 toggel bei input chaange auf RB5
RA2 toggel nach jedem aufrauf in der hauptschleife

Das Problem ist nun dass der PIC nach dem Programmieren oder 
Anschliessen der Versorgungsspannung nicht startet. Es wird zwar immer 
der interne Oszillatortakt am Pin RB6/OSC2 ausgegeben (wie im CONFIG 
WORD definiert), aber die anderen Ausgänge schweigen. Was komischerweise 
Abhilfe schafft ist bei eingeschalteter Versorgungsspannung den 
kompletten PIC aus dem Sockel zu nehmen und wieder aufzustecken .. dann 
läuft das Programm zu 50% wie erwartet und die Ausgänge RA0,RA1,RA2 
reagieren wie erwartet???

Ich verwende übrigens das Pickit 3 mit MPLAB 8.6 und bekomme weder beim 
Compilen noch beim Programmieren irgendwelche Warnungen oder Fehler!

Kleiner Schaltplan im Anhang, allerdings nichts wirklich besonderes.


Und hier der Programmcode:
1
//////////////
2
// includes //
3
//////////////
4
5
#include <pic.h>
6
#include <pic16f81x.h>
7
8
9
10
///////////////////////
11
// chipconfiguration //
12
///////////////////////
13
14
__CONFIG(0x2f31);
15
16
17
18
/////////////////
19
// definitions //
20
/////////////////
21
22
23
24
//////////////////////
25
// global constants //
26
//////////////////////
27
28
const unsigned char TMR0LOAD_1MS = 0x84;
29
30
31
32
//////////////////////
33
// global variables //
34
//////////////////////
35
36
37
38
////////////////////
39
// initialisation //
40
////////////////////
41
42
//setup
43
void setup(void){
44
  OPTION = 0b00000010;
45
  INTCON = 0b10101000;
46
  PIE1 = 0b00000000;
47
  PIR1 = 0b00000000;
48
  PIE2 = 0b00000000;
49
  PIR2 = 0b00000000;
50
  PCON = 0b00000011;
51
  OSCCON = 0b01100000;
52
  CCP1CON = 0b00000000;
53
  SSPCON = 0b00000000;
54
  ADCON0 = 0b00000000;
55
  ADCON1 = 0b00000110;
56
  TRISA = 0b00000000;  
57
  TRISB = 0b00100000;
58
  PORTA = 0b00000000;  
59
  PORTB = 0b00000000;
60
  }
61
62
//init
63
void init(void){
64
  TMR0 = TMR0LOAD_1MS;
65
  }
66
67
68
69
///////////////////////
70
// interrupt routine //
71
///////////////////////
72
73
void interrupt isr(void){
74
  if (TMR0IF){
75
    TMR0IF = 0;
76
    TMR0 = TMR0LOAD_1MS;
77
    RA0 = !RA0;
78
    }
79
  if (RBIF){
80
    RBIF = 0;
81
    RA1 = !RA1;
82
    }  
83
  }
84
85
86
87
///////////////
88
// functions //
89
///////////////
90
91
92
93
//////////////////
94
// main program //
95
//////////////////
96
97
void main(void){
98
  setup();
99
  init();
100
  while(1){
101
    RA2 = !RA2;
102
    }  
103
  }

von Carsten S. (dg3ycs)


Lesenswert?

Hi,

Ohne jetzt deine Config_Bits im einzelnen Aufzudröseln:

Programm im RElease Modus und nicht im Debug Modus erstellt?
(Im Debug mode muss ein explizites Startkomando kommen!)

In MPLAB nicht per Einstellung auf "Anhalten" gestellt?
Es liegt wirklich +UB an !MCLR an? (Nachmessen! Zeichnung sagt ja)

Prüfe das mal...
Ich würde ja auf einen versehentlichen "DebugBuild" tippen ;-)

Gruß
Carsten

von Steffen (Gast)


Lesenswert?

Hey Carsten,

Danke schonmal für den ersten Hinweis. Also wenn Du das Dropdown Feld in 
der Menüleiste meinst, das stand tatsächlich auf Debug! Hatte da noch 
nie drauf geachtet. Leider hat es nur einen kleinen Effekt. Das Programm 
startet jetzt zu gefühlten 90% nach der "Aus dem Sockel 
entfernen"-Methode, bei normalem Anlegen der Versorgungsspannung 
allerdings immer noch nicht. Oder muss ich den Release Mode noch wo 
anders definieren?

Wo genau finde ich die Einstllung "Anhalten" und was hat diese zu 
bedeuten?

!MCLR hat 5V.

Das Config Word ist ausgeschlüsselt:

Bit      Wert  Funktion
13       1     Program Memory Code Protection OFF
12       0     CCP1 function on RB3 (unrelevant)
11       1     In-Circuit Debugger DISABLED
10,9     1,1   Program Memory Write Protection OFF
8        1     EE Memory Code Protection OFF
7        0     Low-Voltage Programming DISABLED
6        0     Brown-out Reset DISABLED
5        1     RA5/MCLR/VPP pin function is MCLR
3        0     Power-up Timer ENABLED
2        0     Watchdog Timer DISABLED
4,1,0    1,0,1 INTRC oscillator; CLKO function on RA6/OSC2/CLKO pin


Gruß zurück

von togo (Gast)


Lesenswert?

Mach mal die diode raus und häng den Pullup an die Versorgung.

von Carsten S. (dg3ycs)


Angehängte Dateien:

Lesenswert?

togo schrieb:
> Mach mal die diode raus und häng den Pullup an die Versorgung.

Das dürfte keinen Einfluss haben wenn er nicht gerade eine Selendiode 
aus den 40Jahren verwendet hat ;-) Ist so schon in der AN vorgesehen. 
(Um nicht die ganze schaltung beim Programmieren rückzuspeisen!)

Steffen schrieb:
> Oder muss ich den Release Mode noch wo
> anders definieren?

NAja, anders definieren ist evtl. das Falsche Wort...
Das Programm MPLAB hat zwei völlig unterschiedliche Betriebsmodi. Einmal 
den DEBUG Modus und einmal den normalmodus.

Du wechselst den Modus in dem du entweder dein TOOL (PicKit) über den 
Menüpunkt Debugger oder den Menüpunkt Programmer auswählst.

ICh habe mal zwei Bilschirmfotos (in einer Datei) angehangen.
Der obere Teil zeigt MPLAB im "DEBUGMODUS" hier gibt es noch 
Schaltflächen explizit für Start, Stop, Einzelschritt.
Das Untere Bild zeit den "normalmodus", hier gibt es kein Start und kein 
Stop mehr, aber noch die Möglichkeit die Resetline auf High- oder LOW zu 
ziehen.
Die Schaltfläche für Start habe ich Rot umrandet, die für Halt Grün und 
die für Reset im Normalmodus Blau. (Pfeil nach Hoben besdeutet 
-Resetzustand auflösen, CPU arbeiten lassen)

Es kann sein das du diesen Grün leuchtenden "PowerKnopf" nicht hast, der 
erscheint nur wenn du in den Settings "Power Target von Programming 
Tool" angewählt hast, deine Schaltung also über das PK ihren Strom 
bekommt.

Gruß
Carsten

von Steffen (Gast)


Lesenswert?

MPLAB ist schon die ganze Zeit im Normalmodus ("Programmer > Select 
Programmer > Pickit3" ausgwählt). In Version 8.6 gibt es im Normalmodus 
allerdings noch ein Dropdown in der Menüleiste, wo man zwischen "Debug" 
und "Release" auswählen kann. Das stand bei mir zuerst auf "Debug". Hab 
ich aber nach Carstens Hinweis schon geändert, leider ohne positiven 
Nebeneffekt.

Diode, Pullup oder Brücke .. macht alles kein Unterschied, Problem 
bleibt!

Ich sattel mal auf MPLAB 8.8 um .. auch wenn ich mir davon nicht 
wirklich die Lösung des Problems verspreche (ausser dass die 
Neuinstallation vielleicht eine Einstellung hat die ich in 8.6 verkorkst 
hab :D)

Also .. ich bin weiterhin planlos .. und für jeden Tipp dankbar

von Steffen (Gast)


Lesenswert?

Update hat leider auch nix gebracht

von M. J. (manfred-64)


Lesenswert?

Hi,

hast Du das ganze eventuell auf einem Breadboard aufgebaut ?
Ich hatte schon mal das Problem das der µC Schwierigkeiten hatte den 
Quarz zum schwingen zu bringen.

Aktuell hab ich eine Funkuhr aufgebaut (liegt leider schon etwas länger 
brach) da kommt es immer wieder mal zu Problemen mit dem Quarzgenerator.
Erst wenn ich auf ihn drücke läuft die Uhr weiter.
Merkwürdigerweise wird aber immer das LCD-Display initialisiert und die 
erste Sekunde angezeigt ???


mfg
Manfred

von Steffen (Gast)


Lesenswert?

Hallo Manfred,

Ja auf einem Steckbrett, aber ..

Ich verwende den Internen Osziallator im uC und lasse mir dessen Takt 
auf einem Pin ausgeben. Das Taktsignal ist nach Anlegen der Spannung 
IMMER present. Nur alle per Software stimulierten Pins sind launig. Ich 
nehme halt mal an dass das Programm in diesen Fällen einfach nicht 
ausgeführt wird, weil alle Ausgänge immer zusammen schweigen bzw 
funktionieren. Ich kann im Programm jetzt aber auch nichts erkennen was 
zu einer Endlosschleife führen sollte (in der Simulation läufts) und 
schon gar nicht mehr oder minder zufällig.

Hätt ja schon gedacht dass ich irgendwas übersehe, was einen gewissen 
Pegel auf einem bestimmten Pin voraussetzt, der dann zufällig erfüllt 
wird wenn ich den IC manuell in die Schaltung setzte und das Programm 
starten lässt. Aber da die Anschlüsse (abgesehen von Vcc,Vdd und !MCLR 
(wenn PicKit nicht angeschlossen)) sowieso alle unverbunden sind sollte 
es ja keinen Unterschied machen.

von Anja (Gast)


Lesenswert?

Hallo,

schau einfach mal ins Datenblatt auf Seite 39 wie man einen PIC richtig 
(einschließlich Bankswitching) initialisiert. Ich denke dann klappt es 
auch mit den Pins auf Port A.

http://ww1.microchip.com/downloads/en/devicedoc/39598e.pdf

Gruß Anja

von usuru (Gast)


Lesenswert?

> Das Taktsignal ist nach Anlegen der Spannung IMMER present.

Wenn das Taktsignal da ist, arbeitet der PIC auch. Da stimmt was mit 
Deinber Initialisierung oder dem Programm nicht. Deine Bitdarstellung 
der Register ist leider sehr unübersichtlich, nimm doch lieber die Form

Register.Bit = x

von M. J. (manfred-64)


Lesenswert?

usuru schrieb:
> Wenn das Taktsignal da ist, arbeitet der PIC auch.

Falls der µC in Folge des Steckbrettes Probleme mit der Stromversorgung 
hat, könnte es durchaus dazu kommen das der interne Oszillator läuft 
aber ständig ein BOR ausgelöst wird!

von Husten (Gast)


Lesenswert?

Hallo,

füge im Code doch mal vor deiner Endlosschleife

ANSELA3 = 0; (Analog Select off)
TRISA3 = 0; (Ausgang an RA3)
RA3 = 0; (PIN LOW)
RA3 = 1; (PIN HIGH)
RA3 = 0; (PIN LOW)

ein. Messe dann mit dem Oszi den Pegel am RA3. Toggelt der Pin öfter als 
einmal beim einschalten der Versorgungsspannung, hängt er in einer dauer 
Reset schleife (WD, BOR o.ä.). Tut ers nicht, kannst Du das schon mal 
ausschließen.

Grüße

von Steffen (Gast)


Lesenswert?

Hallo Husten,

Mein Oszilloskop ist leider noch aus alten Zeiten ohne Speicher, von 
daher kann ich nur perioische Signale sehen und nicht nachvollziehen was 
der PIC beim Einschalten macht. Aber um auf Deinen Tip zurück zu kommen, 
RA3 toggelt nicht im "Dauerbetrieb", also weder wenn der PIC wie gewollt 
läuft. noch im Fehlerfall. BOR und WDT sind im CONFIG WORD ja auch 
deaktiviert. Trotzdem Danke für den Hinweis.

von Steffen (Gast)


Lesenswert?

Anja's Tipp hat auch keine Auswirkungen. Ist ja auch nicht mein erster 
PIC den ich auf diese Art initialisiert hab und es hat auch 
funktioniert, damals allerdings ein 12F675 mit CC5X und einem 
selbstgebauten Brenner5 von Sprut. Hab allerdings keine Serielle 
Schnittstelle mehr um diesen Weg testen.

von iaoffline (Gast)


Lesenswert?

Steffen schrieb:
> Und hier der Programmcode:

Warum ist GIE (Intcon:7) an?

von Steffen (Gast)


Lesenswert?

So, ich hab gerade nen 12f629 aus der bastelkiste gezaubert, config word 
und register angepasst .. läuft schon beim ersten versuch einwandfrei 
und zuverlässig!! ich muss da echt irgendwo ein reset oä im 
funktionsumfang des 16f818 übersehen.

von Steffen (Gast)


Lesenswert?

Hallo iaoffline,

Laut der Interrupt Logik auf Seite 96 des 16F818 Datenblattes wird der 
Timer0 Interrupt über GIE geroutet. Timer0 brauche ich allerdings später 
um einen Zeittrigger zu generieren.

von ein Gast (Gast)


Lesenswert?

Verwende PortB und nicht PortA als Indikator, ob dein Programm läuft,
da nur auf PortA Zusatzfunktionen automatisch laufen.
Pickit2 hatte auch RS232 sowie einen 4bit LA als Applikation, dasselbe 
müsste
eigentlich Pickit3 auch bieten.

Aus welchem Grunde inkludierst du die Headerdateien zweimal ?
Schon pic.h müsste die 16f81x.h includieren.

Auch die Initialisierung des Interruptregisters ist falsch,
man initialisiert es und schaltet erst später GIE frei, ansonsten
kann es passieren, daß nur eine einzige Interruptbearbeitung geht.

von g. (Gast)


Lesenswert?

Braucht der PIC nicht eine Negativelogik am MCLER Pin?
also +5V

von Carsten S. (dg3ycs)


Lesenswert?

Hi,

ein Gast schrieb:
> Verwende PortB und nicht PortA als Indikator, ob dein Programm läuft,
> da nur auf PortA Zusatzfunktionen automatisch laufen.
> Pickit2 hatte auch RS232 sowie einen 4bit LA als Applikation, dasselbe
> müsste
> eigentlich Pickit3 auch bieten.

Nein, leider nicht... Das ist (bis jetzt) dem PK2 vorbehalten.
ICh kann mir zwar gut vorstellen das der PK3 das HArdwaremäßig könnte, 
aber die dazu notwendige Software hat wohl noch niemand geschrieben.

BTW: Mit dem PK2 kann man sogar ATMEL AVR programmieren ;-)

g. schrieb:
> Braucht der PIC nicht eine Negativelogik am MCLER Pin?
> also +5V

Ja, +5V am !MCLR damit der PIC losrennt.
Aber die hat er ja laut Schaltplan angelegt!
(Ra5 = !MCLR)

Gruß
Carsten

von iaoffline (Gast)


Lesenswert?

Steffen schrieb:
> Hallo iaoffline,


Hallo zurück

> Laut der Interrupt Logik auf Seite 96 des 16F818 Datenblattes wird der
> Timer0 Interrupt über GIE geroutet. Timer0 brauche ich allerdings später
> um einen Zeittrigger zu generieren.

Wo springt denn dein Interrupt jetzt hin?

Besser am Anfang das Timer Overflow flag direkt abfragen.

von Frank B. (frankman)


Lesenswert?

MCLR soll ÜBER 10K an VCC angeschlossen sein.
Zwischen MCLR und Programmierinterface sollen noch 470R



--> Carsten, wie geht das? Mit dem PK2 einen Atmel flaschen? Hast du da 
vielleicht eine Beschreibung?

von Steffen (Gast)


Lesenswert?

Ich glaubs nicht .. will mich ja nicht zu früh freuen aber das GIE bit 
scheint echt der Schlüssel gewesen zu sein!! Ich setzte es jetzt erst 
direkt cor der Hauptschleife und siehe da, es läuft wie geölt.

DANKE nochmal an Alle für die Zeit und das Mitgrübeln, besonders an "Ein 
Gast" für die Lösung und iaoffline für die Vorahnung!

Ich melde mich dann beim nächsten Problem wieder))

Apropos g., der !MCLR/RA5 Pin hat 5V (siehe Schaltplan in der ersten 
Nachricht)

von Steffen (Gast)


Lesenswert?

Frank B. schrieb:
> Zwischen MCLR und Programmierinterface sollen noch 470R

Echt? Das seh ich zum ersten Mal .. aber schaden kann es ja nicht 
solange PK3 noch die 12V für VPP aufbauen kann.

von Carsten S. (dg3ycs)


Lesenswert?

Hi,

da es jetzt läuft können wir ja noch ein OT machen:
Frank B. schrieb:
> MCLR soll ÜBER 10K an VCC angeschlossen sein.
Einen Widerstand hat er ja im Schaltplan. Die 10K sind eine Empfehlung 
es funktioniert aber ein wesentlich größerer Bereich. Wenn man 
ausschließlich ohne angelegte Betriebsspannung flasht, also den PIC 
übder den PK mit Spannung versorgt, dann könnte man auch ganz auf ihn 
verzichten.

Die Diode ZUSÄTZLICH macht aber auf jeden Fall Sinn, denn sonst kommt es 
es unter Umständen zu einer Rückspeisung und die höhere 
Programmierspannung liegt auf der kompletten VCC Schiene an!

> Zwischen MCLR und Programmierinterface sollen noch 470R
Auch das ist eine Empfehlung, die recht gut Verhindert das bei 
Schaltungsfehlern das PicKit zerstört wird. Es funktioniert aber 
problemlos ohne, im Fehlerfall ist das Risiko eines Defektes am PicKit 
aber deutlich größer. (z.B. wenn !MCLR ohne Widerstand an VCC hängt und 
das PK versucht die REsetleitung auf Null zu ziehen. Dann hat man einen 
satten Kurzschluss!)

> --> Carsten, wie geht das? Mit dem PK2 einen Atmel flaschen? Hast du da
> vielleicht eine Beschreibung?
siehe:
http://pickit2.isgreat.org/

Gruß
Carsten

von heldvomfeld (Gast)


Lesenswert?

Servus, auch wenn das eigentliche Problem anscheinend schon gelöst ist 
wollte ich dennoch mal nachfragen ob der 7805 nicht eine gewisse 
Mindestlast braucht um vernünftig zu arbeiten. Ich denke das die ~100µA 
laut Datenblatt des PICs nicht ausreichend dafür ist. Deswegen hängt man 
ja auch öfters einfach ne "Status LED" hinter dem Regler. Das quasi 
Anlaufen würde ja auch dafür sprechen oder irre ich mich?

gruß~

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.