Autor Tema: Ayuda con palabra de configuración para PIC 16F886 en ensamblador  (Leído 4825 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado fernando_2494

  • PIC10
  • *
  • Mensajes: 4
Ayuda con palabra de configuración para PIC 16F886 en ensamblador
« en: 14 de Octubre de 2015, 20:56:10 »
Hola, estoy aprendiendo a programar PICs en ensamblador con un libro enfocado al PIC16F84A, sin embargo me gustaria implementar los programas que aprendo en el PIC16F886, el compilador que uso es MPLAB IDE 8.92, he compilado los programas para el 84A sin ningun problema sin embargo me marca error en el 886, ya modifique el Device en el programa así como la libreria, el error me lo marca en la palabra de configuración, les agradecería si me ayudaran y dijeran que le tengo que poner y quitar y porque y aprovechando preguntarles también si conocen alguna fuente donde pueda aprender más del 886 y/o su familia, gracias de antemano.

Código: ASM
  1. ;***Arranque y Paro de un Motor***
  2. __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
  3. INCLUDE <P16F886.INC>
  4. LIST P=16F886
  5.  
  6.         ORG 0
  7.                 bsf             STATUS, RP0
  8.                 movlw   0xFF           
  9.                 movwf   TRISA
  10.                 clrf    TRISB
  11.                 bcf             STATUS, RP0
  12.                 bcf             PORTB, 0
  13.  
  14. inicio
  15.                 btfss   PORTA, 0       
  16.                 goto    inicio
  17. arranque
  18.                 bsf             PORTB, 0
  19.                 btfss   PORTA, 1
  20.                 goto    arranque       
  21.                 bcf             PORTB, 0
  22.                 goto    inicio
  23.  
  24.         END

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda con palabra de configuración para PIC 16F886 en ensamblador
« Respuesta #1 en: 14 de Octubre de 2015, 21:42:39 »
El MPLAB v8.xx es una vesion vieja, aunque algunos todavia la siguen usando por la velocidad,etc. Yo uso MPLAB X que es el IDE que esta usando Microchip actualmente, aunque es mas lento. Lo bueno que tiene es que tiene una forma facil de poner los fuses, solo seleccionas cuales queres y le das generar codigo y te da el resultado:


Código: ASM
  1. ; PIC16F886 Configuration Bit Settings
  2.  
  3. ; ASM source line config statements
  4.  
  5. #include "p16F886.inc"
  6.  
  7. ; CONFIG1
  8. ; __config 0xFFFF
  9.  __CONFIG _CONFIG1, _FOSC_EXTRC_CLKOUT & _WDTE_ON & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_ON & _IESO_ON & _FCMEN_ON & _LVP_ON
  10. ; CONFIG2
  11. ; __config 0xFFFF
  12.  __CONFIG _CONFIG2, _BOR4V_BOR40V & _WRT_OFF

Por potra parte si queres ver cuales son todos los fuses, tenes que abrir el archivo p16F886.inc , normalmente al final de ese archivo aparecen todas las opciones por ejemplo este fragmento que te paso ahora es de un PIC18F4550, en el .inc aparece esto (que pertenece al CONFIG2L, hay muchos mas ):

Código: ASM
  1. ;----- CONFIG2L Options --------------------------------------------------
  2. _PWRT_ON_2L          EQU  H'FE'    ; PWRT enabled
  3. _PWRT_OFF_2L         EQU  H'FF'    ; PWRT disabled
  4.  
  5. _BOR_OFF_2L          EQU  H'F9'    ; Brown-out Reset disabled in hardware and software
  6. _BOR_SOFT_2L         EQU  H'FB'    ; Brown-out Reset enabled and controlled by software (SBOREN is enabled)
  7. _BOR_ON_ACTIVE_2L    EQU  H'FD'    ; Brown-out Reset enabled in hardware only and disabled in Sleep mode (SBOREN is disabled)
  8. _BOR_ON_2L           EQU  H'FF'    ; Brown-out Reset enabled in hardware only (SBOREN is disabled)
  9.  
  10. _BORV_0_2L           EQU  H'E7'    ; Maximum setting
  11. _BORV_1_2L           EQU  H'EF'    ;
  12. _BORV_2_2L           EQU  H'F7'    ;
  13. _BORV_3_2L           EQU  H'FF'    ; Minimum setting
  14.  
  15. _VREGEN_OFF_2L       EQU  H'DF'    ; USB voltage regulator disabled
  16. _VREGEN_ON_2L        EQU  H'FF'    ; USB voltage regulator enabled

En tu caso en el PIC16F886 solo tenes _CONFIG1 y _CONFIG2, tal cual pase al comienzo del POST

------- Ahora tu programa -----------

El PIC16F84 es muy simple, no tiene NADA, no posee modulos casi. Entonces es facil de aprender. A medida que vas mejorando el PIC traen mas cosas.
En tu caso el PIC16F886 trae un conversor analogico digital (ADC), y al momento del reset el PIC comienza como analogico, es tu deber cambiarlo a digital ( esto solo afecta a los pines que estan marcandos como ANx) en especial el PORTA

Para eso debes poner a 0 el registro ANSEL. Sino tu programa en el PORTA siempre va a leer 0. Te lo digo para que no te sientas frustado si no te anda luego :P
« Última modificación: 14 de Octubre de 2015, 21:47:01 por KILLERJC »

Desconectado fernando_2494

  • PIC10
  • *
  • Mensajes: 4
Re:Ayuda con palabra de configuración para PIC 16F886 en ensamblador
« Respuesta #2 en: 14 de Octubre de 2015, 22:36:26 »
Muchas gracias me ha servido la palabra de configuración,compila ahora sin problemas, también seguí el consejo de desactivar el registro ansel, me pase al banco 3 como esta en las especificaciones, sin embargo parece no funcionar, voya  checar que tenga todo bien conectado, si se te ocurre algo de porque no corre me ayudaría me dijeras :P gracias
Código: ASM
  1. bsf     STATUS, RP0
  2.                 bsf             STATUS, RP1
  3.                 clrf    ANSEL
  4.                 clrf    ANSELH
  5.                 bcf             STATUS, RP0
  6.                 bcf             STATUS, RP1

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda con palabra de configuración para PIC 16F886 en ensamblador
« Respuesta #3 en: 14 de Octubre de 2015, 23:30:01 »
Proba con estos fuses:

Código: ASM
  1. #include "p16F886.inc"
  2.  
  3. ; CONFIG1
  4. ; __config 0xEFD4
  5.  __CONFIG _CONFIG1, _FOSC_INTRC_NOCLKOUT & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_ON & _IESO_ON & _FCMEN_ON & _LVP_OFF
  6. ; CONFIG2
  7. ; __config 0xFFFF
  8.  __CONFIG _CONFIG2, _BOR4V_BOR40V & _WRT_OFF

Utiliza:
- Oscilador Interno (4Mhz se puede aumentar a 8Mhz), sin salida al exterior asi aprovechas un pin ( y no necesitas poner un cristal -obligatorio en el PIC16F84- )
- Desactive el MCLR asi tenes otro pin mas como salida ( y no necesitas del condensador + resistencia + diodo como el PIC16F84 )
- Desactive el WDT el cual podria resetearte el PIC ( es como un seguro por si se queda colgado en alguna parte, pero al comienzo dejemoslo aparte. )
- Desactivado el Low Voltage Programming (LVP)

(A esto lo habia hecho pero cuando lo hice tenia el compilador en C, asi que tuve que pasarlo a ASM para que me de el codigo :P y me olvide cambiarlo antes de pasartelo xD )

Aca te dejo un codigo y te explico los cambios al final.

Código: ASM
  1. ORG 0x00
  2.         GOTO    Start
  3.         ORG 0x04
  4.         RETURN
  5.  
  6.  
  7. Start:
  8.                 ; Configuracion de Entrada/Salida
  9.  
  10.                 BANKSEL TRISA           ; Banco donde esta TRISA (Banco 1)
  11.                 MOVLW   0xFF            
  12.                 MOVWF   TRISA           ; PORTA todas entradas
  13.                 CLRF    TRISB           ; PORTB todas salidas
  14.  
  15.                 ;Configuracion Digital
  16.  
  17.                 BANKSEL ANSEL           ; Banco donde esta ANSEL (Banco 3)
  18.                 CLRF    ANSEL
  19.                 CLRF    ANSELH
  20.                
  21.                 BANKSEL PORTA           ; Banco donde esta PORTA (Banco 0)
  22.  
  23. Inicio:
  24.                 BTFSC   PORTA, 0        ; Si esta en 1 RA0, pongo 1 a RB0
  25.                 GOTO    Inicio
  26.                 BSF     PORTB, 0               
  27. Arranque:
  28.                 BTFSC   PORTA, 1        ; Si esta en 1 RA1, pongo 0 a RB0, sino espero que se presione
  29.                 GOTO    Arranque
  30.                 BCF     PORTB, 0
  31.                 GOTO    Inicio
  32.  
  33.                 END

Al comienzo estan los vectores de reset e interrupcion, en el reset ese PIC comienza en 0x00, y cuando ocurre una interrupcion ejecuta la instruccion de 0x04, si la activas por error esto te salvaria, acostumbrate a ponerlos (aunque no los uses, si usas interrupcion, solo reemplazar el RETURN por el GOTO a tu rutina de interrupcion -esto para mas adelante- ).
BANKSEL es una pseudo-instruccion, no es una instruccion del microcontrolador en si, sino del compilador ASM ( el que pasa el asm en el codigo del PIC ) este va a reemplazar el BANKSEL por los BSF/BCF de los RP1 y RP0. Pero se va a complicar la vida el compilador no vos.
Por ultimo los comentarios, SIEMPRE acostumbrate a los comentarios, asi es mas facil de entender que esta pasando o que hiciste/ o intentaste hacer.
« Última modificación: 14 de Octubre de 2015, 23:33:40 por KILLERJC »


 

anything