Hallo liebe Profis,
ich beginne in die weite Welt der PIC-Programmierung einzusteigen, was
tatsächlich nicht einfach ist.
Ich studierte inzwischen viele Beispielprogramme, insbesondere bei
sprut.de.
Man beginnt natürlich mit einfachen Programmen, um hinter die
Geheimnisse zu kommen. Nach vielem erfolglosen probieren, bitte ich um
einen Hinweis, warum mein kleines Progrämmchen nicht funktioniert. Hier
handelt es sich um ein einfaches Ansteuern von Ausgängen in Abhängigkeit
einer Belegung an den Eingängen.
Das Programm läßt sich ohne Fehler kompilieren. Zur flashen benutze ich
ein PICKit3. Nach connecting erscheint im output MPLAB:
PICkit 3 detected
Connecting to PICkit 3...
Firmware Suite Version...... 01.28.90
Firmware type......................Midrange
PICkit 3 Connected.
PK3Err0045: You must connect to a target device to use PICkit
3.
Um den Fehler zu beseitigen fand ich in diesem Forum den Hinweis zum
Einschalten der Spannung im Setting zum PICKit3. Nach Aktivieren
erscheint:
PICkit 3 detected
Connecting to PICkit 3...
Firmware Suite Version...... 01.28.90
Firmware type......................Midrange
PICkit 3 Connected.
PK3Err0045: You must connect to a target device to use PICkit
3.
Device ID Revision = 00000010
The target has invalid calibration data (3fff).
Dieser Fehler lässt sich ignorieren und man kann das Progrämmchen
flshen. Leider passiert aber gar nichts. Also schlussfolgere ich, das
irgend eine
Vereinbarung nicht stimmt oder eine Einstellung des PICKits ein Problem
darstellt.
Suchfunktionen und Sprut halfen mir in diesem Fall leider nicht weiter.
Vielleicht kann jemand mir einen Hinweis geben.
Vielen Dank für die Unterstützung.
Mit freundlichem Gruß
Christian
Für den Anfang sind PICs ohne ICD (InCircuitDebugger) nicht so
empfehlenswert. Wenn man das PICkit als Debugger verwenden kann, bekommt
man gleich in der IDE die Meldung, ob das Programm überhaupt ausgeführt
wird.
Du hast in deinem Sourcecode einen Hinweis auf internen Oszillator, aber
ich sehe keine Konfiguration... (Du musst Angaben für ALLE Configuration
Bits machen)
<edit> hier noch ein ganz gutes Tutorial:
http://www.gooligum.com.au/PIC-tutorials/baseline-PIC-tutorial
Noch das Template der IDE:
Hallo,
vielen Dank für die ersten Antworten.
@no target: Ich benutze den PICKit mit einem universal-Adapter. Die
Jumper stecken richtig und ich glaube auch den Pic richtig eingesteckt
zu haben. Da eine device-ID rückgemeldet wird, wird meiner Meinung nach
auch der PIC erkannt.
@ volker: Ich habe die Konfigurationsangabe in
__CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_ON & _WDT_OFF &
_PWRTE_ON & _INTRC_OSC_NOCLKOUT
geändert. Das Ergebnis ist unverändert, nach reconnect:
PICkit 3 detected
Connecting to PICkit 3...
Firmware Suite Version...... 01.28.90
Firmware type......................Midrange
PICkit 3 Connected.
Device ID Revision = 00000010
The target has invalid calibration data (3fff).
Abgesehen davon glaube ich, dass ich wegen Nutzung GP3 als Eingang ich
PWRTE auf OFF stellen muss, Das ist aber erst einmal untergeordnet.
Christian
Christian Weber schrieb:> The target has invalid calibration data (3fff).
An der Adresse 0x3ff liegt der Kalibrierwert, der per RETLW in der
Initialisierungsroutine geladen und ins OSCCAL gespeichert wird. Daher
ist dein Kommentar: ";Lade 3FF für Taktgeneratorkalibrierung" falsch,
schaue dir die entspr. Stelle in dem von Volker geposteten Template an.
Normalerweise wird die Flash-Adresse 0x3FF nicht gelöscht und nicht
programmiert, weil hier der Herstellerwert liegt. Wenn das Flash
komplett gelöscht wurde, dann ist der Kalibrierwert unter 0x3FF ggf. weg
und muss wiederhergestellt werden. Ohne das RETLW an 0x3FF funktioniert
die Initialisierungsroutine nicht richtig.
Christian Weber schrieb:> Da eine device-ID rückgemeldet wird, wird meiner Meinung nach> auch der PIC erkannt.Christian Weber schrieb:> Device ID Revision = 00000010
Die angezeigte Device-ID ergibt keinen Sinn! Laut Programming Spec,
Seite 18 (Link: ww1.microchip.com/downloads/en/DeviceDoc/41191D.pdf)
müsste die Device ID für den 12F629 hexadezimal 0F8x oder 0F9x sein (die
unteren 5 Bits sind die Revision Nummer). Die ganzen Nullen in Deiner
angezeigten ID deuten auf ein Kommunikationsproblem zwischen PK3 und PIC
hin. Die eine 1 ist wohl eher Datenmüll.
PWRTE kann man immer aktivieren.
Hallo Witkatz,
ok, der Kommentar stammt aus meiner Bibel bei sprut.
Leider sehe ich den wesentlichen Unterschied zum Template nicht.
Volker S. schrieb:> ;----------------------------------------------------------------------- -------> ; OSCCAL RESTORE (not required if internal OSC is not used)> ;----------------------------------------------------------------------- ------->> errorlevel -302> BSF STATUS,RP0 ; set file register bank to 1> CALL 0x3FF ; retrieve factory calibration value> MOVWF OSCCAL ; update register with factory cal value> BCF STATUS,RP0 ; set file register bank to 0> errorlevel +302
Das ist in meinem Progrämmchen auch so.
Die Zeile:
Volker S. schrieb:> ;----------------------------------------------------------------------- -------> ; OSCILLATOR CALIBRATION VALUE> ;----------------------------------------------------------------------- ------->> OSC CODE 0x03FF>> ; Internal RC calibration value is placed at location 0x3FF by Microchip> as> ; a 0xADDLW K instruction, where the K is a literal value to be loaded> into> ; the OSCCAL register.
lässt sich so in da Programm nach der Variablendeclaration nicht
integrieren, da es einen Labelfehler beim Compilieren gibt.
Wo und wie muss ich RETLW in das Programm einbauen, damit es
funktioniert.
Was mich stutzig macht ist der Fakt, dass MPLAB auch bei geschlossenen
*.asm und *.hex files erkennt, dass der Kalibrierungswert falsch ist.
Ist der PIC kaputt oder wie kann ich den OSCCAL wieder richtig stellen.
Christian.
Ich habe leider noch nie mit diesen Midrange PICs gearbeitet.
Der Link zu den Gooligum Tutorials oben war auch suboptimal.
Besser
wäre_http://www.gooligum.com.au/PIC-tutorials/midrange-PIC-tutorial
Beginnt genau mit deinem 12F629. Da gab es früher sogar ein extra
Dokument "PIC12F629 Programming Issues". So was gibt es vieleicht auch
in den neuen Lessons.
Christian Weber schrieb:> Wo und wie muss ich RETLW in das Programm einbauen, damit es> funktioniert.
Das RETLW muss natürlich an 0x3FF, wie sollte denn sonst CALL 0x3FF
einen Wert ins W-Register holen?
Bevor du den Kalibrierwert wiederherstellst müsstest du erst den
richtigen Wert bestimmen und dem PicKit 3 muss in den Optionen der
Zugriff auf diese Speicheradresse erlaubt werden. Normalerweise
überschreibt PicKit 3 diese Adresse nicht, die Option "Program
Calibration Memory" ist default aus und sollte auch aus bleiben!
Deswegen ist vermutlich das Problem wo anders und die Fehlermeldung eine
Folge von z.B. Kommunikationsproblemen.
Ich würde dir raten erst die Hinweise von Thomas Elger zu befolgen und
die Kommunikation richtig ans Laufen bekommen. Wenn dann noch die
Calibration-Meldung kommt, kannst mit dem MPLAB IPE den Speicher
auslesen und schauen ob in 0x3FF irgendwas abgelegt ist.
Witkatz :. schrieb:> Ich würde dir raten erst die Hinweise von Thomas Elger zu befolgen und> die Kommunikation richtig ans Laufen bekommen.
+1
Christian Weber schrieb:> Abgesehen davon glaube ich, dass ich wegen Nutzung GP3 als Eingang ich> PWRTE auf OFF stellen muss, Das ist aber erst einmal untergeordnet.
Wie programmierst du eigentlich deinen PIC. In der Schaltung?
Dann versuch erst mal ein Miniprogramm zum laufen zu bringen, das keinen
der Programmierpins benutzt. (ICSPCLK, ICSPDAT, Vpp/MCLR)
Lass die Pins am besten für den Anfang unbeschaltet.
<edit>Mist, auch mein zweiter gooligum Link passt nicht. Sollte
natürlich uaf die kostenlosen Samples gehen:
http://www.gooligum.com.au/PIC-tutorials/midrange-PIC-sample
Hallo,
vielen Dank für die Hinweise, die für Anfänger zum Teil sehr schwer zu
verstehen, bzw. Nachzuvollziehen sind.
Ich programmiere meine PIC über MPLAB IDE V8.92. Als Programmer nutze
ich einen PICKit 3 mit Universaladapter (in diesem Fall, für
flash-updates in einem anderen Projekt nutze ich ISP).
Inzwischen glaube ich, dass ich Kommunikationsprobleme ausschließen
kann. Ich probierte einen funktionierenden PIC18F4245 mit den gleichen
Anzeigen.Einziger Unterschied ist der, dass dort der PIC-Typ angezeigt
wird und nicht wie im Fall des PIC12F629 als Firmwaretyp "midrange".
Ich glaube inzwischen, dass ich mir das Register OSCCON zerschossen
haben. Ich hatte irgendwann im CALL eine falsche Adresse eingetragen und
den Inhalt dieser Zelle über movwf nach OSCCON geschrieben.
Wie kann ich nun den richtigen Wert ermitteln und wieder in das Register
eintragen.
Für eine Beschreibung, für einen Amateur wie mich verständlich, bin ich
sehr dankbar.
Ich denke, dass das über den Reiter PICKit 3 settings --> calibration
memory gehen müsste. Dort steht gegenwärtig uter last valid value NA und
unter last value 0x3fff. Unter new --> retlw scheint man einen Wert
zwischen 0 und 255 eintragen können.
Wie bekomme ich den richtigen Wert heraus?
Mit freundlichem Gruß
Christian
Christian Weber schrieb:> Ich glaube inzwischen, dass ich mir das Register OSCCON zerschossen> haben. Ich hatte irgendwann im CALL eine falsche Adresse eingetragen und> den Inhalt dieser Zelle über movwf nach OSCCON geschrieben.>> Wie kann ich nun den richtigen Wert ermitteln und wieder in das Register> eintragen.
Wie schon erwähnt kenne ich mich mit diesem speziellen PIC nicht aus.
Aber, das OSCCAL im RAM kannst du nicht "zerschießen". Nach dem
Einschalten und vor der Ausführung des Programms steht da 0b100000--
drin. Das entspricht dem mittleren Wert für die Oszillator-Kalibrierung.
Beim Hersteller wird für jeden dieser PICs wohl noch ein Kalibrierwert
ermittelt und an der Adresse 0x3FF im Flash abgelegt.
Den kann man dann wohl holen und in das Register OSCCAL im RAM
schreiben, damit der Oszillator möglichst genau auf 4MHz läuft.
Verzichtet man darauf, sollte meiner Meinung nach der PIC trotzdem
laufen, aber eben vielleicht nicht gerade mit 4MHz.
Wie weit man über die Kalibrierung die Frequenz nach oben oder unten
verschieben kann - keine Ahnung ;-)
Wenn dir die Frequenz egal ist, dann verzichte einfach auf eine
Kalibrierung. Wenn nicht, musst du wahrscheinlich den Wert ermitteln,
indem du den PIC mit verschiedenen OSCCAL Werten laufen lässt und über
den CLOCKOUT Pin misst.
So, habe das gerade mal selbst ausprobiert: tatsächlich wird bei
"Device-ID Revision" offenbar nur die Revision und nicht die Device-ID
oder der Name des erkannten PIC12Fxxx angezeigt. Der angezeigte Wert
"0000010" und damit die Connection scheint also wohl in Ordnung sein.
Wenn der OSCCAL-Wert tatsächlich "zerschossen" ist, ist das, wie Volker
schon schrieb, für die Funktion des Programms egal, solange man nicht
per "call 0x3FF" versucht, den Kalibrierungswert zu lesen. Die
Befehlssequenz "call 0x3FF, movwf OSCCAL" kann man z.B. auskommentieren,
dann sollte das Programm laufen. Oder einfach erstmal "retlw 0x80" als
Kalibrierwert bei 0x3ff eintragen.
Zum Ermitteln eines neuen OSCCAL-Wertes reicht notfalls auch ein
LED-Blinkprogramm und eine Stoppuhr, wenn man das als Programmierübung
zum Kennenlernen des PICs betrachtet. Wenn man mit irgendeinem halbwegs
realistischen Zeit-Geld-Verhältnis rechnet, ist 1€ für einen neuen PIC
aber wohl günstiger.
Hallo Chistian,
eine persönliche Frage, da ich einen Christian Weber kenne,
der sich hier auch herumtreiben könnte.
Bist Du der SA/JO Christian?
Dieser weiß, wass gemeint ist.
Ansonsten nichts für ungut!
Gruß
Markus
Hallo,
Es ist tatsächlich so, wie ich bereits vermutetet. Die Kommunikation
PICKit, PIC, PC funktioniert.
Volkers links halfen, danke Volker. Dort liegen zwar eine Unmenge von
Dokumenten, aber nach einem Überflug fand ich die richtige Information.
Ich betrieb bisher MPLAB und nutze das PICKit nur als integrierten
Programmer. In den Artikeln fand ich auch den link zum Betreiben des
PICKit als stand allone Gerät. Nach Installation lud der PICKit zwar ein
neues OS, so das er nun nicht mehr mit MPLAB funktioniert, aber das
sollte nicht das Problem sein, das wieder einzurenken.
Es ist tatsächkich so, dass ich mir OSCCAL überschrieben habe und damit
der Fehler angezeigt wird. Die in den Artikeln beschrieben
"AUTOGENERATE"- Funktion konnte ich zwar nicht finden, aber ein
manueller Eintrag ist möglich. Nach neuem Kompilieren konnte ich ohne
Probleme flashen und mein Miniprogrämmchen funktioniert. Im Moment nur
mit externen Pull-Up -Widerständen, obwohl ich mir einbildete diese mit
movlw B'00111000' ;pull up für GP
movwf WPU ;Pull-up für GP3 bis 5 einschalten
aktiviert zu haben.
Das bekomme ich aber noch heraus.
Vielen Dank für die Unterstützung.
Christian.
Hallo Christian!
Du musst im OPTION_REG das bit 7 auf 0 setzen
REGISTER 4-1: OPTION_REG: OPTION REGISTER (ADDRESS: 81h)
bit 7 GPPU: GPIO Pull-up Enable bit
1 = GPIO pull-ups are disabled
0 = GPIO pull-ups are enabled by individual PORT latch values
mfG GroberKlotz
...zu Deinem Problem mit dem OSCCAL-register
Es ist immer gut in den microchip foren nachzuschauen
hier: http://www.microchip.com/forums/m616244.aspx
wurde sogar ein kleines Assemblerprogramm veroeffentlich um den OSCCAL
wieder brauchbar verwenden zu koennen.
mfg GroberKlotz
Im alten PicKit 2 gibt es eine Funktion zum Wiederherstellen des
Kalibrierwertes. Ich habe mir zwar irgendwann PicKit 3 für MPLAB X und
die neuen PIC zugelegt, leider hat der 3er diese Funktion nicht mehr.
Das war für mich ein Grund, den PicKit 2 zu behalten, so lange ich noch
einige PIC12Fxxx zum verbasteln habe, die sporadisch das gleiche Problem
mit dem Kalibrierwert haben.
Also, falls du noch ein PcKit 2 hast, oder für kleines Geld dran kommst
- meine Empfehlung.
Mal ne zwischen Frage.
Was läuft eigentlich schief wenn der Kalwert nicht stimmt. Läuft der
Oszillator halt nich genau, na und....
Last doch bitte einer mal nen Groschen für mich fallen. :)
PS: Bei mir kommt demnächst ein 12F2xx an den PicKit3
Teo D. schrieb:> Läuft der Oszillator halt nich genau, na und....
Wenn die Oszillatorfrequenz egal ist, dann ist es erstmal egal. In
Assembler kann das kalibrieren des OSCCAL in der Initialisierung
übersprungen werden und gut ist. In XC8 ist die die Kalibriersequenz
standardmäßig im Startup eingebaut.
OK, Danke.
Hab wohl das eigentliche Problem missverstanden.
Hab mal kurz drübergegugt, viel is da ja nich dran.
/Kurzschluss/: Das is eine Art PicSeitiger Schreibschutz für die
Werksseitig programmierten Kall.-Daten!?
Teo D. schrieb:> PicSeitiger Schreibschutz für die> Werksseitig programmierten Kall.-Daten!?
Nein, gibt es nicht. Die Flash-Zelle 0x3ff wird zwar vom Hersteller mit
dem werksseitigen Kalibrierwert als RETLW operation beschrieben, aber
kann vom Anwender wie jede andere Flasch-Zelle gelöscht oder mit eigenem
Kalibrierwert beschreiben.
Normalerweise löscht der PicKit diesen Wert nicht, weil in den
Programmieroptionen die Option "Program Calibration Memory"
standardmäßig aus ist. Im Normalfall passiert also nichts, aaaber...
der PicKit liest den Wert, löscht Flash und schreibt den Wert zurück.
Flashen der PIC12F629/675 ist aber erst bei >4,5V zuverlässig.
Mit Vdd Versorgung z.B. aus drei nicht mehr frischen Zellen mit knapp
<4,5V kann es passieren, dass das Lesen und Löschen noch funktioniert,
das Zurückschreiben aber nicht mehr und man darf sich wieder mit der
Neukalibrierung befassen.
Witkatz :. schrieb:> und man darf sich wieder mit der Neukalibrierung befassen.
Weshalb man als einigermaßen erfahrener PIC-Benutzer auch als erstes bei
jedem neuen Chip den OSCCAL-Wert ausliest und mit Edding auf der
Rückseite des Chips notiert. So muss man sich nicht lange mit
Neukalibrierungen aufhalten sondern hat den Factorywert jederzeit zur Ha
d und braucht ihn nur noch zurück zu schreiben wenn man mal wieder was
verproggt hat.