Hallo Ihr, also, nach dem kauf eines Programmieres (Ve...mann-K8048) habe ich mit dem PIC16F627 rumexperimentiert. Ging alles gut. Innerhalb einiger Tage habe ich die Sache einigermassen verstanden und verschiedene Programme zum laufen gebracht. Nun sollte das Programmieren aber auf den PIC12F629 laufen. Also habe ich die Grundeinstellungen und RESET-Einstellugen von 16F627 (welche funktionierten!) mit 12F629 verglichen und angepasst. Gut, dann einen *.hex compiliert (mpsasm) und auf den PIC12F629 gebrannt. Ging auch gut. Nur lässt der die LED nicht blinken.... Also ein Problem. Entweder beim RESET oder im Programm (main usw...). Wer sich Zeit nehmen könnte mir hier zu helfen, dem wäre ich sehr dankbar. Ausserdem habe ich wenige Code-Beispiele gesehen (Google...) wo man ohne den 12F629.inc-File auskommt. Oder geht es ohne gar nicht? Das Programm: ;*********************************************************************** *** ;* VELLEMAN High-Q KIT K8048/VM111 SAMPLE SOFTWARE * ;*********************************************************************** *** ;* DEMO1: Simple Running light for testing LD1...LD5 * ;* DEMO1: Program for testing K8048/VM111 with PIC16F629! * ;*********************************************************************** *** ;* (C) VELLEMAN Components,2003 All rights reserved * ;*********************************************************************** *** ;* Hardw. Rev: P8048'1 Softw. Rev: 1.20 * ;* OSC.......: XT 4MHz Max. POWER.....: 12V DC * ;*********************************************************************** *** W EQU H'0000' F EQU H'0001' ;----- Special Functioin Register Files (data memory map)------------------- ; bank 0 INDF EQU H'0000' TMR0 EQU H'0001' PCL EQU H'0002' STATUS EQU H'0003' FSR EQU H'0004' GPIO EQU H'0005' PCLATH EQU H'000A' INTCON EQU H'000B' PIR1 EQU H'000C' TMR1L EQU H'000E' TMR1H EQU H'000F' T1CON EQU H'0010' CMCON EQU H'0019' ;ADRESH EQU H'001E' ;ADCON0 EQU H'0019' ; bank 1 OPTION_REG EQU H'0081' TRISIO EQU H'0085' ;PCLATH EQU H'008A' PIE1 EQU H'008C' PCON EQU H'008E' OSCCAL EQU H'0090' WPU EQU H'0095' IOC EQU H'0096' VRCON EQU H'0099' EEDATA EQU H'009A' EEADR EQU H'009B' EECON1 EQU H'009C' ;EECON2 EQU H'009D' ;ADRESL EQU H'009E' ;ANSEL EQU H'009F' ;----- STATUS Bits (special register summary bank0)------------------------- ; 03h status Bits RP0 EQU H'0005' NOT_TO EQU H'0004' NOT_PD EQU H'0003' Z EQU H'0002' DC EQU H'0001' C EQU H'0000' ;======================================================================= === ; ; RAM Definition ; ;======================================================================= === __MAXRAM H'01FF' __BADRAM H'06'-H'09', H'0D', H'11'-H'18', H'1A'-H'1D', H'60'-H'7F' __BADRAM H'86'-H'89', H'8D', H'8F', H'91'-H'94', H'97', H'98', H'E0'-H'FF' ;======================================================================= === ; ; Configuration Bits ; ;======================================================================= === _BG_LOW EQU H'0FFF' _BG_HIGH EQU H'3FFF' _DATA_CP_OFF EQU H'3FFF' _DATA_CP_ON EQU H'3EFF' _CP_OFF EQU H'3FFF' _CP_ON EQU H'3F7F' _BODEN_ON EQU H'3FFF' _BODEN_OFF EQU H'3FBF' _MCLRE_ON EQU H'3FFF' _MCLRE_OFF EQU H'3FDF' _PWRTE_OFF EQU H'3FFF' _PWRTE_ON EQU H'3FEF' _WDT_ON EQU H'3FFF' _WDT_OFF EQU H'3FF7' _RC_OSC_CLKOUT EQU H'3FFF' _RC_OSC_NOCLKOUT EQU H'3FFE' _INTRC_OSC_CLKOUT EQU H'3FFD' _INTRC_OSC_NOCLKOUT EQU H'3FFC' _EXTCLK_OSC EQU H'3FFB' _HS_OSC EQU H'3FFA' _XT_OSC EQU H'3FF9' _LP_OSC EQU H'3FF8' __CONFIG _MCLRE_OFF &_CP_OFF &_WDT_OFF &_INTRC_OSC_NOCLKOUT ; checksum 31C4 ORG 0 ; Reset vector address GOTO RESET ; goto RESET routine when boot. ; ********************************** ; ** RESET : main boot routine ** ; ********************************** RESET ; setup registers bcf status,rp0 ; bank 0 clrf GPIO ; init GPIO movwf CMCON ; digital io BSF STATUS,RP0 ; Switch to register bank 1 ;clrf ANSEL ; 12F675 only movlw B'00001010' ; check spex !!! movwf OPTION_REG ; bit7 = GPIO_pullups enabled ; bit6 = INTEDG falling edge ; bit5 = TOCS ; bit4 = TOSE L-H incr ; bit3 = PSA -> TIMER0 ; bit2,1,0 = prescaler 1:128 movlw B'00101011' ; 1=input, 0=output movwf TRISIO ; bit7,6 = 0 ; GP5 = input ; GP4 = output ; GP3 = input ; GP2 =output ; GP1 = output ; GP0 = output ; calibrating the internal oscillator bsf STATUS,RP0 call H'3FF' ; get the calibration value movwf OSCCAL ; calibrate oscillator bcf status,rp0 ; bank 0 clrf GPIO ; init GPIO Goto Main ;======================================================================= === ; From here on your own.... ;======================================================================= === ; bits on GPIO pin7 equ 0 ; GP0 pin6 equ 1 ; GP1 pin5 equ 2 ; GP2 pin4 equ 3 ; GP3 pin3 equ 4 ; GP4 pin2 equ 5 ; GP5 ;======================================================================= === ; Variable Definition ;======================================================================= === fileA EQU H'20' ; Used in delay routine fileB EQU H'21' ; " " " fileC EQU H'22' ; " " " MAIN bsf GPIO,pin5 ;turn on LED1 call Del bcf GPIO,pin5 ;turn off LED1 call Del goto main ;Delay 1 sec Del movlw H'40' movwf fileC movlw H'40' movwf fileB movlw H'40' movwf fileA DelX decfsz fileA,1 ; ,1 denotes the result of the decrement goto DelX decfsz fileB,1 ; is placed in the file goto DelX decfsz fileC,1 goto DelX retlw 00 ;OSCCAL calibration value org H'03ff' movlw H'20' end
vielleicht stört das: Goto Main MAIN bsf GPIO,pin5 ;turn on LED1 goto main 3 verschiedene Schreibweisen, vielleicht mag der Compiler das nicht. ansonsten ist häufigster Fehler, daß man eine falsche Registerbank ausgewählt hat, konnt ich aber beim überfliegen nichts sehen. Microchip ist halt programmieren und suchen warum es nicht geht, Atmel ist programmieren und mißtrauisch sein, weil es auf Anhieb funktioniert.
>Microchip ist halt programmieren und suchen warum es nicht geht... und dabei sehr viel lernen! > Also habe ich die Grundeinstellungen und RESET-Einstellugen von 16F627 > (welche funktionierten!) mit 12F629 verglichen und angepasst. Was hast Du denn alles angepasst? Ich habe Datenblätter der beiden PIC's jetzt nicht im Kopf, aber ich denke, da ist ganz schön viel anzupassen.
Auszug aus Deinem Programm: RESET ; setup registers bcf status,rp0 ; bank 0 clrf GPIO ; init GPIO movwf CMCON ; digital io BSF STATUS,RP0 ; Switch to register bank 1 Fehlt da nicht die Anweisung movlw 0x07 vor dem movwf CMCON, denn so weist Du ja dem CMCON-Regster nicht den richtigen Wert zu, Meiner Meinung nach sollte es so heißen (Nur dieser kleine Ausschnitt) RESET ; setup registers bcf status,rp0 ; bank 0 clrf GPIO ; init GPIO movlw 0x07 movwf CMCON ; digital io BSF STATUS,RP0 ; Switch to register bank 1 Stefan B. (Linz, Österreich)
OK. habe nun wieder einiges versucht, leider ohne Erfolg. Ich habe auf einer anderen Webseite (F...Heitor) etwas ähnliches mit einem Pic12F675 gelesen. Werde also mal dort nachfragen, und wenn ich dann den 12F629 zum blinken gekriegt habe, mich zurückmelden.... Ansonsten wäre ich auch auch über einen link oder eine Datei für LED an/aus an gp2 (wegen vellemann-kit) auch freuen... könnte dann daraus die Fehler ableiten und mir das eben selber beibringen... Danke für eure Mühe.
Also zwei Fehler fallen mir da auf: 1. (oben schon erwähnt) movlw 0x07 movwf CMCON ; digital io sonst schreibst du Zufallswerte in CMCON 2. viel schlimmer: ;OSCCAL calibration value org H'03ff' movlw H'20' Das rufts du mit call H'3FF' ; get the calibration value auf. Der Prozessor springt dan nach 3ff, macht weiter bei 0 und startet in einer Endlosschleife von vorn. Zum Blinken kommt er garnicht... Da sollte stehen: org H'03ff' retlw H'20' Dann findet er auch wieder zurück. Vor dem call H'3FF' steht noch ein überflüssiger bsf STATUS,RP0 Die gemischte GROSSklein-Schreibweise frisst MPLAB auch erst, wenn man in den Projektoptionen Case-Sensitiv abschaltet. Uwe
Ok. Veränderungen... Neuerungen... weitere Probleme... Ich habe mit folgendem Programm nun das Problem (teilweise) gelöst... Was geht: LEDs an pin3 und pin5 blinken. (juhuuu!) Was geht nicht: Sobald ich die osccal-aktion in das Programm reinnehme, geht es nicht mehr. (i) mit retlw h'20' gibt mir das brennprogramm (das mitgelieferte von vellemann) einen Fehler, der besagt: Write error at 03ff wrote 3420 read 0000 (ii) geht der pic nicht los... aaa-ber er reagiert auf Impulse an GP5 / pin2, so als ob er nur darüber "getriggert" wird... komisch-komisch.... Nun meine Frage: Ich versuche ohne OSCCAL zu arbeiten, aber dann weiss ich nicht ob eine berechnete Sekunde (also Teiler von 4MHz...) dann auch eine Sekunde ist, oder? Bei einer Sekunde is ja egal, aber wenn der über 24 Stunden schon 10 Sekunden daneben ist, bringt mir das nicht so viel... WER KANN mir da was helfen? Ausschnitt !.... Daten wie oben.... ; ********************************** ; ** reset : main boot routine ** ; ********************************** reset ; setup registers bcf status,rp0 ; bank 0 clrf gpio ; init gpio movlw b'000111' ;disable comparator module's movwf cmcon ; digital i/o bsf status,rp0 ; switch to register bank 1 ;clrf ansel ; 12f675 only movlw b'10000111' ; check spex !!! movwf option_reg ; bit7 = 0 = gpio_pullups enabled ; bit6 = 0 = intedg falling edge on gp2 ; bit5 = 0 = internal inst cycle clk ; bit4 = 0 = incr l -> h on gp2 ; bit3 = 0 = psa -> timer0 ; bit2,1,0 = prescaler 111 = 1:256 movlw b'00101000' ; 1=input, 0=output movwf trisio ; bit7,6 = 0 ; gp5 = output ; gp4 = output ; gp3 = INPUT ONLY ; gp2 =output ; gp1 = output ; gp0 = output ; calibrating the internal oscillator ;call h'03ff' ; get the calibration value ;movwf osccal ; calibrate oscillator bcf status,rp0 ; switch to register bank 0 clrf gpio ; clear of junk goto main ;======================================================================= === ; from here on your own.... ;======================================================================= === ; bits on gpio pin7 equ 0 ; gp0 pin6 equ 1 ; gp1 pin5 equ 2 ; gp2 pin4 equ 3 ; gp3 pin3 equ 4 ; gp4 pin2 equ 5 ; gp5 ;======================================================================= === ; variable definition ;======================================================================= === timer1 equ h'20' ; used in delay routine timer2 equ h'21' ; " " " ; ********************************************* ; example of a delay routine ; ********************************************* del movlw h'ff' ;54 generate approx 10ms delay at 4mhz clk movwf timer2 del_loop1 movlw h'ff' ;60 movwf timer1 del_loop2 decfsz timer1,1 goto del_loop2 decfsz timer2,1 goto del_loop1 retlw 0 main bsf gpio,pin3 ;turn on led2 bsf gpio,pin5 ;turn on led1 call del bcf gpio,pin3 ;turn off led2 bcf gpio,pin5 ;turn on led1 call del goto main ;osccal calibration value ;org h'03ff' ;movlw h'20' ;retlw h'20' end
Komisch, das mit 3ff geht nichtmal im Simulator von Microchip richtig... In einem neuen PIC steht an 0x3ff ein retlw xx , wobei xx der optimale Kalibrierwert für 4MHz ist. Beim Löschen des Chips wird auch dieser Eintrag gelöscht. Die Microchip-Programmiergeräte lesen den Wert erst aus, löschen den Chip und schreiben den alten Wert wieder hinein. Vielleicht macht Vellemann das auch, aber irgendwie ist wohl der Befehl nop (Opcode 0) in deinen Prozessor geraten. Dann kann der Programmer schreiben was er will, es wird immer 0 gelesen. Und mit einem nop findet der Prozessor nicht zurück zum Befehl hinter dem call. Deine Genauigkeitsanforderungen sind für einen RC-Oszillator sowieso viel zu hoch. 10s in 24h wären schon +-462Hz oder etwa 115ppm. Laut Datenblatt sind es aber 4MHz+-80kHz ! Einfache 4MHz-Quarze liegen bei 50-100ppm.
Ok. Alles Klar. Danke für die Hilfe und für die schnelle Infos. 1) Ich werde den 12F629 auf ein "digital i/o" reduzieren... Also für erkennen und speichern von An / Aus... 2) Da mit dem osccal werde ich mal überarbeiten wenn es nötig ist, zur Zeit hält mich das sowas von auf, dass andere Sachen liegen bleiben... (Nicht gut!) 3) Ich werde mal mit Google versuchen etwas über Timer und Genauigkeiten und so zu finden. 4) Alternativer Ansatz für Zeitwerte: Ich versuche einen Zeitgeber für einen Sekundengenauen Taktwert über 24 Stunden suchen und den dann zum "Reseten" von den (es sollen mehrere werden... ) Pics nehmen... 5) Ich könnte sicher auch per Hand den 3ff-Wert wieder auf die vorherige Werte "34 xx" einstellen... Gottseidank liest der V-mann-Progga den Kram aus und speichert den als readout.txt... (oder sowas in der Art... ) Mit freundlichen Güßen aus sonnigem Dresden, xorwf
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.