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
Dein Programmer findet den PIC nicht. Prüf mal die Verdrahtung. Keine Kapazitäten an mclr, möglichst keine lasten an rb6, rb7.
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:
1 | ;****************************************************************************** |
2 | ; This file is a basic code template for object module code * |
3 | ; generation on the PIC12F629. This file contains the * |
4 | ; basic code building blocks to build upon. * |
5 | ; * |
6 | ; Refer to the MPASM User's Guide for additional information on * |
7 | ; features of the assembler and linker (Document DS33014). * |
8 | ; * |
9 | ; Refer to the respective PIC data sheet for additional * |
10 | ; information on the instruction set. * |
11 | ; * |
12 | ;****************************************************************************** |
13 | ; * |
14 | ; Filename: xxx.asm * |
15 | ; Date: * |
16 | ; File Version: * |
17 | ; * |
18 | ; Author: * |
19 | ; Company: * |
20 | ; * |
21 | ; * |
22 | ;****************************************************************************** |
23 | ; * |
24 | ; Files required: P12F629.INC * |
25 | ; * |
26 | ; * |
27 | ; * |
28 | ;****************************************************************************** |
29 | ; * |
30 | ; Notes: * |
31 | ; * |
32 | ;****************************************************************************** |
33 | |
34 | ;------------------------------------------------------------------------------ |
35 | ; PROCESSOR DECLARATION |
36 | ;------------------------------------------------------------------------------ |
37 | |
38 | LIST P=12F629 ; list directive to define processor |
39 | #INCLUDE <P12F629.INC> ; processor specific variable definitions
|
40 | |
41 | ;------------------------------------------------------------------------------ |
42 | ;
|
43 | ; CONFIGURATION WORD SETUP |
44 | ;
|
45 | ; The 'CONFIG' directive is used to embed the configuration word within the |
46 | ; .asm file. The lables following the directive are located in the respective |
47 | ; .inc file. See the data sheet for additional information on configuration |
48 | ; word settings. |
49 | ;
|
50 | ;------------------------------------------------------------------------------ |
51 | |
52 | __CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT |
53 | |
54 | ;------------------------------------------------------------------------------ |
55 | ; VARIABLE DEFINITIONS |
56 | ;------------------------------------------------------------------------------ |
57 | |
58 | ; example of using Shared Uninitialized Data Section |
59 | INT_VAR UDATA_SHR 0x20 |
60 | W_TEMP RES 1 ; variable used for context saving |
61 | STATUS_TEMP RES 1 ; variable used for context saving |
62 | |
63 | ;------------------------------------------------------------------------------ |
64 | ; EEPROM INITIALIZATION |
65 | ;
|
66 | ; The 12F629 has 128 bytes of non-volatile EEPROM, starting at address 0x2100 |
67 | ;
|
68 | ;------------------------------------------------------------------------------ |
69 | |
70 | DATAEE CODE 0x2100 |
71 | DE "MCHP" ; Place 'M' 'C' 'H' 'P' at address 0,1,2,3 |
72 | |
73 | ;------------------------------------------------------------------------------ |
74 | ; OSCILLATOR CALIBRATION VALUE |
75 | ;------------------------------------------------------------------------------ |
76 | |
77 | OSC CODE 0x03FF |
78 | |
79 | ; Internal RC calibration value is placed at location 0x3FF by Microchip as |
80 | ; a 0xADDLW K instruction, where the K is a literal value to be loaded into |
81 | ; the OSCCAL register. |
82 | |
83 | ;------------------------------------------------------------------------------ |
84 | ; RESET VECTOR |
85 | ;------------------------------------------------------------------------------ |
86 | |
87 | RESET_VECTOR CODE 0x0000 ; processor reset vector |
88 | GOTO START ; go to beginning of program |
89 | |
90 | ;------------------------------------------------------------------------------ |
91 | ; INTERRUPT SERVICE ROUTINE |
92 | ;------------------------------------------------------------------------------ |
93 | |
94 | INT_VECTOR CODE 0x0004 ; interrupt vector location |
95 | MOVWF W_TEMP ; save off current W register contents |
96 | MOVF STATUS,w ; move status register into W register |
97 | MOVWF STATUS_TEMP ; save off contents of STATUS register |
98 | |
99 | ; isr code can go here or be located as a call subroutine elsewhere |
100 | |
101 | MOVF STATUS_TEMP,w ; retrieve copy of STATUS register |
102 | MOVWF STATUS ; restore pre-isr STATUS register contents |
103 | SWAPF W_TEMP,f |
104 | SWAPF W_TEMP,w ; restore pre-isr W register contents |
105 | RETFIE ; return from interrupt |
106 | |
107 | ;------------------------------------------------------------------------------ |
108 | ; MAIN PROGRAM |
109 | ;------------------------------------------------------------------------------ |
110 | |
111 | MAIN_PROG CODE |
112 | |
113 | START
|
114 | |
115 | ;------------------------------------------------------------------------------ |
116 | ; OSCCAL RESTORE (not required if internal OSC is not used) |
117 | ;------------------------------------------------------------------------------ |
118 | |
119 | errorlevel -302 |
120 | BSF STATUS,RP0 ; set file register bank to 1 |
121 | CALL 0x3FF ; retrieve factory calibration value |
122 | MOVWF OSCCAL ; update register with factory cal value |
123 | BCF STATUS,RP0 ; set file register bank to 0 |
124 | errorlevel +302 |
125 | |
126 | ;------------------------------------------------------------------------------ |
127 | ; PLACE USER PROGRAM HERE |
128 | ;------------------------------------------------------------------------------ |
129 | |
130 | GOTO $ |
131 | |
132 | END ; directive 'end of program' |
:
Bearbeitet durch User
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
:
Bearbeitet durch User
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.
:
Bearbeitet durch User
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 Markus, nein, der bin ich nicht. Christian
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
Zieh dir mal das Programm hier von Microchip: http://ww1.microchip.com/downloads/en/DeviceDoc/PICkit3%20Programmer%20Application%20v3.10.zip runter und probiers damit. Die MPLAB IDE v8.92 ist etwas zickig mit dem PK3. >Einstellung des PICKits ein Problem >darstellt. Richtig!
:
Bearbeitet durch User
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.