Forum: Mikrocontroller und Digitale Elektronik PIC 12F 629 ohne *inc -> wo liegt hier der Fehler verborgen?


von Xor W. (xorwf)


Lesenswert?

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

von Smartie (Gast)


Lesenswert?

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.

von tastendrücker (Gast)


Lesenswert?

>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.

von Stefan B. (Gast)


Lesenswert?

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)

von Xor W. (xorwf)


Lesenswert?

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.

von Uwe N. (ulegan)


Lesenswert?

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

von Xor W. (xorwf)


Angehängte Dateien:

Lesenswert?

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

von König Europas (Gast)


Lesenswert?


von Uwe N. (ulegan)


Lesenswert?

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.

von Xor W. (xorwf)


Lesenswert?

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
Noch kein Account? Hier anmelden.