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:
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
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
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
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
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
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.
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
> 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
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!
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
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.
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.
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.
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.
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.
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
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.
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?
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)
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.
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
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ß~