TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: JoseLuis2801 en 10 de Noviembre de 2011, 06:48:04
-
Hola a todos,
he echo un programita, para ver las distintas partes controladas que todo va bien, y lo último ha sido incorporar las rutinas partes de escritura y lectura de datos, la lectura , lee 0, la escritura ni caso.
Y escribo exactamente lo mismo que me indica el datasheet del PIC16F886:
w EQU 0h
f EQU 1h
LIST P=16F886
INCLUDE <P16F886.INC>
RET1 EQU 20H
RET2 EQU 21H
RET3 EQU 22H
VAR1 EQU 110H
VAR2 EQU 111H
VAR3 EQU 112H
VAR4 EQU 113H
ADRL EQU 00H
ADRH EQU 03H
ADRL1 EQU 01H
ORG 00H
GOTO INI
ORG 05H
DEMORA1S NOP
BANKSEL PIR1
MOVLW 00h ; CARGA VARIABLES DEMORA
MOVWF RET1
MOVLW 00h
MOVWF RET2
MOVLW 05h
MOVWF RET3
DEC2 DECFSZ RET2 ; RETARDO DE 1SEG.
GOTO DEC2
DECFSZ RET1
GOTO DEC2
DECFSZ RET3 ; 3 BUCLES
GOTO DEC2
BANKSEL EEDAT
RETURN
INI NOP
BANKSEL PIR1
CLRF PORTB
BANKSEL ANSELH
CLRF ANSELH
BANKSEL TRISB
MOVLW 0XF0
MOVWF TRISB
BANKSEL EEDAT
MOVLW 01H
MOVWF VAR1
MOVLW 09H
MOVWF VAR2
MOVLW 06H
MOVWF VAR3
MOVLW 0FH
MOVWF VAR4
WRFLASH NOP
BANKSEL EEADRH ;;;; PAG. 121 DATASHEET
MOVF ADRH,0
MOVWF EEADRH
MOVF ADRL,0
MOVWF EEADR
MOVLW 110H
MOVWF FSR
LOOP MOVF INDF,0
MOVWF EEDATA ;
INCF FSR,1 ; Next byte
MOVF INDF,0 ; Load second data byte into upper
MOVWF EEDATH
INCF FSR,1
BANKSEL EECON1
BSF EECON1,7 ; Point to program memory
BSF EECON1,2
BCF INTCON,7 ; Disable interrupts (if using)
BTFSC INTCON,7
GOTO $-2
MOVLW 55H
MOVWF EECON2
MOVLW 0AAH
MOVWF EECON2
BSF EECON1,1
NOP
NOP
ESP BTFSC EECON1,1
GOTO ESP
BCF EECON1,2
BSF INTCON,7
BANKSEL EEADR
MOVF EEADR,0
INCF EEADR,1 ; Increment address
ANDLW 0FH ; Indicates when sixteen words have been programmed
SUBLW 0FH ; 0x0F = 16 words 07H SON 8 WORDS
BTFSS STATUS,2 ; Exit on a match,
GOTO LOOP
A0_VAR1_2 NOP
MOVLW 08H
MOVWF VAR1
MOVLW 08H
MOVWF VAR2
RDFLASH NOP
BANKSEL EEADR ;;;; PAG. 116 DATASHEET
MOVF ADRH,0
MOVWF EEADRH
MOVF ADRL,0
MOVWF EEADR
BANKSEL EECON1
BSF EECON1,7
BSF EECON1,0 ;;; LEE DE LA EEPROM MAX.
NOP
NOP
BANKSEL EEDAT
MOVF EEDAT,0
MOVWF VAR1
BANKSEL EEADR ;;;; PAG. 116 DATASHEET
MOVF ADRH,0
MOVWF EEADRH
MOVF ADRL1,0
MOVWF EEADR
BANKSEL EECON1
BSF EECON1,7
BSF EECON1,0 ;;; LEE DE LA EEPROM MAX.
NOP
NOP
BANKSEL EEDAT
MOVF EEDAT,0
MOVWF VAR2
LUZMAS NOP
CALL DEMORA1S
MOVF VAR1,0
MOVWF PORTB
CALL DEMORA1S
CLRF PORTB
CALL DEMORA1S
MOVF VAR2,0
MOVWF PORTB
CALL DEMORA1S
CLRF PORTB
CALL DEMORA1S
MOVF VAR3,0
MOVWF PORTB
CALL DEMORA1S
CLRF PORTB
CALL DEMORA1S
MOVF VAR4,0
MOVWF PORTB
CALL DEMORA1S
CLRF PORTB
GOTO LUZMAS
FIN NOP
END
*******************************************************************
Con el rutinita de etiqueta A0_VAR1_2 , es como compruebo que no se escribe nada , porqweu al leer la flash lee 0h, y escribe en var1 y var 2 un 0, VAR1=VAR2=0. Sino encendería el led3. En el puerto B, los bits 3:0 programados como salida , hay leds . Y iluminan bien siempre, pero sin hacer caso a la escritura de la Flash. 1 vez parpadean los 4 a la vez (portb=F ), y otra los 2 centrales (portb = 6) , los otros 2 tramos de 1 seg que tenía que iluminar leds, nada.
El registro de conf. esta bien, permitiendo escribir a partir de 0800h.
No se que pasa, a ver si alguien me puede dar algo de luz.
Pudiera ser que en el registro de configuracion, el modo de programacion debiera ser el LVP , y no el MCLR/Vpp como tengo seleccionado ? XQ no me grab el programa en ese modo ( el LVP) con el PICKIT3.
Gracias de antemano
un saludo
-
Hola, me respondo a mi mismo, he actualizado algo el programa del post de arriba por el tema del PCLATCH, para que todo el código y datos a escribir estén en la misma pagina 0.
Sigue sin escribir, ahora, se iluminan los 4 en 3 ocasiones, y los 2 centrales en una. :shock: Entre iluminaciones la consabida pausa de 1 seg.
He buscado y he visto que hay algunos mensajes en este foro relacionados con mi tema, más tarde los leeré.
un saludo
El finde doy con ello seguro.
-
Creo que el problema esta aqui:
LOOP MOVF INDF,0
MOVWF EEDATA ;
INCF FSR,1 ; Next byte
MOVF INDF,0 ; Load second data byte into upper
MOVWF EEDATH
INCF FSR,1
BANKSEL EECON1
BSF EECON1,7 ; Point to program memory
BSF EECON1,2
BCF INTCON,7 ; Disable interrupts (if using)
BTFSC INTCON,7
GOTO $-2
MOVLW 55H
MOVWF EECON2
MOVLW 0AAH
MOVWF EECON2
BSF EECON1,1
NOP
NOP
No te deja activar EECON1,1, lo que no se es el por que.
bit 1 WR: Write Control bit
1 = Initiates a write cycle (The bit is cleared by hardware once write is complete. The WR bit can only
be set, not cleared, in software.)
0 = Write cycle to the data EEPROM is complete
El data sheet dice que no se puede clarear por soft pero si setear, pero a ti no te deja setearlo.
-
Si efectivamente, podría ser, voy a poner esto a ver si el PIC se queda tontuco:
lahemoscagao :D BTFSS EECON1,1
GOTO lahemoscagao :D
Luego, o yo no me entero o esta un poco ambiguo el tema de los bloques:
Sixteen words of Flash are erased, then eight buffers are transferred to Flash automatically after this word is written. Y digo yo, no son 8 words, cada una de 14 bits que ocupa 2 bytes, y no 16 palabras o words, creo. :rolleyes:
Escribe al buffer todos al final, no durante, el final , cuando los ultimos 3 bits del registro ADDR son 111 :shock:
MIra:
To transfer data from the buffer registers to the program
memory, the EEADR and EEADRH must point to the last
location in the eight-word block (EEADR<2:0> = 111).
Bueno a ver si me entero bien. He visto tb un link por ahi que dicen que el datasheet el 16F877 relativo al mismo asunto, esta mal.
un saludo
-
oK ok ok, :-/, he visto varios fallos,
1º de conceptos basicos :oops:, que hago yo poniendo esto:
ADRL EQU 00H
ADRH EQU 03H
los voy a cargar directos:
MOVLW 03H
MOVWF EEADRH
MOVLW 00H
MOVWF EEADR
Claro, no se me cargaban con Los valores adecuados los registros EEADR Y EEADRH, luego que hago yo cargando el registro FSR coin el valor 110h, estoy de la olla o que :rolleyes:, creo que debe ser 10h, porque la posicion 110h, es la 10h de su banco, creo, de todas formas mirare en el datasheet de ese registro, desde luego lo que no puede ser es 110h, aunque en el debug he visto que me carga el FSR con 10h, digo yo que sera por que como son las dos ultimas cifras, coinciden.
Y ya he visto el hilo, según comprobo un forero hace ya mas de 6 meses: lo que falta es,
MOVLW 00H ; AÑADIDO AL
MOVWF EEDATH ; DATASHEET
Hay que poner a 0 esos 6 bits, aunque era relativo al 16F876 o 77, no recuerdo y ya he cerrado el enlace. NO se si ocurrira lo mismo en el mio.
Luego sigo que esta noche me ha de rular OK.
-
:-/ :-/ :-/ :-/ POR FIN :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/
Ha quedado así:
w EQU 0h
f EQU 1h
LIST P=16F886
INCLUDE <P16F886.INC>
RET1 EQU 20H
RET2 EQU 21H
RET3 EQU 22H
VAR1 EQU 110H
VAR2 EQU 112H
VAR3 EQU 114H
VAR4 EQU 116H
ADDRHIGH EQU 120H
ADDRLOW EQU 121H
ADDRLOWPLUS EQU 122H
ORG 00H
GOTO INI
ORG 05H
DEMORA1S NOP
BANKSEL PIR1
MOVLW 00h ; CARGA VARIABLES DEMORA
MOVWF RET1
MOVLW 00h
MOVWF RET2
MOVLW 05h
MOVWF RET3
DEC2 DECFSZ RET2 ; RETARDO DE 1SEG.
GOTO DEC2
DECFSZ RET1
GOTO DEC2
DECFSZ RET3 ; 3 BUCLES
GOTO DEC2
BANKSEL EEDAT
RETURN
INI NOP
BANKSEL PIR1
CLRF PORTB
BANKSEL ANSELH
CLRF ANSELH
BANKSEL TRISB
MOVLW 0XF0
MOVWF TRISB
BANKSEL EEDAT
MOVLW 01H
MOVWF VAR1
MOVLW 09H
MOVWF VAR2
MOVLW 06H
MOVWF VAR3
MOVLW 0FH
MOVWF VAR4
MOVLW 03H
MOVWF ADDRHIGH
MOVLW 00H
MOVWF ADDRLOW
MOVLW 01H
MOVWF ADDRLOWPLUS
WRFLASH NOP
BANKSEL EEADRH ;;;; PAG. 121 DATASHEET
MOVF ADDRHIGH,0
MOVWF EEADRH
MOVF ADDRLOW,0
MOVWF EEADR
BSF STATUS,7 ; SELECIONAMOS BANCOS 2 Y 3
MOVLW 10H ; EN CONCRETO EL 2 DIRECCION 110H
MOVWF FSR
LOOP MOVF INDF,0
MOVWF EEDATA
INCF FSR,1
MOVF INDF,0 ; Load second data byte into upper
MOVWF EEDATH
INCF FSR,1
BANKSEL EECON1
BCF INTCON,7 ; Disable interrupts (if using)
BSF EECON1,7 ; Point to program memory
BSF EECON1,2
MOVLW 55H
MOVWF EECON2
MOVLW 0XAA
MOVWF EECON2
BSF EECON1,1
NOP
NOP
BCF EECON1,2
BSF INTCON,7
BANKSEL EEADR
MOVF EEADR,0
INCF EEADR,1 ; Increment address
ANDLW 0FH ; MODIFICADO A 07, YA QUE
SUBLW 0FH ; HE SUPRIMIDO UN INC FSR,1
BTFSS STATUS,2 ; Exit on a match,
GOTO LOOP
A0_VAR1_2 NOP
MOVLW 08H
MOVWF VAR1
MOVLW 08H
MOVWF VAR2
RDFLASH NOP
BANKSEL EEADR ;;;; PAG. 116 DATASHEET
MOVF ADDRHIGH,0
MOVWF EEADRH
MOVF ADDRLOW,0
MOVWF EEADR
BANKSEL EECON1
BSF EECON1,7
BSF EECON1,0 ;;; LEE DE LA EEPROM MAX.
NOP
NOP
BANKSEL EEDAT
MOVF EEDAT,0
MOVWF VAR1
BANKSEL EEADR ;;;; PAG. 116 DATASHEET
MOVF ADDRHIGH,0
MOVWF EEADRH
MOVF ADDRLOWPLUS,0
MOVWF EEADR
BANKSEL EECON1
BSF EECON1,7
BSF EECON1,0 ;;; LEE DE LA EEPROM MAX.
NOP
NOP
BANKSEL EEDAT
MOVF EEDAT,0
MOVWF VAR2
LUZMAS NOP
CALL DEMORA1S
MOVF VAR1,0
MOVWF PORTB
CALL DEMORA1S
CLRF PORTB
CALL DEMORA1S
MOVF VAR2,0
MOVWF PORTB
CALL DEMORA1S
CLRF PORTB
CALL DEMORA1S
MOVF VAR3,0
MOVWF PORTB
CALL DEMORA1S
CLRF PORTB
CALL DEMORA1S
MOVF VAR4,0
MOVWF PORTB
CALL DEMORA1S
CLRF PORTB
GOTO LUZMAS
FIN NOP
END
:-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/