Program an Do

79
PROGRAMANDO Electronica, Microcontroladores, Computadores Con la tecnología de Traductor de Google domingo, 18 de julio de 2010 GUIA DE INICIO RAPIDO PARA PROGRAMAR MICROCONTROLADORES PIC DE MICROCHIP Que es un microcontrolador? Inicialmente podríamos decir que un microcontrolador es un circuito integrado que se puede programar para que haga lo que nosotros queremos, pero es eso y mucho mas, es una computadora, claro esta que del tamaño de un circuito integrado, pero hace las mismas funciones que esta. Un microcontrolador permite entrada de información (entradas), tiene la capacidad de procesar esa información, y entrega los resultados del procesamiento(salida), siendo este el esquema básico de una computadora, solo que a una escala muy pequeña. Que necesitamos para hacer funcionar un microcontrolador? Un programa que le diga que es lo que tiene que hacer, esto es lo mismo que hacen los programas de computadora, le dicen a esta que hacer. Y como hacemos estos programas? Los microcontroladores son sistemas digitales, por lo tanto entienden unos y ceros, pues entonces sera cuestión de escribir el programa en secuencias de unos y ceros, lo que a nosotros los humanos nos resultaría una tarea muy complicada, entonces para ello se inventaron los lenguajes de programación, que son mas fáciles de entender por nosotros y nos facilitaran la tarea de escribir los programas, para el caso de los microcontroladores cada fabricante proporciona un lenguaje con el cual se pueden controlar estas maquinas llamado lenguaje Ensamblador( Assembler ). mas adelante veremos que también se pueden programar con otros lenguajes. Fabricantes de microcontroladores hay muchos, Freescale(Motorola), Intel, Microchip, Atmel, entre otros. Yo me ocupare de los que fabrica la empresa Microchip, mas conocidos como PIC's. La razón para usarlos es lo fácil que es conseguirlos, la variedad y lo económicos que resultan, ya que hay muchas referencias de PIC's y las herramientas para trabajar con ellos son muy fáciles de conseguir. Para empezar no dirigimos a la pagina de Microchip y descargamos el programa MPLAB IDE (http://www.microchip.com ), este programa es para escribir en ensamblador lo que queremos que haga el microcontrolador y después traducirlo al lenguaje que entiende la maquina, a este proceso se le denomina comúnmente “compilar el programa” , claro que este programa tiene muchas mas funciones, también nos permite simular el programa, que es muy útil para encontrar errores cuando no nos funciona como queremos. Bueno la idea era explicar la forma de programar un microcontrolador de forma fácil y no extenderme tanto, pero resulta muy difícil por que este tema es muy extenso, así que voy a empezar y espero que practicando vamos aprendiendo. Instalamos el MPLAB En windows vamos a : Inicio-Programas-Microchip-MPLAB IDE En Linux

Transcript of Program an Do

Page 1: Program an Do

PROGRAMANDOElectronica, Microcontroladores, Computadores

Con la tecnología de  Traductor de Googledomingo, 18 de julio de 2010

GUIA DE INICIO RAPIDO PARA PROGRAMAR MICROCONTROLADORES PIC DE MICROCHIP

Que es un microcontrolador?

Inicialmente podríamos decir que un microcontrolador es un circuito integrado que se puede programar para que haga lo que nosotros queremos, pero es eso y mucho mas, es una computadora, claro esta que del tamaño de un circuito integrado, pero hace las mismas funciones que esta.Un microcontrolador permite entrada de información (entradas), tiene la capacidad de procesar esa información, y entrega los resultados del procesamiento(salida), siendo este el esquema básico de una computadora, solo que a una escala muy pequeña.

Que necesitamos para hacer funcionar un microcontrolador?Un programa que le diga que es lo que tiene que hacer, esto es lo mismo que hacen los programas de computadora, le dicen a esta que hacer.

Y como hacemos estos programas?Los microcontroladores son sistemas digitales, por lo tanto entienden unos y ceros, pues entonces sera cuestión de escribir el programa en secuencias de unos y ceros, lo que a nosotros los humanos nos resultaría una tarea muy complicada, entonces para ello se inventaron los lenguajes de programación, que son mas fáciles de entender por nosotros y nos facilitaran la tarea de escribir los programas, para el caso de los microcontroladores cada fabricante proporciona un lenguaje con el cual se pueden controlar estas maquinas llamado lenguaje Ensamblador( Assembler ). mas adelante veremos que también se pueden programar con otros lenguajes.

Fabricantes de microcontroladores hay muchos, Freescale(Motorola), Intel, Microchip, Atmel, entre otros. Yo me ocupare de los que fabrica la empresa Microchip, mas conocidos como PIC's. La razón para usarlos es lo fácil que es conseguirlos, la variedad y lo económicos que resultan, ya que hay muchas referencias de PIC's y las herramientas para trabajar con ellos son muy fáciles de conseguir.

Para empezar no dirigimos a la pagina de Microchip y descargamos el programa MPLAB IDE (http://www.microchip.com ), este programa es para escribir en ensamblador lo que queremos que haga el microcontrolador y después traducirlo al lenguaje que entiende la maquina, a este proceso se le denomina comúnmente “compilar el programa” , claro que este programa tiene muchas mas funciones, también nos permite simular el programa, que es muy útil para encontrar errores cuando no nos funciona como queremos.

Bueno la idea era explicar la forma de programar un microcontrolador de forma fácil y no extenderme tanto, pero resulta muy difícil por que este tema es muy extenso, así que voy a empezar y espero que practicando vamos aprendiendo.

Instalamos el MPLAB

En windowsvamos a : Inicio-Programas-Microchip-MPLAB IDE

En LinuxLo instalamos con el Wine por que no tenemos una versión de este entorno gráfico para Linux, claro que si en modo consola. Existen otras formas de trabajar los PIC's en Linux como el Piklab, que es un entorno gráfico Open Source.

Esta es la vista al iniciar el MPLAD IDE, inicialmente vamos a hacer un programa sencillo, no crearemos un proyecto. Podemos cerrar las dos ventanas internas que aparecen.

Page 2: Program an Do

Esta es la vista del PikLab para Linux

Vamos a File-New y nos abre una hoja de un editor de texto donde escribiremos nuestro primer programa. Aparece la ventana con el nombre Untitled, por que no hemos dado un nombre a nuestro programa.

Los archivos con el código de nuestro programa (código fuente) se deben guardar con la extensión .ASM, el programa que vamos a hacer como ejemplo hará que el micro prenda y apague un LED conectado en uno de sus pines ( el pin RB0 en este caso), este es como el “hola mundo” en la programación de microcontroladores, así que lo llamaremos onoff.asm.

En este punto debemos ya escoger que referencia de microcontrolador vamos a trabajar, ya que como habíamos dicho antes hay muchas referencias. El mas básico y mas usado de todos lo PIC para el aprendizaje es el PIC 16F84A, por lo que entonces el primer programa lo voy a hacer con este microcontrolador, pero después seguiré usando el PIC 16F88, ya que es un PIC mas potente que el anterior.

Empecemos copiando este código en el MPLAB

                  LIST P=16F84A              INCLUDE P16F84A.INC

              __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC

              ORG      00              GOTO     CONFIGURACION

CONFIGURACION NOP              BANKSEL  TRISA

Page 3: Program an Do

              CLRF     TRISB              BANKSEL  PORTB              CLRF     PORTB

CICLO         BSF      PORTB,0              BCF      PORTB,0              GOTO     CICLO

              END

Noten que se mantiene un orden respecto a las columnas (3 columnas), esto lo hacemos con el tabulador y es muy importante que se respete este orden. Después de haber copiado el programa, lo guardamos, en la opción File Name escribimos el nombre onoff.asm(no olviden la extensión .asm) y el la opción Files of Tipes seleccionamos la segunda opción “Assembly Source Files (*.asm.......) y le damos guardar(Save).

Notemos como al guardarlo cambian los colores del texto en el código.

Page 4: Program an Do

Ya tenemos listo el código fuente. Recordemos que este esta escrito en el lenguaje de programación llamado Ensamblador o Assembler, y que la maquina no entiende esto, por eso lo debemos traducir para que la maquina lo entienda (compilar ) y para ello debemos seguir los siguientes pasos:

Seleccionar el microcontrolador en la opción Configure—Select Device nos aparece la siguiente ventana y seleccionamos nuestro PIC16F84A.

Compilar el programa con la opción Project—Quickbuild onoff.asmy si todo sale bien no aparece esta ventana diciendo que la compilación fue un éxito, que tuvo 0 errores y BUILD SUCCEEDED

Ya tenemos nuestro programa listo para enviárselo al PIC, pero de eso nos ocuparemos mas adelante, por ahora nos interesa saber como se puede hacer la simulación en el MPLAB.

Vamos Debugguer—Select Tool—MPLAB SIM. Esto es para activar el simulador.

Para la simulación tenemos las siguientes opciones que aparecen en el menu Debugguer y nos van a ser de mucha utilidad

Processor Reset F6 Reset del procesadorStep Into F7 Simulación paso a paso

Page 5: Program an Do

Steo Over F8 Simulación paso a paso realizando las subrrutinas en tiempo real( las llamadas con CALL)

Al seleccionar el MPLAB SIM y presionar F6 tenemos la siguiente vista, noten la FLECHA VERDE que aparece en la linea 7 despues de la sentencia “ORG 00” (llamado vector de reset), esto es por que alli es donde empieza el procesador despues de un reinicio(reset).

Si presionamos F7 vemos como el programa va avanzando siguiendo las ordenes que dimos al microcontrolador.Como lo mensione al inicio este programa enciende y apaga un led conectado en el pin RB0 del micro, para observar esto en la simulacion hacemos lo siguiente:

vamos al menu View—Watch y obtenemos la siguiente vista

Vamos a organizar las dos ventanas para que se puedan ver al mismo tiempo y podamos observar como se comporta el microcontrolador en la simulación.

Page 7: Program an Do

así ya tenemos todo listo para simular nuestro primer programa. 

Básicamente las siguientes lineas de código son las que hacen prender y apagar el LED:

CICLO       BSF       PORTB,0            BCF       PORTB,0            GOTO    CICLO

Para entender la simulación debemos saber que los pines del microcontrolador están relacionados con algo que se llaman puertos de entrada/salida, nuestro micro tiene dos puertos el PORTA y el PORTB (así los bautizo el fabricante), cada uno de estos puertos esta dispuesto internamente en el micro como un Byte ( 8 bit's, se acuerdan de la electrónica digital, aquí aplica!!), por eso es que en la gráfica del Watch aparecen al frente del PORTB y debajo de la palabra Binary 8 ceros ( 00000000 ) que representan un Byte ( también se le llama REGISTRO), que a su vez representa 8 pines del micro asociados con el PORTB, osea que cada bit del registro (Byte) PORTB es un pin del circuito integrado ( del PIC), que trabalenguas, miremos la siguiente tabla:

PORTB

RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0

Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0

Presionemos F7 hasta llegar(la flecha verde se mueve cada vez que presionamos F7) a la linea “GOTO BSF PORTB,0”, note que el RB0 es igual a 0 (cero)

presionemos F7 y vemos como cambia a 1 (uno).

Presionemos F7

presionamos F7 y vemos como se repite este ciclo una y otra vez, logrando con esto que el LED conectado al pin RB0 encienda y apague.Presionamos F7 y vemos como la flecha verde se posiciona de nuevo al frente de ciclo.

Page 8: Program an Do

Con esto doy por terminada esta guiá de iniciación a la programación de microcontroladores PIC, ya con esto lograremos escribir y simular nuestros programas, en una próxima guiá describiré los pasos para lograr hacer que funcione en un board con un micro de verdad( y no en simulaciones)

Usted puede compiar, distribuir y/o modificar este doucmento bajo los terminos de la GFDL (licencia de documentacion libre de GNU) versión 1.3 o superior publicada por la fundacion de sontware libre.

Copyright (C) Edwin Espinosa Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".

PROGRAMANDOElectronica, Microcontroladores, Computadores

Con la tecnología de  Traductor de Googleviernes, 13 de agosto de 2010

Fusibles de configuracion "Bit's de configuracion" de los PIC'sLos bit's de configuracion o mas comunmente llamados "fusibles" permiten confugurar ciertas funciones en los microcontroladores PIC, como el tipo de cristal para el oscilador, permiten proteger el codigo en el micro, entre muchas funciones. La cantidad de funciones que se pueden configurar con los fusibles dependen del microcontrolador, si tenemos en el 16F84A  4 funciones, en el 16F88 son alrededor de 13 funciones.

Bueno y para que sirven?Como lo dije antes son para configurar algunas funciones del micro, como el tipo de oscilador, la proteccion de codigo, habilitar el perro guardian ( por que si no este los muerde), habilitar el reset maestro, habilitar un reset inicial, habilitar reset por bajo voltage en la fuente, y otros que como les dije depende del micro usado.

Ahhh y cuando se usan??En el momento en que se quiere programar el micro se le deben configurar los fusibles ( esto es usando un software como el WINPIC800,  me parece necesario agradecer a los creadores de este software quienes nos permiten descargarlo y usarlo sin ningun problema, www.winpic800.com,  GRACIAS!!!!!!) y si estamos usando alguno de los programadores de MICROCHIP como el pickit2 o el pickit3 debemos escribir la configuracion de estos fusibles en la cabecera de nuestro fuente antes de compilar.

Como se que fusibles usa  mi pequeño monstruo?Como siempre digo "pues en el manual del micro", jeje suena obvio, y los podes obtener del fichero que incluimos en la cabecera del fuente,  el  P16F88.INC por ejemplo, que se encuentra en la carpeta "MPASM suite" que esta dentro de la carpeta "microchip" donde instalamos el MPLAB, ojo que el nombre del fichero depende del micro.

De los ficheros antes mencionados obtube lo siguiente:

Para el 16F84A

_CP_ON                       EQU     H'000F'_CP_OFF                      EQU     H'3FFF'

Page 9: Program an Do

_PWRTE_ON                    EQU     H'3FF7'_PWRTE_OFF                   EQU     H'3FFF'_WDT_ON                      EQU     H'3FFF'_WDT_OFF                     EQU     H'3FFB'_LP_OSC                      EQU     H'3FFC'_XT_OSC                      EQU     H'3FFD'_HS_OSC                      EQU     H'3FFE'_RC_OSC                      EQU     H'3FFF'

de donde se arma nuestra palabra de configuracion anteponiendo la directiva  "__CONFIG"

__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF &  _XT_OSC

Que es lo que debemos poner en la cabecera del fuente.

Aqui va la del 16F88

_CONFIG1               EQU     H'2007'_CONFIG2                EQU     H'2008'

;Configuration Byte 1 Options_CP_ALL                               EQU     H'1FFF'_CP_OFF                              EQU     H'3FFF'_CCP1_RB0                              EQU     H'3FFF'_CCP1_RB3                              EQU     H'2FFF'_DEBUG_OFF                              EQU     H'3FFF'_DEBUG_ON                               EQU     H'37FF'_WRT_PROTECT_OFF               EQU     H'3FFF' ;No program memory write protection_WRT_PROTECT_256               EQU     H'3DFF' ;First 256 program memory protected_WRT_PROTECT_2048            EQU     H'3BFF' ;First 2048 program memory protected_WRT_PROTECT_ALL             EQU     H'39FF' ;All of program memory protected_CPD_ON                               EQU     H'3EFF'_CPD_OFF                               EQU     H'3FFF'_LVP_ON                              EQU     H'3FFF'_LVP_OFF                              EQU     H'3F7F'_BODEN_ON                               EQU     H'3FFF'_BODEN_OFF                              EQU     H'3FBF'_MCLR_ON                              EQU     H'3FFF'_MCLR_OFF                              EQU     H'3FDF'_PWRTE_OFF                              EQU     H'3FFF'_PWRTE_ON                               EQU     H'3FF7'_WDT_ON                              EQU     H'3FFF'_WDT_OFF                              EQU     H'3FFB'_EXTRC_CLKOUT                 EQU     H'3FFF'_EXTRC_IO               EQU     H'3FFE'_INTRC_CLKOUT               EQU     H'3FFD'_INTRC_IO                              EQU     H'3FFC'_EXTCLK                               EQU     H'3FEF'_HS_OSC                              EQU     H'3FEE'_XT_OSC                                EQU     H'3FED'_LP_OSC                               EQU     H'3FEC'

;Configuration Byte 2 Options_IESO_ON                               EQU     H'3FFF'_IESO_OFF                               EQU     H'3FFD'_FCMEN_ON                               EQU     H'3FFF'_FCMEN_OFF                              EQU     H'3FFE'

y la palabra seria algo como esto:

__CONFIG    _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _MCLR_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC

;Program Configuration Register 2__CONFIG    _CONFIG2, _IESO_OFF & _FCMEN_OFF

Si necesitan de otro micro la pueden consultar el el fichero del micro como les comente antes, ahhh  bueno pues!!!! me pueden escribir yo se las pongo aqui.Publicado por edwtron en 10:06 

Page 10: Program an Do

Enviar por correo electrónicoEscribe un blogCompartir con TwitterCompartir con FacebookEtiquetas: 16F84A, 16F88, bit's, cristal, fusibles, memoria, microchip, microcontrolador, MPLAB IDE,oscilador, perro guardian

1 comentario:

1.

Danny 23 de noviembre de 2010 23:08

Socio usted es el mejor...

Excelentes esas plantillas...

Monta por favor herramientas de manejo del C para pics...

Responder

Entrada más reciente Entrada antigua Página principal

Suscribirse a: Enviar comentarios (Atom)Ajedrez

Etiquetas

12F675 16F84A 16F88 16f886 AD analogo Arduino  assembler atmel basico binario bit's  Byte C++ circuito circuito integrado codeblocks  compilar contador control conversor cristal  debugger desborde digital display ejempl

o ensamblador  frecuencia Freescale fusibles  harware libre hola

mundo instalacion instrucciones  interrupcion interrupciones java LCD  LED maquina memoria microchip microcontrolador  microcontroladores modos  modulos lcd monitor MPLAB IDE multiplexion  netbeans oscilador P12F629 p16f88 p16f883  periodo perro

guardian PIC Piklab plantilla  plataforma potencia potenciometro programacion  Pulsador PWM Rutinas secuenciador  simulacion software temporizador timer  TMR0 USART

Sigueme en tu e-mail

Archivo del blog

►   2012 (22)

▼   2010 (13)

o ►   noviembre (1)

o ►   octubre (3)

o ►   septiembre (2)

o ▼   agosto (2)

Modulos LCD con PICs

Fusibles de configuracion "Bit's de configuracion"...

o ►   julio (5)

Enlaces http://taller-electronica.blogspot.com http://www.debian.org/ http://es.wikipedia.org http://www.php.net/ http://c.conclase.net/ http://www.todopic.com.ar/ http://www.programacion.com/ http://www.securitybydefault.com/ http://www.microchip.com http://www.java.net/ http://www.python.org/

SociableSeleccion Youtube

Submit

Page 11: Program an Do

con la tecnología de

Entradas populares

Contador de 0 a 99 con PICActualizado  21 de junio de 2012 22:48 Implementacion de un contador de 0 a 99 con dos display de 7 segmentos y microcontrolador usando la...

Fusibles de configuracion "Bit's de configuracion" de los PIC's Los bit's de configuracion o mas comunmente llamados "fusibles" permiten confugurar ciertas funciones en los microcontroladore...

GUIA DE INICIO RAPIDO PARA PROGRAMAR MICROCONTROLADORES PIC DE MICROCHIPQue es un microcontrolador? Inicialmente podríamos decir que un microcontrolador es un circuito integrado que se puede programar para que ...

Contador de 0 a 99 con pulsadoresEl contador es de 0 a 99 usando la tecnica de la multiplexion, tiene un pulsador para la cuenta ascendente y otro para la cuenta descendente...

Contador ascendente y descendente con pulsadoresEl circuito tiene dos pulsadores, ascendente y descendente Circuito esquemático Código fuente     LIST P=16F886     INCLUDE P16...

El timer TMR0 en los PIC con ejemploEl timer TMR0 en los PIC Es un modulo que sirve como contador o como temporizador de 8 bit's. Funcionando como temporizador el TMR0...

xorwf f,d Hace una operacion or exclusiva entre el registro W y el registro F y el resultado lo almacena en d, y d puede ser W o F. tabla de verdad ...

Plantilla para un programa en ensamblador con el PIC 16f88 A continuacion  el codigo fuente base para un programa con microcontroladores PIC en ensamblador, seria interesante que lo guardaran para te...

Conversor Analogo Adigital con PIC 16F886En una entrada anterior usamos el conversor análogo a digital del microcontrolador PIC 12f675 (  http://xorwf.blogspot.com/2012/06/conversor...

Page 12: Program an Do

PROGRAMANDOElectronica, Microcontroladores, Computadores

Con la tecnología de  Traductor de Googlemartes, 31 de agosto de 2010

Modulos LCD con PICs;Los modulos LCD son otra opcion para la visualizacion de datos, diferente a los display de 7 segmentos, los modulos LCD tienen sus procpios controladores  quienes interpretan las ordenes y memoria donde almacenan los simbolos que se quieren visualizar. Usan el codigo de caracteres ASCII.

vista frontal

vista trasera

;Es un estandar que tengan 14 pines, aunque algunos tienen dos mas para el control de la luz (back litgh) los pines 15 y 16

NOMBRE DE LOS PINES

;  Vss   VDD   contraste    R/S   R/W  enable     DO    D1    D2     D3    D4           ;   1         2            3             4      5         6             7      8       9      10      11 

12      13     14   D5     D6    D7   

DESCRIPCION DE LOS PINES

; Vss    GND

; VDD    +5v

;CONTRASTE    Aumenta o disminuye el contraste del modulo, se puede conectar un potenciometro de 10K, los extremos a +5v y GND y el centro al este PIN

;R/S    Se indica si es un dato o una orden lo que se le quiere enviar al modulo     0 = instruccion,   1 = dato

Page 13: Program an Do

;R/W    Se indica la operacion es de escritura o de lectura.     0 = escritura,   1 = lectura     normalmente lo mantenemos con un cero '0'

;ENABLE    Habilita el modulo para cualquier operacion.

;DO....D7    Se escribe el dato o el comando que se quiere dar al modulo.

UTILIZACION

Entre las ordenes y los datos que se le envian al modulo es necesario agregarretardos, segun los fabricantes son del orden de los microsegundos, yo voy usar retardos de 1ms para todo el programa.

    INICIALIZACION

Para el funcionamiento es necesario primero inicializar el modulo.Se deben seguir los siguientes pasos:

    1   RS = 0

    2    E = 0

    3    cargar el comando para configurar el modo de funcionamiento en 0..D7           comunicacion a 8 bits           usar las dos lineas del modulo           tamano del caracter  7x5

    4   E = 1

    5    espera un tiempo  ( 1ms)

    6   E = 0

    7  cargo comando

        enciendo el LCD        enciendo el cursor        cursor intermitente

    8   E = 1

    9    espera un tiempo  ( 1ms)

    10   E = 0                revisar el manual para mas comandos        y todo listo

    este es el pedazo de codigo que hace lo indicado

    BCF           PORTA,0    ;RS = 0    BCF           PORTA,1    ;E = 0    MOVLW    B'00111000'    ;8 BITS 2 LINEAS 7X5    MOVWF    PORTB       BCF           PORTA,0    ;RS=0    BSF           PORTA,1    ;E=1 HABILITO ESCRITURA    CALL        RET_1MS    BCF           PORTA,1    ;E = 0    CALL        RET_1MS    MOVLW    B'00001111'    ;ON LCD, ON CURSOR, ON INTER       MOVWF    PORTB       BCF           PORTA,0    ;RS=0    BSF           PORTA,1    ;E=1 HABILITO ESCRITURA    CALL        RET_1MS    BCF          PORTA,1    ;E = 0    CALL        RET_1MS

Page 14: Program an Do

    ESCRIBIR UN DATO

    1  Cargo el dato en D0 a D7

    2  RS = 1

    3  E = 1

    4  espero un momento

    5  E = 0

    ejemplo visualizando la letra E

    MOVLW    A'E'    MOVWF    PORTB    BSF           PORTA,0    BSF           PORTA,1    CALL        RET_10MS    BCF          PORTA,1    CALL        RET_10MS

circuito de prueba  click para ver grande

CODIGO DE PRUEBA COMPLETO       

    LIST    P=16F88    INCLUDE    P16F88.INC    ERRORLEVEL -302       CBLOCK    0X20    PDel0 , PDel1    ENDC

    ORG    00    GOTO    CONFIGURACION;Retardo geneerado con el PCIDEL, agradezco a su autor;RET_10MS  movlw     .8        ; 1 set number of repetitions (B)        movwf     PDel0     ; 1 |PLoop1  movlw     .249      ; 1 set number of repetitions (A)        movwf     PDel1     ; 1 |PLoop2  clrwdt              ; 1 clear watchdog        clrwdt              ; 1 cycle delay        decfsz    PDel1, 1  ; 1 + (1) is the time over? (A)        goto      PLoop2    ; 2 no, loop        decfsz    PDel0,  1 ; 1 + (1) is the time over? (B)        goto      PLoop1    ; 2 no, loopPDelL1  goto PDelL2         ; 2 cycles delayPDelL2  clrwdt              ; 1 cycle delay        return              ; 2+2 Done

RET_1MS  movlw     .248      ; 1 set number of repetitions        movwf     PDel0     ; 1 |PLoop01  clrwdt              ; 1 clear watchdog

Page 15: Program an Do

        decfsz    PDel0, 1  ; 1 + (1) is the time over?        goto      PLoop01    ; 2 no, loopPDelL11  goto PDelL21         ; 2 cycles delayPDelL21  clrwdt              ; 1 cycle delay        return              ; 2+2 Done

CONFIGURACION  NOP    BANKSEL    ADCON1    CLRF           ANSEL    CLRF          TRISA    CLRF          TRISB    BANKSEL    ADCON0    CLRF           PORTA    CLRF           PORTB       CALL        RET_1MS    BCF          PORTA,0    ;RS = 0    BCF          PORTA,1    ;E = 0    MOVLW    B'00111000'    ;8 BITS 2 LINEAS 7X5    MOVWF    PORTB       BCF           PORTA,0    ;RS=0    BSF           PORTA,1    ;E=1 HABILITO ESCRITURA    CALL         RET_1MS    BCF          PORTA,1    ;E = 0    CALL        RET_1MS       MOVLW    B'00001111'    ;ON LCD, ON CURSOR, ON INTER       MOVWF    PORTB       BCF           PORTA,0    ;RS=0    BSF           PORTA,1    ;E=1 HABILITO ESCRITURA    CALL         RET_1MS    BCF           PORTA,1    ;E = 0    CALL        RET_1MS

   

    MOVLW    A'E'    ; Cargo el ASCII de la E    MOVWF    PORTB    ;Envio la E al puerto    BSF           PORTA,0    BSF           PORTA,1    CALL        RET_10MS    BCF          PORTA,1    CALL       RET_10MS

INICIO        NOP    GOTO     INICIO   

       END       Copyright 2010 EDWIN ESPINOSA        Este DOCUMENTO es un DOCUMENTO LIBRE, usted puede redistribuirlo y/o modificarlo bajo los terminos de la GNU FDL tal y como es publicada por la fundacion de software libre; bajo la version 1.3 de la licencia, o  una version superior.     Leer la licencia GNU gpl para mas detalles. 

    Permission is granted to copy, distribute and/or modify this document    under the terms of the GNU Free Documentation License, Version 1.3    or any later version published by the Free Software Foundation;    with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.    A copy of the license is included in the section entitled "GNU    Free Documentation License".

Page 16: Program an Do

PROGRAMANDOElectronica, Microcontroladores, Computadores

Con la tecnología de  Traductor de Googlejueves, 5 de julio de 2012

El timer TMR0 en los PIC con ejemplo

El timer TMR0 en los PICEs un modulo que sirve como contador o como temporizador de 8 bit's.Funcionando como temporizador el TMR0 es un registro donde yo puedo almacenar un valor y este se va incrementando de 1 en 1 con los ciclos de instruccion, es decir, con cada ciclo se incrementa en 1 el TMR0, cuando la cuenta llega a 255 y pasa a 0 (cero) se porduce una interrupcion por desborde del TMR0, recordemos que en un registro de 8 Bit's el valor mas alto que se puede almacenar es 255 y que si lo incrementamos estando en 255 pasa a cero, y es a esto a lo que se le denomina desborde.

Cual seria la ventaja entonces de usar el timer TMR0?

Cuando necesitemos temporizar, o lo que normalmente llamamos un retardo, no necesitaremos las acostumbradas rutinas para retardos, esto lo vamos a ver con un ejemplo.

El TMR0 tiene las siguientes caracteristicas:

-se puede leer y escribir-puede trabajar con relog externo o interno-detecta el flanco de subida o bajada del relog externo-tiene un prescaler de 8 bit´s-tiene una interrupcion por desborde de la cuenta de 255 a 0

los registros asociados a el son el TMR0, INTCON y el OPTION_REG

El bit T0CS (OPTION 2) a 1 trabaja como temporizador, 0 trabaja como contador

El bit T0SE (OPTION 4) en modo contador a 1 flanco descendente, 0 flanco ascendente

El bit PSA (OPTION 3) 0 prescaler al temporizador, 1 prescaler al perro guardian WDT

Cuando se desborda el TMR0, se activa  el bit 2 de INTCON (T0IF) y si el T0IE esta activado el T0IF generara interrupcion y se debe borrar por software cuando se atienda la interrupcion

Para calcular el tiempo de temporizacion

Tiempo = 4 * Tosc * (256 - valor cargado en TMR0)*(Rango presaler)

donde

Tocs  =  1 / Fosc (frecuencia del oscilador)    

Entonces si necesitamos un determinado tiempo podemos despejar TMR0 y hallar su valor:

                        TiempoTMR0 =    ----------------------------    -   256             4 * Tosc * Prescaler

Formula que nos dara un valor muy aproximado del Tiempo

Empecemos la configuración

Page 17: Program an Do

Configuramos el OPTION_REG

BANKSEL  OPTION_REG MOVLW B'00000000'

ANALICEMOS

BIT 7 Pull up PORTB Disable BTI 6 interrupcion por flaco de subida en el INT Pin BIT 5 fuente del clock para el TMR0, internal 1 ciclo ed intruccion (1/Fosc) BIT 4 Flanco de bajada para el incremento del TMR0 BIT 3  Prescaler asignado al TMR0 BIT 2-0 Division del prescaler 

Configuramos el INTCON

Registro donde activamos las interrupciones globales y la del TMR0

MOVLW B'10100000'                MOVWF OPTION_REG

BIT 7 Activamos las interrupciones Globales BIT 6 interrupciones de otros perifericos desactivadas BIT 5 Habilitamos la interrupcion por desborde en el TMR0 BIT 4 desabilitamos interrupcion externa INT BIT 3  desabilitamos interrupcion por cambio en el PORTB BIT 2 bandera interrupcion en TMR0 BIT 1 bandera interrupcion en INT BIT 0 bandera interrupcion por cambio en PORTB

Page 18: Program an Do

EjemploVamos a crear una señal de 1 KHz usando el TMR0.

Código fuente

   LIST  P=16F886

     INCLUDE  P16F886.INC ERRORLEVEL -302      __CONFIG  _CONFIG1, _INTOSCIO & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_ON & _IESO_OFF & _FCMEN_OFF & _LVP_OFF & _DEBUG_OFF     __CONFIG  _CONFIG2, _BOR40V & _WRT_OFF CBLOCK 0X20

ENDC

      ORG  0X00      GOTO CONFIGURA            ORG 0X04      GOTO INTERRUPCION      ORG 0X05

INTERRUPCION COMF PORTB,F MOVLW .7 MOVWF TMR0

Page 19: Program an Do

BCF INTCON,T0IF RETFIE      CONFIGURA CLRF     PORTB BANKSEL  ANSEL CLRF     ANSEL CLRF     ANSELH BANKSEL  TRISB CLRF     TRISB BANKSEL  OPTION_REG MOVLW B'00000000' MOVWF OPTION_REG MOVLW B'10100000' MOVWF INTCON BANKSEL PORTB CLRF TMR0 CLRF PORTB

INICIO  GOTO     INICIO

         END

Copyright 2012  edwtron       Este DOCUMENTO es un DOCUMENTO LIBRE, usted puede redistribuirlo y/o modificarlo bajo los terminos de la GNU FDL tal y como es publicada por la fundacion de software libre; bajo la version 1.3 de la licencia, o  una version superior.     Leer la licencia GNU gpl para mas detalles. 

    Permission is granted to copy, distribute and/or modify this document    under the terms of the GNU Free Documentation License, Version 1.3    or any later version published by the Free Software Foundation;    with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.    A copy of the license is included in the section entitled "GNU    Free Documentation License".   

------ PAGINA PRINCIPAL -----

Los fuses del pic 16F628 y diferencias con el 16F628A

FUSES DEL PIC 16F628:

Page 20: Program an Do

_BODEN_ON Activado el reset por bajada de tension 

_BODEN_OFF

_CP_ALL proteccion para inpedir la lectura de toda la memoria del programa 

_CP_75 proteccion del 75% de la memoria

_CP_50 proteccion del 50% 

_CP_OFF permite la lectura de la memoria del programa

_DATA_CP_ON La memoria de datos de la eeprom no se puede leer 

_DATA_CP_OFF

_PWRTE_ON Pequeño retardo al inicio de conectar la alimentacion, para permitir que la tension se estabilice. 

_PWRTE_OFF

_WDT_ON activado el perro guardian que vigila el correcto funcionamiento del programa 

_WDT_OFF

_LVP_ON habilitada la funcion de grabacion serie en baja tension RB4/PGM actua como tal 

_LVP_OFF RB4 actua como pin de entrada/salida

_MCLRE_ON El pin de reset RA5/MCLR actua como tal 

_MCLRE_OFF el pin actua como entrada o salida

_ER_OSC_CLKOUT oscilador con resistencia y condensador externos, con salida de reloj por RA6 

_ER_OSC_NOCLKOUT oscilador exterior R/C sin salida de reloj. RA6 actua como Entrada/Salida 

_INTRC_OSC_CLKOUT oscilador R/C interno, con salida de reloj por RA6, mientras que RA7 es I/O 

_INTRC_OSC_NOCLKOUT oscilador R/C inetrno, sin salida de reloj. RA6 y RA7 actuan como I/O 

_EXTCLK_OSC Reloj externo, siendo RA7 la entrada, y RA6 actua como I/0

_LP_OSC Cristal o resonador de baja velocidad, para bajar el consumo 

_XT_OSC Cristal tipico de 4Mhz 

_HS_OSC cristal de alta velocidad

 

FUSES DEL PIC 16F628A :

_BODEN_ON = 16f628 

_BODEN_OFF = 16f628 

_BOREN_ON Es exactamente igual que el BODEN pero con otro termino (pepe = Jose)

_BOREN_OFF se repite el termino BODEN con objeto de mantener la compatibilidad con el 16f628

Page 21: Program an Do

_CP_ON Proteccion programa activado. El 16f628 tiene otro nombre. No es compatible 

_CP_OFF = 16f628

_DATA_CP_ON = 16f628 

_DATA_CP_OFF = 16F628

_PWRTE_OFF = 16F628 

_PWRTE_ON = 16f628

_WDT_ON = 16F628 

_WDT_OFF = 16f628

_LVP_ON = 16F628

_LVP_OFF = 16F628

_MCLRE_ON = 16f628

_MCLRE_OFF = 16F628

_RC_OSC_CLKOUT = _ER_OSC_CLKOUT del 16f628 ; el termino ER es compatible con las 2 versiones 

_RC_OSC_NOCLKOUT = _ER_OSC_NOCLKOUT del 16f628 

_ER_OSC_CLKOUT = 16f628 

_ER_OSC_NOCLKOUT = 16f628

_INTOSC_OSC_CLKOUT = _INTRC_OSC_CLKOUT del 16f628 

_INTOSC_OSC_NOCLKOUT = _INTRC_OSC_NOCLKOUT del 16f628 

_INTRC_OSC_CLKOUT = 16f628

_INTRC_OSC_NOCLKOUT = 16f628

_EXTCLK_OSC = 16f628 

_HS_OSC =16F628

_XT_OSC =16f628 

_LP_OSC =16F628

 

A la vista de la comparacion, cualquier programa se puede grabar indistintamente en el pic 16F628 o en el 16F628A,

siempre y cuando NO tengamos activado el CODIGO DE PROTECCION DEL PROGRAMA.

Tambien podeis modificar este fuse para migrar de un microcontrolador al otro.

Page 22: Program an Do

Programando PICsEste sitio ha sido creado para compartir códigos sencillos y útiles para la programación de microcontroladores de la familia Microchip.

DOMINGO, 8 DE JULIO DE 2012

Fusibles o "bits" de Configuración en PICLes dejo esta interesante y útil  información para quienes comienzan a programar los PIC en assembler y en C...

Quiero dar las GRACIAS a  http://xorwf.blogspot.com  por el aporte...

¿Fusibles? Los bit's de configuración o también llamados "fusibles" permiten configurar ciertas funciones en los microcontroladores PIC. La cantidad de funciones dependen del microcontrolador, por ejemplo, en el 16F84A existen 4 funciones, en el 16F88 son alrededor de 13 funciones.

¿Para qué sirven?Nos permiten configurar algunas funciones del micro, como el tipo de oscilador, la proteccion de codigo, habilitar el perro guardian (evita que se quede pegado el micro), habilitar el reset maestro, habilitar un reset inicial, habilitar reset por bajo voltage en la fuente, habilita el modo "depurador" o debugger, entre otros.

¿Cuándo se usan?Si estamos usando alguno de los programadores de Microchip como el pickit2 o el pickit3, debemos escribir la configuracion de estos fusibles en la cabecera de nuestro código fuente, antes de compilar.

¿Como se que fusibles usa el micro?Todo esto aparece en la hoja de datos del micro (datasheet) , y se pueden obtener del fichero que incluimos en la cabecera del fuente, el P16F88.INC por ejemplo, que se encuentra en la carpeta "MPASM suite" que esta dentro de la carpeta "microchip" donde instalamos el MPLAB, ojo que el nombre del fichero depende del micro.

De los ficheros antes mencionados se obtiene lo siguiente:

Para el 16F84A

_CP_ON              EQU   H'000F'_CP_OFF            EQU   H'3FFF'_PWRTE_ON      EQU   H'3FF7'_PWRTE_OFF    EQU   H'3FFF'_WDT_ON          EQU   H'3FFF'_WDT_OFF        EQU   H'3FFB'_LP_OSC            EQU   H'3FFC'_XT_OSC           EQU   H'3FFD'_HS_OSC           EQU   H'3FFE'_RC_OSC           EQU   H'3FFF'

La "Palabra de Configuración", es la que AGRUPA todos estos de la siguiente forma, usando la directiva: "__CONFIG" (ojo que tiene 2 guión bajo antes de config)

__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC

Si se quiere activar una de las opciones anteriores, solo hay que cambiar el OFF por el ON.

Para el 16F88

_CONFIG1  EQU  H'2007'_CONFIG2  EQU  H'2008'

Page 23: Program an Do

;Configuration Byte 1 Options_CP_ALL     EQU H'1FFF'_CP_OFF     EQU H'3FFF'_CCP1_RB0 EQU H'3FFF'_CCP1_RB3 EQU H'2FFF'_DEBUG_OFF EQU H'3FFF'_DEBUG_ON EQU H'37FF'_WRT_PROTECT_OFF EQU H'3FFF' ;No program memory write protection_WRT_PROTECT_256 EQU H'3DFF' ;First 256 program memory protected_WRT_PROTECT_2048 EQU H'3BFF' ;First 2048 program memory protected_WRT_PROTECT_ALL EQU H'39FF' ;All of program memory protected_CPD_ON EQU H'3EFF'_CPD_OFF EQU H'3FFF'_LVP_ON EQU H'3FFF'_LVP_OFF EQU H'3F7F'_BODEN_ON EQU H'3FFF'_BODEN_OFF EQU H'3FBF'_MCLR_ON EQU H'3FFF'_MCLR_OFF EQU H'3FDF'_PWRTE_OFF EQU H'3FFF'_PWRTE_ON EQU H'3FF7'_WDT_ON EQU H'3FFF'_WDT_OFF EQU H'3FFB'_EXTRC_CLKOUT EQU H'3FFF'_EXTRC_IO EQU H'3FFE'_INTRC_CLKOUT EQU H'3FFD'_INTRC_IO EQU H'3FFC'_EXTCLK EQU H'3FEF'_HS_OSC EQU H'3FEE'_XT_OSC EQU H'3FED'_LP_OSC EQU H'3FEC'

;Configuration Byte 2 Options_IESO_ON EQU H'3FFF'_IESO_OFF EQU H'3FFD'_FCMEN_ON EQU H'3FFF'_FCMEN_OFF EQU H'3FFE'

y la "Palabra de Configración" sería algo como esto:

;Program Configuration Register 1__CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _MCLR_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC

;Program Configuration Register 2__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFFPublicado por Paticio Cortés Aburto en 01:56 

Palabras de configuración de los PICCuando vamos a usar un PIC que no conocemos, muchas dudas es que no sabemos con certeza las palabras de configuración de los PIC. La realidad es que si usamos el MPLAB v8 o el MPLAB X te vienen ya incluido, sólo hay que buscarlos.

Page 24: Program an Do

Los PICs que más me preguntan los visitantes son esta pequeña lista.

PIC12F508A__CONFIG   _CP_OFF & _WDT_ON & _MCLRE_ON & _ExtRC_OSC

PIC12F629__CONFIG   _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT

PIC16F84A__CONFIG   _CP_OFF & _WDT_ON & _PWRTE_ON & _RC_OSC  PIC16F628A__CONFIG   _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT

PIC16F88__CONFIG    _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _INTRC_IO     __CONFIG    _CONFIG2, _IESO_OFF & _FCMEN_OFF

PIC16F886__CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT __CONFIG    _CONFIG2, _WRT_OFF & _BOR21V 

PIC16F887__CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT    __CONFIG    _CONFIG2, _WRT_OFF & _BOR21V

PIC16F1827__CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_ON & _IESO_OFF & _FCMEN_OFF    __CONFIG _CONFIG2, _WRT_OFF & _PLLEN_OFF & _STVREN_OFF & _BORV_19 & _LVP_OFF

PIC18F2550CONFIG    FOSC = XT_XT (En realidad es una gran lista. En el MPLAB v8, puedes verlos en la barra de herramientas arriba, Configure-->Configuration Bits).

PIC18F4550CONFIG    FOSC = XT_XT (Lo mismo arriba).

Hay visitantes que no tienen instalado el MPLAB en este momento, así, este documento les puede ayudar y ahorrar tiempo.

La ubicación se encuentra en este directorio:C:\Archivos de programa\Microchip\MPASM Suite\Template\Code

Page 25: Program an Do

Si quieres encontrar donde están los templates, por ejemplo, del PIC16F88, encuentras el archivo llamado 16F88TEMP.ASM y lo abres.

Puede dar el caso que quieras cambiar la configuración del oscilador interno al exteno y que sea del cuarzo. Un ejemplo abajo.

LIST P=16F88 ; Procesador.#INCLUDE ; Definición de los operandos utilizados.

__CONFIG _CONFIG1, _CP_OFF & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC

; _CP_OFF: Protección de código DESACTIVADO.; _DEBUG_OFF: Debug en circuito DESACTIVADO.; _WRT_PROTECT_OFF: Protección a escritura en memoria de programa DESACTIVADO.; _CPD_OFF: Protección de código de datos DESACTIVADO.; _LVP_OFF: Programación en baja tensión DESACTIVADO.; _BODEN_OFF: Reset por Brown-out DESACTIVADO.; _MCLRE_ON: Reset por pin externo ACTIVADO.; _PWRTE_ON: Retraso al reset ACTIVADO.; _WDT_OFF: Watchdog DESACTIVADO.; _XT_OSC: Oscilador externo del tipo XT.

__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF

; _IESO_OFF: Modo de intercambio de externo a interno DESACTIVADO.; _FCMEN_OFF: Monitor de CLK DESACTIVADO.

Hay que encontrar las directivas del PIC16F88 que está en la ubicación:C:\Archivos de programa\Microchip\MPASM Suite

Page 26: Program an Do

  El archivo se llama P16F88.INC y lo abrimos para localizar la palabra de configuración del oscilador externo de cuarzo.

Si abriste el archivo P16F88.INC con el notepad de Windows, pulsa "Control B" y busca "CONFIG1 Options", de todas las configuraciones que hay, se usa el _XT_OSC, por ejemplo el oscilador XT a 4MHz o el 20MHz.

Puedes simplificar el __CONFIG sólo introduciendo hexadecimales en vez de los textos aunque resulte más engorroso de interpretar. Cuando lo tengas configurados la configuración de Bits en el MPLAB, lo miras y apuntas.

Ejemplo 1: 

    LIST        P=16F88    INCLUDE                __CONFIG    _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC        __CONFIG    _CONFIG2, _IESO_OFF & _FCMEN_OFF

Ejemplo 2:

    LIST        P=16F88    INCLUDE                __CONFIG    _CONFIG1, 0x3F21        __CONFIG    _CONFIG2, 0x3FFC  

Los dos ejemplos son exactamente lo mismo, sólo que te ahorra tiempo y espacio en escribirlo, aún así, es más aconsejable, legible y recomendable el primer ejemplo. Puedes buscar más información en las ayudas del MPLAB escribiendo __config.

Autor: Ángel Acaymo M.G.

ola:

Esta es la configuración para los fuses del 16F628A:

@ DEVICE pic16f628A, INTRC_OSC_NOCLKOUT 'Reloj interno solo @ DEVICE pic16f628A, WDT_OFF ' Watchdog Timer desconectado @ DEVICE pic16f628A, PWRT_ON ' Power-On Timer conectado @ DEVICE pic16f628A, BOD_ON ' Brown-Out Detect conectado @ DEVICE pic16f628A, MCLR_OFF ' Master Clear Externo desconectado @ DEVICE pic16f628A, LVP_OFF ' Low-Voltage Programming desconectado @ DEVICE pic16f628A, CPD_OFF ' Data Memory Code Protect desconectado 

No hace falta el XT_OSC, ya que si no usas DEFINE OSC, la frecuencia que asume PBP es 4mhz y es XT, lo que si tienes que deginir es para

Page 27: Program an Do

cuando uses frecuencias mas altas HS.

Puedes ir verificándolo en el WINPIC, siempre que intento configurar fuses lo he hecho así, incluso para el 18F2550 en Protón  

Puedes revisar los archivos .INC en la carpeta de PBP para que veas la configuración por defecto de los fuses, en el caso del 628A es este:

Fuses en pbp para pic16f877a

Señores necesito

ayuda veran

tengo el copilador

pbp sobre el

MPLAB, cuento

tambien con el

programdor

PICKIT2.

El problema

radica en que el

software del

programador no

me deja

configurar los

fuses ya que no

trae la opción.

Me contaron que

si se pueden

configurar desde

el PBP pero no sé

como.

Gracias por los

comentarios.

Citar

13/03/2012 #2

D@rkbytes

Moderador

jehanandre dijo: 

Señores necesito ayuda veran tengo el copilador pbp sobre el MPLAB, cuento tambien con el

programdor PICKIT2.

El problema radica en que el software del programador no me deja configurar los fuses ya que no

trae la opción.

Me contaron que si se pueden configurar desde el PBP pero no sé como.

Gracias por los comentarios.

jehanandre.

Si ya tienes el plugin instalado para PBP en el MPLAB.

Page 28: Program an Do

Los fuses se configuran en el archivo *.INC correspondiente al PIC que vas a utilizar.

En este caso debes modificar el archivo 16F877A.INC que se encuentra en la carpeta de

instalación

del compilador PBP, por default en C:\PBP Y dentro del archivo veras este código:Código:

NOLIST

ifdef PM_USED

LIST

include 'M16F87xA.INC' ; PM header

device pic16F877A, xt_osc, wdt_on, lvp_off, protect_off

XALL

NOLIST

else

LIST

LIST p = 16F877A, r = dec, w = -302

INCLUDE "P16F877A.INC" ; MPASM Header

__config _XT_OSC & _WDT_ON & _LVP_OFF & _CP_OFF

NOLIST

endif

LIST

La parte que puse en color azul es la parte que yo modifico (Esta en ensamblador)

Para que sepas que FUSES usar, busca también el archivo template correspondiente al

PIC.

Este otro archivo se encuentra en la carpeta C:\Archivos de programa\Microchip\MPASM

Suite\Template\Code

Dentro de ese archivo encontraras los fuses que usa el PIC que utilices.

Ahora que, si vas a programar en PBP te recomiendo que uses el editor MicroCode Studio

Y te evitas este tipo de problemas.

Espero haberte ayudado. Suerte y hasta luego. 

Citar

13/03/2012 #3

judex podriais ponerme los fuses para la serie 18 de pics en pbp, por favor

gracias

Citar

13/03/2012 #4

jehanandre Muchas gracias amigo yo eh intentado desde la ventana del MPLAB donde dice

configuration Bits pero no sé si da resultado.

Page 29: Program an Do

---------- Actualizado después de 5 minutos ---------- 

Pero con lo de tu respuesta tengo algunas dudas:

1)Abro el archivo en Block de NOtas y luego cambio 

device pic16F877A, xt_osc, wdt_on, lvp_off, protect_off por esto: device pic16F877A,

HS_osc, wdt_on, lvp_off, protect_off y vuelbo a guardar el Archivo(block de Notas) para

luego ir e iniciar mi proyecto desde cero en el MPLAB?

Citar

13/03/2012 #5

D@rkbytes

Moderador

judex dijo: 

podriais ponerme los fuses para la serie 18 de pics en pbp, por favor

gracias

Los fuses disponibles para la serie 18 se encuentran en la carpeta de instalación de PBP

como mencione.

Consulta su correspondiente archivo *.inc

jehanandre dijo: 

Muchas gracias amigo yo eh intentado desde la ventana del MPLAB donde dice configuration Bits

pero no sé si da resultado.

Pero con lo de tu respuesta tengo algunas dudas:

1)Abro el archivo en Block de NOtas y luego cambio 

device pic16F877A, xt_osc, wdt_on, lvp_off, protect_off por esto: device pic16F877A, HS_osc, wdt_on,

lvp_off, protect_off y vuelbo a guardar el Archivo(block de Notas) para luego ir e iniciar mi proyecto

desde cero en el MPLAB?

1.- Si da resultado si configuras los fuses desde el editor de fuses de MPLAB

Yo me imagine que los querias configurar de otra forma.

2.- Si debes editar el archivo *.inc con el block de notas y lo guardas.

Esos fuses que modifiques serán los fuses que se tomaran como default para ese PIC

3.- Debes cambiar solo los fuses que indique anteriormente, solo los que estan en azul.

Los de la primer sección no son tomados en cuenta por el compilador.

Citar

14/03/2012 #6

jehanandre ok gracias y yo se que molesto mucho pero te comento.

Hace como un mes realice un contador con el pic16f877a todo salio bien en el proteus y el

programador hizo su trabajo.

Page 30: Program an Do

El problema estaba que no funcionaba hasta que tocara un capacitor de ceramica (15p)

que esta en paralelo con el Cyrstal de 4MHz, y si no lo tocaba no funcionaba :P no se si me

puedes ayudar con ese tema.

Citar

14/03/2012 #7

ricbevi jehanandre dijo: 

ok gracias y yo se que molesto mucho pero te comento.

Hace como un mes realice un contador con el pic16f877a todo salio bien en el proteus y el

programador hizo su trabajo.

El problema estaba que no funcionaba hasta que tocara un capacitor de ceramica (15p) que esta en

paralelo con el Cyrstal de 4MHz, y si no lo tocaba no funcionaba :P no se si me puedes ayudar con

ese tema.

Hola a todos...con el cristal no va ningún capacitor en paralelo si no de cada pata a gnd y

generalmente para 4Mhz se utiliza de 22PF a 27PF pero eso es según el requerimiento del

corte del cristal y el oscilador del pic.Si lo tocas con la mano le introduces ruido al sistema

que si esta al limite inferior del arranque puede ser que encienda el oscilador y se

mantenga así hasta el próximo encendido.

Saludos.

Ric.

Citar

14/03/2012 #8

jehanandre mmmmmmmmm no te entendi mucho me confundi es una conección en serie entre cada

pata del Crystal con un condensador a tierra(si me equivoco perdon).

Se podria decir que al momento de tocar el condensador hago que el pic trabaje porque

aumento su voltaje debido al ruido que le introduzco?

Citar

15/03/2012 #9

D@rkbytes

Moderador

jehanandre dijo: 

mmmmmmmmm no te entendi mucho me confundi es una conección en serie entre cada pata del

Crystal con un condensador a tierra(si me equivoco perdon).

Se podria decir que al momento de tocar el condensador hago que el pic trabaje porque aumento su

voltaje debido al ruido que le introduzco?

Saludos.

Page 31: Program an Do

No, no creo que sea por eso.

Seguramente debe ser porque tienes mal configurado el oscilador (Diseño o Fuses)

Yo he colocado un Xtal de hasta 10MHz sin capacitores en el protoboard y funciona sin

tocar nada.

Esta es la configuración clasica para el Xtal.

Si requieres de presición en la frecuencia, puedes sustituir C1 por un C Variable de 50pF

También puedes verificar la configuración de los fuses con el programa ICProg o el

WinPic800

Y en dado caso hasta grabarlos al *.HEX con esos programas, antes de grabar el PIC con tu

programador.

Suerte y hasta luego.

Imágenes Adjuntas

PIC_Xtal.gif (34,9 KB (Kilobytes), 85 visitas)

Citar

17/03/2012 #10

jehanandre Gracias por todo señores actualmente todo funciona bien.

El problema era que tenia un Crystal de 4Mhz y lo ponia como HS cuando era XT XD

gracias.

Citar

Directivas del ensamblador

Las directivas no son instrucciones del microcontrolador, son indicaciones que se le dan al ensamblador para

controlar algunos aspectos del ensamblado del código. Todas las directivas se detallan en el manual respectivo de los

tantos que se instalan junto con el paquete MPLAB.

Como con los mnemónicos de instrucciones, al ensamblador le da igual si las directivas están en mayúsculas o en

minúsculas.

Aquí presentaremos las que suelen ser las más habituales. Ya vimos en acción a muchas de ellas y las restantes las

empezaremos a usar en adelante.

Directiva list

Directiva processor

Directiva include

Directivas __config y __fuses

Directiva equ

Directivas cblock y endc

Directiva org

Page 32: Program an Do

Directiva end

Directiva banksel

Directiva #define

Directiva $

Directiva dt

Directiva errorlevel

Directiva messg

Directivas if, ifdef, ifndef, else y endif

La directiva list

Es una directiva para listar una serie de opciones de ensamblado de diversa índole. Los parámetros listados se

separan por comas. Por ejemplo, siguiente directiva list p = PIC16F84A, r = dec, b = 8, f = INHX8M

tiene cuatro parametros, cuyo significado es:

p: establece el Procesador destino (PICmicro). Esto será equivalente a la directiva processor.

r: establece el sistema de numeración a usar por defecto. Como se vio al inicio, el formato de los números se

suele especificar por un prefijo: 0x para hexadecimal, . para decimal, etc. En caso de no especificar nada, el

número será considerado en el formato señalado por r. En el ejemplo, es obvio que se indica decimal. El valor

por defecto es hex (hexadecimal). Esto es equivalente a la directiva radix.

b: establece la cantidad de espacios en blanco que serán insertados en lugar de cada tabulación del archivo

*.lst. Éste es un archivo secundario de los tantos que genera el ensamblador. De cualquier forma, más adelante

veremos para que puede servir.

f: establece el Formato del archivo hexadecimal de salida. las opciones disponibles son INHX8M, INHX8S e

INHX32. La primera es el valor por defecto.

Además de los citados en este ejemplo hay muchos más parámetros que se pueden incluir con la directiva list. Lo

curioso es que ninguno puede ser necesario, es decir, todos se pueden indicar de otra forma, ya sea desde el entorno

del ensamblador MPASM, del mismo MPLAB o mediante otra directiva. Mas aun, ni siquiera suele ser necesario mover

las configuraciones por defecto.

Es una costumbre poner list con al menos el parametro p = indicando el procesador. Para este propósito sería más

práctivo e intuitivo usar la directiva processor, descrita continuación, que tiene el mismo objetivo.

La directiva processor

Es una directiva para establecer el PICmicro para el que se ensamblará el código fuente. Es equivalente a poner la

directiva list con el parámetro p. Con esta directiva el ensamblador sabrá qué tipo de instrucciones utilizar, aunque en

ese sentido hay muy pocas variaciones entre uno y otro “procesador”.

No obstante, resalto que poner estas directivas solo suele ser necesario cuando se llame al ensamblador desde una

línea de comandos, por ejemplo, cuando se ensambla el programa desde Proteus VSM. No hacen falta, por ejemplo,

cuando se cuando se contruye el proyecto desde MPLAB IDE. processor PIC16F84A

La directiva include

Es la directiva para incluir como parte del programa el archivo que se indica. La inclusión se realiza como si se

aplicara un “copiar - pegar” del contenido entero del archivo incluido en el lugar donde aparece la directiva.

Esta directiva debe aparecer en todos los programas de ensamblador al menos para incluir el archivo de dispositivo

del PIC usado, como muestra el siguiente ejemplo. Estos archivos se hallan en la carpeta de instalación del

ensamblador MPASM, que a su vez se instala con MPLAB IDE, norlmalmente C:\Microchip\MPASM Suite. Solo ponemos

la directiva y el ensamblador sabrá dónde buscarlo. include <P16F84A.inc> ; incluir archivo P16F84A.inc

Page 33: Program an Do

Include también se usa para incorporar archivos de otros tipos, como librerías de códigos. Es una convención usar los

signos < > para referirse a los archivos estándar y los signos “ ” para referirse a los archivos de usuario. Incluso

pueden ignorarse dichos signos asi como poner por delante el signo #. Queda claro que no se imponen las

restricciones que tiene esta directiva en el lenguaje C. include "lcd.asm" ; incluir archivo lcd.asm

#include P16F877A.inc ; incluir archivo P16F877A.inc

Las directivas __config y __fuses

__config es más popular que __fuses a pesar de tener el mismo propósito (por lo menos en los PIC16) y de que el

nombre de la segunda parecería más ilustrativo.

Son directivas para establecer los Fuses de Configuración. Los fuses también se pueden establecer en el entorno del

programa grabador (WinPic800, por ejemplo), pero es recomedable hacerlo mediante esta directiva para que formen

parte del archivo *.hex resultante.

Recuerda que el PIC16F84A tiene 4 fuses y los PIC16F87xA tienen 9. Todos los hemos estudiado antes. Los fuses se

ponen con un número o a través de máscaras que las representan. Estas máscaras se encuentran en el archivo de

dipositivo del PICmicro.

Por ejemplo, en la gran mayoría de las prácticas con el PIC16F84A de este curso vamos a usar la siguiente

configuración: __config _XT_OSC & _WDT_OFF & _PWRTE_ON

que es equivalente a: __fuses _XT_OSC & _WDT_OFF & _PWRTE_ON

Para los PIC16F87xA especificaremos los siguientes fuses: __config _XT_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF

Los fuses no indicados, como la Protección de Código, quedarán con su valor por defecto. Para mayor información

puedes volver al capítulo 3.

La directiva equ

Cuando se quiere acceder a los registros (SFR o GPR) de la RAM se les debe referenciar por sus direcciones. Como eso

sería una labor muy tediosa, el ensamblador permite identificarlos con un alías o nombre escogido por el usuario

mediante la directiva equ.

Aunque equ permite igualar (equal = igual) un identificador con cualquier constante númerica, su principal aplicación

es “darles nombres” a los registros de la RAM. De hecho, todos los registros SFR del PIC ya están identificados así en

su correspondiente archivo de dispositivo (revísalos, si quieres). A nosotros equ nos servirá para trabajar con los

registros GPR.

Con el siguiente ejemplo se “bautizan” con cont1 y cont2 a los registros ubicados en las direcciones 0x0C y 0x0D,

respectivamente.cont1 equ 0x0C ; Ubicar cont1 en dirección 0x0C cont2 equ 0x0D ; Ubicar cont2 en dirección 0x0D

Las directivas cblock y endc

Incluso si usamos la directiva equ para referirnos con más comodidad a los registros GPR, si nuestro programa va a

procesar varios datos y variables, seremos propensos a comenter errores con las designaciones.

Las directivas cblock y endc siempre deben ir juntas para formar un bloque de variables que ocupan posiciones

consecutivas en la RAM del PICmicro, siendo la dirección de la primera variable la indicada después de cblock. Para

tener un mejor contexto de su uso analicemos el siguiente boceto de código: processor PIC16F84A include <P16F84A.inc>

cblock 0x0C ; En el PIC16F84A los registros GPR están

Page 34: Program an Do

cont ; disponibles a partir de la dirección 0x0C var temp endc

org 0x000Start ; ... call subroutine ; ... goto Start

;************************************************************************** cblock ; Aquí no necesitas establecer una bus ; dirección base del0 endcsubroutine ; ... ; ... return end

En el boceto el primer bloque cblock - endc es equivalente a haber puesto las líneas de código:cont equ 0x0C ; Ubicar count en dirección 0x0Cvar equ 0x0D ; Ubicar var en dirección 0x0Dtemp equ 0x0E ; Ubicar temp en dirección 0x0E

Más abajo aparece otro bloque cblock - endc con dos variables, bus y del0, que también se pudieron incluir en el

primer bloque, pero que se separan, como muchas veces se preferirá, por guardar alguna relación entre ellas y para

tratar de ordenar el código. No obstante, a diferencia de los lenguajes como el C, estos registros serán accesibles

desde cualquier parte del programa.

Ahora bien, si como dice el comentario, el segundo bloque no necesita una dirección base, ¿qué direcciones les

corresponden a esas variables? Como el ensamblador sabe dónde se quedó, a las variables del siguiente bloque les

asignará las locaciones subsiguientes. Es decir, el segundo cblock - endc sería equivalente a:bus equ 0x0F ; Ubicar bus en dirección 0x0Fdel0 equ 0x10 ; Ubicar del0 en dirección 0x10

De hecho, en un programa puedes poner varios bloques más de este tipo, pero sin olvidar que, a menos que sepas lo

que haces, solamente el primero debe tener la dirección de la primera variable, inclusive si está vacío.

La directiva org

Su nombre deriva de origen. Es para indicarle al ensamblador a partir de que dirección empezará a mapear el

subsiguiente código ejecutable. Como el CPU empieza a ejecutar el código desde la dirección 0x000, al menos la

primera instrucción de código debería estar allí.

Sin embargo, poner org 0x00 en programas con código continuo se ha convertido en un hábito a veces hasta

innecesario porque el ensamblador, que no es tan tonto, sabe que por defecto debe colocar el código a partir de la

dirección 0x000. org 0x000

Usar org sí es útil cuando se quiere reubicar algunas rutinas de código en determinados segmentos de la memoria de

programa.

La directiva end

Es la directiva que pone fin a la lectura del código fuente por parte del ensamblador. Cualquier código ubicado

después de esta directiva ya no será tomado en cuenta, lo que implica que solo debería haber una directiva end por

programa, incluso si consta de varios archivos. Son sofisticados los programas donde se puede usar varias veces.

La directiva banksel

Page 35: Program an Do

El nombre de esta directiva es un acrónimo de BANK SELection y, como se prevé, sirve para cambiar de bancos.

Como sabemos, la RAM de los PICmicros de familias Baseline y Midrange se divide en varios bancos por los que

tenemos que ir saltando para acceder a sus registros, “jugando” con los bits RP0 y RP1, del registro STATUS, así:

Tabla RP1 RP0

RP1 RP0Banco accedido

0 0 Banco 0

0 1 Banco 1

1 0 Banco 2

1 1 Banco 3

En los PIC con dos bancos, como el PIC16F84A, solo se trabaja con el bit RP0.

Dado el tedio que puede acarrear este trabajo, sobre todo si no recordamos a qué banco pertenece un registro, la

directiva banksel puede ser de gran ayuda. Banksel se encargará de colocar las instrucciones necesarias para acceder

al registro que se le indica como parámetro. banksel TRISA ; Seleccionar banco del registro TRISA (Banco 1)

La directiva #define

Es otra directiva que se utiliza muy a menudo. Los que programaron alguna vez en C/C++ saben cómo funciona. Para

los otros, deben saber que tiene tres partes: el mismo define, un identificador y toda la cadena restante.#define identificador cadena ;

Lo que hará el ensamblador es sustituir el identificador por toda la cadena restante tal cual es en cada punto del

programa donde se encuentre identificador. Por eso se le conoce como directiva de sustitución de texto.

identificador es una palabra con las mismas reglas impuestas a otros identificadores, como las etiquetas o nombres

de registros GPR. En cambio, cadena puede estar formado por cualesquiera otros elementos de código ensamblador.

Un típico ejemplo de define es para establecer los puertos de interface, más o menos así:#define switch PORTB, 0

Y cuando más adelante escribamos, por ejemplo, btfsc Switch ; Ver si switch vale 0

lo que en realidad entenderá el ensamblador será btfsc PORTB, 0 ; Ver si switch vale 0

La directiva $

Recordemos que las etiquetas en el fondo representan las direcciones de las instrucciones a las que preceden y

sirven de referencia para las instrucciones de salto. Así mismo, la directiva $ marca la dirección de la instrucción

actual y, por ejemplo, $ - 2 será la dirección de la instrucción que está dos posiciones atrás.

Normalmente es preferible colocar etiquetas y dejar el uso de $ solo para los casos donde la propensión a cometer

errores sea mínima, por ejemplo, para las instrucciones de saltos cortos.

A continuación se muestran dos rutinas de delay de 50 ms aprox. Ambas son equivalentes, solo que la segunda

emplea la directiva $ en vez de las etiquetas. Se asume que la variable cont ha sido definida previamente.delay_50ms movlw .33 movwf contlaba addlw .1 btfss STATUS, Z goto labb ; Saltar a labb decfsz cont, Flabb goto laba ; Saltar a laba return

delay_50ms

Page 36: Program an Do

movlw .33 movwf cont addlw .1 btfss STATUS, Z goto $ + 2 ; Saltar 2 instrucciones adelante decfsz cont, F goto $ - 4 ; Saltar 4 instrucciones atrás return

La directiva dt

Dt construye una tabla de datos a base de instrucciones retlw. Las tablas son matrices de constantes a cuyos

elementos se puede acceder secuencialmente mediante una variable índice.

Dt puede recibir uno o más parámetros separados por comas. Los parámetros de cadenas de texto serán

descompuestos en sus letras. Por ejemplo, la siguiente directivadt "test"

será entendida por el ensamblador como: retlw 't' retlw 'e' retlw 's' retlw 't'

La directiva errorlevel

Después de ensamblar o intentar ensamblar el código el ensamblador generará una serie de mensajes, errores y

advertencias. Con la directiva errorlevel podemos indicar cuáles de ellos pueden ser ignorados o reportados. Los

errores no se pueden inhibir.

Sus parámetros pueden ser:

0. Indica reportar mensajes, error y advertencias

1. Indica reportar advertencias y errores.

2. Indica reportar errores.

- msgnum. Indica no reportar los mensajes identificados por el número msgnum.

+ msgnum. Indica reportar los mensajes identificados por el número msgnum.

Los valores de msgnum forman una lista casi interminable que la puedes encontrar en el manual del ensamblador

MPASM.

Por ejemplo, un clásico mensaje que aparece constantemente incluso cuando el código está escrito correctamente es

el 302, que dice “Register in operand not in bank 0. Ensure that bank bits are correct”. Allí nos avisa que estamos

accediendo a un registro que no es del banco 0 y que debemos asegurarnos de estar haciendo lo correcto. Si nos

cansamos de verlo, podemos escribir la siguiente directiva. errorlevel -302

La directiva messg

Sirve para generar mensajes personalizados definidos por el usuario. El mensaje suele ser condicional, para lo que se

requiere de algunas otras directivas como if, ifdef, ifndef, else y endif.

Ejemplo, la siguiente directiva hará surgir el mensaje “Este código está realizado para el PIC16F876A”, si es que se

trata de ensamblar para otro PICmicro. (la constante __16F876A está definida en el archivo de dispositivo

P16F876A.inc.) ifndef __16F876A messg "Este codigo esta realizado para el PIC16F876A" endif

Las directivas if, ifdef, ifndef, else y endif

Page 37: Program an Do

Son directivas para ensamblado condicional. Mediante ellas indicaremos si una o algunas rutinas de código o

directivas inclusive serán tomadas en cuenta o no por el ensamblador.

Su estructura se muestra a continuación. El uso del bloque de else es opcional. if (ifdef o ifndef) condition ; si condition se cumple (o si es una expresión previamente definida) ; Se considerará este código else ; De lo contrario ; Se considerará este código endif

A modo de ejemplo, supongamos que hacemos un programa para el PIC16F84A y que eventualmente querremos

cambiar el código para que se pueda ensamblar para el PIC16F877A. Sabemos que los principales cambios a tener en

cuenta son el archivo de dispositivo a incluir, la directiva de los fuses, el inicio de los registros GPR y la configuración

del registro ADCON1 de los PIC16F87xA para que el puerto A sea de E/S digital.

El siguiente boceto de programa considera estos cuatro puntos y se puede ensamblar para uno u utro

microcontrolador tan solo cambiando la directiva processor, aunque tampoco eso sería necesario si el programa se

construye desde otro IDE como MPLAB, por ejemplo. processor PIC16F84A ; Seleccionar PIC destino

ifdef __16F877A include <P16F877A.inc> __config _XT_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF cblock 0x20 endc else ; Si no es PIC16F877A, asumir que es PIC16F84A include <P16F84A.inc> __config _XT_OSC & _WDT_OFF & _PWRTE_ON cblock 0x0C endc endif cblock ; Algunas variables del programa endc

org 0x000Start ifdef __16F877A ; Si está definido __16F877A banksel ADCON1 movlw 0x06 ; Hacer PORTA digital movwf ADCON1 ; endif ; Resto del cuerpo del programa end

 

Set de instrucciones de los PIC de familia Mid-Range

Hasta el momento hemos visto la operación de varias de las instrucciones del PIC. Como habrás notado, son bastante

fáciles de usar. Ahora, antes de continuar y para no tener que seguir explicándolas al vuelo, conoceremos el resto de

las 35 instrucciones de los PICs Mid-range.

Es un alivio saber que estos PICs tengan tan pocas instrucciones, haciendo todo el honor a su procesador de

arquitectura RISC (Reduced Instruction Set Computer). Es probable que en el futuro también estudiemos otros

módulos, dedicados a otros microcontroladores, aparte de los PICmicros. La mayoría de ellos, aunque también tienen

un diseño RISC, poseen cerca de 100 instrucciones. Así que ponle ganas y termina cuanto antes este capítulo.

Convención de términos

f     Cualquier registro (SFR o GPR) de la RAM del PIC

w    Work register o Registro de trabajo

Page 38: Program an Do

b     Posición de bit

k     Campo literal, dato constante o etiqueta

d     Selección de destino; d = 0: el resultado se almacena en W

                                      d = 1: el resultado almacenar en el registro F

PC    Program Counter o Contador de Programa

TOS  Top Of Stack o Cima de la Pila

< >   Posición de bit dentro de un registro

TO   Bit de Time-Out

PD    Bit de Power-down

Label   Nombre de una etiqueta

Notación de números en ensamblador

Hexadecimal:  0x15, H45, h7A

Decimal:         D'41', d'156 ', .25

Binario:  B'11110010', b'01010000'

Octal:     O'32', o'77'

Ascii:      'A', 'a', 'b'

Expresiones adoptadas

Para fines de documentación vamos a emplear algunos signos o expresiones que resumen el significado de alguna

operación, como:

→  Se utiliza para indicar la transferencia de un dato. Por ejemplo:

0x00 → (TRISB) Significa “cargar el dato 0x00 en el registro TRISB”.

( ) Se utiliza para referenciar el contenido de un registro. Por ejemplo:

(W) → (PORTB) Significa “el contenido del registro W se pasa al registro PORTB”.

=  A pesar de la sencillez de estos símbolos, yo prefiero emplear el operador =, propia de los lenguajes de alto

nivel. Solo debes acostumbrarte a que la transferencia del dato se dirige de derecha a izquierda y entender que

el signo = no implica una ecuación matemática (donde los dos miembros de la expresión son iguales de

antemano), solo significa que el valor del segundo miembro es asignado al primero. Por ejemplo.

TRISB = 0x00;            significa TRISB pasará a valer 0x00.

PORTB = PORTA;        significa PORTB valdrá igual que PORTA.

cnt = PORTB + 0x06;   significa cnt será la suma de PORTB y la constante 0x06.

PORTB = PORTB + 1;   significa PORTB es incrementado en 1.

PORTA = ~ PORTA;     significa PORTA invierte su valor.

Z = 0;                        significa el bit Z será igual a 0.

C = 1;                        significa el bit C será igual a 1.

Puedes notar que se prescinde de la expresión “el contenido del registro...”, ya que se asume que de eso se

trata.

.  Aunque en la documentación de Microchip se adoptan los signos < > para indicar la posición de un bit dentro

de un registro, aquí también prefiero cambiar a otra notación, punto en este caso. Por ejemplo

PORTB.2 = 0;      significa limpiar el bit 2 del registro PORTB.

TRISA.5 = 1;       significa setear el bit 5 del registro TRISA.

INTCON.GIE = 0; significa limpiar el bit GIE del registro INTCON.

 

Page 39: Program an Do

Configuracion de Bits Master Prog

Hola,

Soy estudiante De

electronica (nivel

Medio superior) y 

tengo un problema con

el grabador master

prog,

para programar uso el

Lenguaje basic (con el

microcode Studio) 

en la escuela, usamos

un programado marca

Volnia y todo va

perfecto al grabar las

practicas ya que este

programador tiene

opcion para agregar los

bits de configuracion,

el problema es que el

master prog no tiene la

opcion, y en los

manuales que me

dieron

dice que en lenguaje

ensamblador debes

agregarlos... o bien en

el MPLAb...

el problema es que ya

eh hecho todo lo que

me dice los manuales...

(Configurado Fuses,

abierto archivos ASM

con el mplab y

agregarle los bits de

config desde ahi) La

verdad me eh

desesperado ya  ,...

mas por que esto

detiene un poco mi

avance en la escuela... 

Les agradesco de

antemano su ayuda 

Page 40: Program an Do

Citar

16/11/2011 #2

D@rkbytes

Moderador

chess98 dijo: 

Hola,

Soy estudiante De electronica (nivel Medio superior) y 

tengo un problema con el grabador master prog,

para programar uso el Lenguaje basic (con el microcode Studio) 

en la escuela, usamos un programado marca Volnia y todo va perfecto al grabar las

practicas ya que este programador tiene opcion para agregar los bits de configuracion, el

problema es que el master prog no tiene la opcion, y en los manuales que me dieron

dice que en lenguaje ensamblador debes agregarlos... o bien en el MPLAb...

el problema es que ya eh hecho todo lo que me dice los manuales...(Configurado Fuses,

abierto archivos ASM con el mplab y agregarle los bits de config desde ahi) La verdad me

eh desesperado ya  ,... mas por que esto detiene un poco mi avance en la escuela... 

Les agradesco de antemano su ayuda 

Cada lenguaje de programación para PIC tiene su propia forma de escribir la

palabra de configuración.

Dependiendo del compilador que este use, es como sera interpretada tal palabra.

En tu caso mencionas que utilizas BASIC usando como editor MicroCode Studio

El compilador por default para MCS es el PBP (PICBASICPRO)

En la cabecera de tu programa es donde se escribe la palabra de configuración.

Y esta sera interpretada por el compilador, incluyendola dentro del archivo

ejecutable *.HEX

De esta manera es como se agregan los FUSES seleccionados para los grabadores

que

no tienen la opción de setearlos manualmente por medio del programa.

Vendria siendo como esto:Código:

'********************************************************************

***********

@ DEVICE PIC16F628A

@ DEVICE

INTRC_OSC_NOCLKOUT,PROTECT_OFF,WDT_OFF,PWRT_ON,MCLR_ON,BOD_OFF,LVP_OF

F,CPD_OFF

'********************************************************************

***********

Lo que sigue a continuación de esta palabra sera tu código

de configuración de puertos, variables, etc.

Este es solo un ejemplo, la palabra varia dependiendo de los FUSES requeridos.

Saludos. 

Page 41: Program an Do

Citar

16/11/2011 #3

chess98Gracias

Gracias por la Ayuda, Me fue de mucha utilidad 

Si logre hacerlo Funcionar, Al fin! 

Ya le habia configurado los Fuses asi Varias Veces...

quiza me faltaba modificar alguno...

Muchas Gracias por tu Ayuda x) 

Citar

16/11/2011 #4

D@rkbytes

Moderador

chess98 dijo: 

Gracias por la Ayuda, Me fue de mucha utilidad 

Si logre hacerlo Funcionar, Al fin! 

Ya le habia configurado los Fuses asi Varias Veces...

quiza me faltaba modificar alguno...

Muchas Gracias por tu Ayuda x) 

Que bien, suerte y hasta pronto.

Citar

27/10/2012 #5

helterSkelterProblema con palabra de configuración PIC16F887 (PICBasic)

Hola,   

Soy estudiante de medio superior y estoy haciendo un programa usando microcode para el

Pic16f887, el problema está que cuando genero el .hex y quiero quemar mi programa usando

el MASTERPROG

me dice

"AVISO: Faltan los Bits de configuración en el archivo Hex"

Lo que pasa, es que normalmente uso MPLAB para hacer mis Hex... y desconosco totalmente

como agregar la palabra de configuración usando Microcode, si me pudieran auxiliar! Les

estariamos eternamente agradecidos!! 

Citar

27/10/2012 #6

Page 42: Program an Do

D@rkbytes

Moderador

helterSkelter dijo: 

Lo que pasa, es que normalmente uso MPLAB para hacer mis Hex... y desconozco totalmente como

agregar la palabra de configuración usando MicroCode, si me pudieran auxiliar! Les estaríamos

eternamente agradecidos!! 

Si estas utilizando el programa MicroCode Studio, esta es una opción para la palabra de

configuración.

Se utiliza oscilador interno establecido a 8MHz.Código:

@ DEVICE

INTRC_OSC_NOCLKOUT,PROTECT_OFF,CPD_OFF,PWRT_ON,WDT_OFF,LVP_OFF,MCLR_ON,BOD_OFF,F

CMEN_ON,IESO_OFF

@ DEVICE2 WRT_OFF,BOR21V

DEFINE OSC 8 ; Definir que se trabajará con 8MHz

OSCCON = $76 ; %01110110 (118) Reloj interno estable a 8MHz

Tipos de oscilador:

LP_OSC ; Resonador cerámico

XT_OSC ; Cristal de baja frecuencia

HS_OSC ; Cristal de alta frecuencia

EXTCLK_OSC ; Fuente de reloj externa

INTRC_OSC_NOCLKOUT ; Oscilador interno sin salida de reloj

INTRC_OSC_CLKOUT ; Oscilador interno con salida de reloj

RC_OSC_NOCLKOUT ; Oscilador RC externo sin salida de reloj

RC_OSC_CLKOUT ; Oscilador RC externo con salida de reloj

Otro método usando MPLAB fue tratado por aquí: ¿Cómo generar DTMF con PIC?

Suerte.

Citar

03/01/2013 #7

carlosguit Amigos estoy super estresado con este tema le puse los fuses de arriba para un pic

16f877a y me da muchos herrores porfavor mas informes acerca de esto o tengo que

cambiar de programador esque uso masterprog y me aparece el mensaje de los bits que

me faltan y en los libros de basic no agregan fuses ni nada solo veo que te plantean hacer

un programador con picall pero es por puerto dv9 o algo asi pero creo yo y esta obsoleto

ayuda porfavor

Citar

Page 43: Program an Do

03/01/2013 #8

D@rkbytes

Moderador

carlosguit dijo: 

Amigos estoy super estresado con este tema le puse los fuses de arriba para un pic 16f877a y me

da muchos errores por-favor mas informes acerca de esto o tengo que cambiar de programador es-

que uso masterprog y me aparece el mensaje de los bits que me faltan y en los libros de basic no

agregan fuses ni nada solo veo que te plantean hacer un programador con picall pero es por puerto

db9 o algo así pero creo yo y esta obsoleto ayuda por-favor

Sucede que los fuses que mencione anteriormente son para un PIC16F887 no para un

PIC16F877A

Si utilizas MicroCode Studio puedes usar esta palabra de configuración...Código:

@ DEVICE PIC16F877A

@ DEVICE XT_OSC,WDT_OFF,PWRT_ON,BOD_OFF,LVP_OFF

Con estos fuses no debes tener problemas al compilar.

La información sobre los fuses para cada PIC la encuentras en su correspondiente hoja de

datos.

Suerte.

Citar

03/01/2013 #9

carlosguit D@rkbytes dijo: 

Sucede que los fuses que mencione anteriormente son para un PIC16F887 no para un

PIC16F877A

Si utilizas MicroCode Studio puedes usar esta palabra de configuración...Código:

@ DEVICE PIC16F877A

@ DEVICE XT_OSC,WDT_OFF,PWRT_ON,BOD_OFF,LVP_OFF

Con estos fuses no debes tener problemas al compilar.

La información sobre los fuses para cada PIC la encuentras en su correspondiente hoja de

datos.

Suerte.

gracias amigo lo boy aprobar y denuevo muchas gracias por las molestias

Citar

11/03/2013 #10

Page 44: Program an Do

heribertoromerocueva

s

Bits de configuración del archivo .hex

hola, el ccs me compila sin errores, me genera el archivo .hex el problema es que a

la hora de querer escribir en el pic mediante el master prog me sale una leyenda que

dice faltan bits de configuración en el archivo .hex pero en el código pongo todos los

fuses. este este el código de prueba que estoy intentando. agradecería mucho sus

observacionesCódigo:

#include <16f84a.h>

#FUSES NOWDT

#FUSES XT

#FUSES NOPUT

#FUSES NOPROTECT

#use delay(clock=4000000)

#BYTE PORTB=6

#BYTE PORTA=5

VOID MAIN ()

{

SET_TRIS_A(0xFF);

SET_TRIS_B(0X00);

portb=(0x00);

while(TRUE)

{

if(porta==(0x01))

{

portb=(0x01);

}

if(porta==(0x02))

{

portb=(0x02);

}

}

}

Page 45: Program an Do

Citar

27/04/2013 #11

lolopollo Hola soy estudiante de nivel

medio superior de

electronica

Tengo porblemas con la

palabra de configuracion

con pic18f4550, usando el

microcode estudio, y el

mpasm, lo que pasa que

cuando intento grabar me

dice que hace falta bits de

configuracion en el hex y no

se que hacer 

porfavor ayuda

Citar

A lo que me referia es que como se hace para configurar los fuses desde microcode studio o

como puedo saber la configuracion de bits para hacerlo directo desde el pickit.

Y he probado un programa sencillo para hacer parpadear unos leds para ver si funciona el pic,

para leer el dato de un sensor qrd1114 , y por lo menos eso si puede hacer.

Citar

08/07/2012 #2262

LaElectronicaMeOdia Para hacerlo

desde el

software se

pone algo

parecido a

esto:

Código:

@ DEVICE

Page 46: Program an Do

PIC16F84A

@ DEVICE

XT_OSC

@ DEVICE

WDT_OFF

@ DEVICE

PWRT_OFF

@ DEVICE

PROTECT_OFF

pero los

propios para

el

pic18f4550

que son

unos

cuantos

mas. yo no

tengo el

pickit y

desconozco

si esos fuses

se pueden

configurar

desde su

interfaz.

Citar

08/07/2012 #2263

D@rkbytes

Moderador

quevon24 dijo: 

A lo que me referia es que como se hace para configurar los fuses desde microcode studio

Saludos quevon24

Para determinar exactamente que bits de configuración se requieren para cada proyecto,

debes empezar a leer desde la página 288 de la hoja de datos del 18F4550.

Ahora, como lo que quieres es saber como se hace esto desde MCS, aquí adjunto un

ejemplo.

Las instrucciones están comentadas dentro del código.

Suerte.

Archivos Adjuntos

18F4550 Fuses Sample.rar (28,4 KB (Kilobytes), 87 visitas)

Page 47: Program an Do

Citar

17/07/2012 #2264

christus Estimados Amigos;

Como están por favor quisiera saber si se puede programar en Pic Basic en un PIC12F675:

Gracias de antemano por su ayuda.

Citar

17/07/2012 #2265

D@rkbytes

Moderador

christus dijo: 

Estimados Amigos;

Como están por favor quisiera saber si se puede programar en Pic Basic en un PIC12F675:

Gracias de antemano por su ayuda.

Saludos.

Claro que se puede.

Desde un PIC10F202 y con la más reciente versión de PICBasic Pro que es la 3.0.6

Se puede programar hasta un PIC18LF66K80

Suerte.

Citar

18/07/2012 #2266

christus Gracias por la respuesta amigo d@rkbytes pero en el caso de este pic tengo entendido

que hay que hacer una configuracion especial en el programa para que use su clock

interno y en PBP mas o menos como seria y en el caso de los puertos normalmente

trabajamos siempre asi digamos "PORTA.0 = variable" pero en este pic sus pines no estan

nombrados asi.

Te agradezco nuevamente por tu ayuda.

Citar

18/07/2012 #2267

Page 48: Program an Do

D@rkbytes

Moderador

christus dijo: 

Gracias por la respuesta amigo d@rkbytes pero en el caso de este pic tengo entendido que hay que

hacer una configuracion especial en el programa para que use su clock interno y en PBP mas o

menos como seria y en el caso de los puertos normalmente trabajamos siempre asi digamos

"PORTA.0 = variable" pero en este pic sus pines no estan nombrados asi.

Te agradezco nuevamente por tu ayuda.

Saludos nuevamente christus.

Así es. En este tipo de PIC pequeños, cambian algunas cosas.

Por ejemplo, para la calibración del oscilador interno se usa esta definición en la cabecera

del programa.

DEFINE OSCCAL_1K 1

El nombre del puerto cambia de PORTX a GPIO

Por ejemplo para poner un 1 en el bit 0 del puerto, sería...

GPIO.0 = 1 o HIGH GPIO.0

Como mencionaste anteriormente que necesitabas programar un 12F675,

quizás también requieras saber como hacer para que sus pines GP,0,1,2,4 trabajen de

forma digital.

Ya qué en este PIC se pueden usar algunos pines como conversores ADC o en modo

comparador.

Esto se consigue configurando el registro ANSEL en 0 y el registro CMCON en 7 por

ejemplo...

ANSEL = 0

CMCON = 7

Y si requieres que un pin o más sean análogos ya tienes que ver la hoja de datos del PIC,

para seleccionar los pines y configurar correctamente los parámetros del ADC.

Nota: Al programar en PICBasic existe la posibilidad de ahorrarse algunas configuraciones.

Pero siempre es recomendable que conozcas bien como funcionan los registros de los PIC.

Espero que estos comentarios te sirvan de ayuda para programarlo en PICBasic.

Suerte.

Citar

20/07/2012 #2268

christus hola D@rkbytes gracias nuevamente por tu apoyo, queria comentarte he hecho un

programa de prueba y lo estoy simulando en proteus pero no hace nada, el programa es el

siguiente :

DEFINE OSCCAL_1K 1

Page 49: Program an Do

ANSEL = %00000000

CMCON = 7

Inicio:

GPIO.0 = 1

pause 500

GPIO.0 = 0

pause 500

goto inicio

end

No se si estoy cometiendo algún error, gracias por la atencion prestada

Citar

20/07/2012 #2269

D@rkbytes

Moderador

christus dijo: 

hola D@rkbytes gracias nuevamente por tu apoyo, queria comentarte he hecho un programa de

prueba y lo estoy simulando en proteus pero no hace nada, el programa es el siguiente :

DEFINE OSCCAL_1K 1

ANSEL = %00000000

CMCON = 7

Inicio:

GPIO.0 = 1

pause 500

GPIO.0 = 0

pause 500

goto inicio

end

No se si estoy cometiendo algún error, gracias por la atencion prestada

El programa esta bien.

Lo que le hace falta es establecer que pines serán usados como entradas y salidas.

También es recomendable definir la palabra de configuración.

Cuando no se establece ninguna, el compilador utiliza la configuración del archivo

12F675.INC

Page 50: Program an Do

Y a veces no es la configuración que nuestro programa requiere. 

Por eso es importante declararla o establecerla con el programa que graba el PIC.

Adjunto tu programa con las configuraciones correspondientes.

Para que tengas una idea de como se hace esto para un PIC12F675.

Sigue   el curso para que puedas comprender muchas cosas más.

Suerte.

Imágenes Adjuntas

12F675_Default_Compiler_Fuses_.gif (2,9 KB (Kilobytes), 201 visitas)

Archivos Adjuntos

12F675 LED.rar (13,8 KB (Kilobytes), 47 visitas)

Citar

23/07/2012 #2270

christus Muchas gracias amigo d@rkbytes por la ayuda y funciona muy bien gracias de nuevo.

saludos y exitos.

Citar

26/07/2012 #2271

cesarim buenas tardes amigos del foro me gusta bastante esta pagina ya que estoy aprendiendo

mucho he encontrado un tutuorial sobre el manejo de temporizadores y contadores que el

amigo mecatrodatos dejo en la pagina 21 es muy bueno y explicativo quisiera poder pedir

alguien que me oriente yo soy nuevo en esto de los pic estoy programando en basic y uso

el proteus que aca en el foro recomiendan con la version 7.7 con toda franqueza gracias a

todo por el tiempo que le dedican en ayudar a quien piden auxilio mi duda es esta.

en el tutorial que nuestro amigo mecatrodatos explica es muy bueno deja entender de

como se genera una interrupcion sin afectar lo que el pic este haciendo como tarea

este es el programa que el amigo mecatrodo puso como ejemplo donde habilita el

prescaler a 64 con un cristal de 4 mhz lo que hace es contar y cada que llega a 61 habilita

el led3 por un segundo y lo deshabilita x otro segundo y asi rutinariamente es muy bueno

en el archivo rar que mando quise modificar un poco el programa pero no logro entender

como podria hacer para incrementar el tiempo de 1 segundo.

le aumente a 2 segundo el tiempo del led3 y funciona osea se prende por 2 segundos y se

apaga por otro 2 segundo y hasta 4 seg funciona modificando los valores que en el

programa escribo y detallo pero si quiero aumentarle a 5 segundo nunca prende el led3

pero los otros led1 y led2 si oscilan el tiempo que se indica quise probar poniendole

Page 51: Program an Do

registros osea que la cuenta se almacene es una variable cuenta por decir y que cada 61

veces aumente y 1 en cuenta y asi hasta que llegue a un total de cuenta <10 then

cuenta=0 y recien prende el led3 pero no me sale y quisiera saber si ustedes me podrian

ayudar talvez diciendome como hacerlo o con otro tutorial buenazo como el del amigo

mecatrodo gracias aquellas personas que puedan ayudarme

Código:

clear

define osc 4

OPTION_REG=%10000101

;BIT 7=1 DESHABILITA PULL-UPS DE P.B

;BIT 5=0 SELECCIONA EL MODO DE TEMPORIZADOR

;BIT 2=1}

;BIT 1=0} TIMER0 CONJUNTO PREESCALADOR PARA 64

;BIT 0=1}

INTCON=%10100000

;BIT 7=1 PERMITE TODAS LAS INTERRUPCIONES

;BIT 5=1 PERMITE LA INTERRUPCION POR TIMER0

;BIT 2=0 SE ESTABLECE SOBRE LA INTERRUPCION TOIF O ITCON2

Alpha var word ;variable en el codigo de pausa

Beta var byte ;esta vaiable contabiliza 61 en interrupcion

TrisD=%11110100

portD=%00000000

Led0 var Portd.0

Led1 var portd.1

Led3 var Portd.3

beta=0

on interrupt goto SaltoRutina

MainLoop:

if led1=0 then

led1=1

led0=0

else

led1=0

led0=1

endif

for alpha=1 to 300

pauseus 100

next alpha

Page 52: Program an Do

goto mainloop

disable ;deshabilita y habilita el soporte de la rutina a interrumpir

;256*64=16384//16384/1SEG=16.384 ===61

;256*64=16384//16384/2SEG=8.192 ====122 3SEG===183 4SEG===244

saltorutina:

beta=beta+1

if beta < 61 then endinterrupt

beta=0

if led3=1 then

led3=0

else

led3=1

endif

endinterrupt:

INTCON.2=0

RESUME

ENABLE

END

---------- Actualizado después de 18 minutos ---------- 

este es el codigo que trato de modificar pero no logro crear un registro que me permita

almacenar un conteo para mas tiempo se podria cambiar los tiempo de encendido del led

prendido como apagado o siempre el tiempo que prenda ese mismo tiempo apagara

Código:

clear

define osc 4

OPTION_REG=%10000101 ;----aca el prescaler es para 64----

;BIT 7=1 DESHABILITA PULL-UPS DE P.B

;BIT 5=0 SELECCIONA EL MODO DE TEMPORIZADOR

;BIT 2=1}

;BIT 1=0} TIMER0 CONJUNTO PREESCALADOR PARA 64-----

;BIT 0=1}

INTCON=%10100000

;BIT 7=1 PERMITE TODAS LAS INTERRUPCIONES

;BIT 5=1 PERMITE LA INTERRUPCION POR TIMER0

;BIT 2=0 SE ESTABLECE SOBRE LA INTERRUPCION TOIF O ITCON2

Alpha var word ;variable en el codigo de pausa

Page 53: Program an Do

Beta var byte ;esta vaiable contabiliza 61 en interrupcion

Cuenta var word

TrisD=%11110100

portD=%00000000

Led0 var Portd.0

Led1 var portd.1

Led3 var Portd.3

beta=0

on interrupt goto SaltoRutina

MainLoop:

if led1=0 then

led1=1

led0=0

else

led1=0

led0=1

endif

for alpha=1 to 300

pauseus 100

next alpha

goto mainloop

disable ;deshabilita y habilita el soporte de la rutina a interrumpir

saltorutina:

beta=beta+1

if beta < 61 then ;endinterrupt

cuenta=0

beta=0

if beta=0 then

cuenta=cuenta+1

if cuenta <= 10 then endinterrupt

cuenta=0

if led3=1 then

led3=0

else

led3=1

endif

endif

endif

endinterrupt:

Page 54: Program an Do

INTCON.2=0

RESUME

ENABLE

END

estoy leyendo las paginas siguientes pero no logran hablar de este mismo tema creo que

ustedes estan en un nivel super avanzado

Archivos Adjuntos

contador,temporizador.rar (30,2 KB (Kilobytes), 34 visitas)

Citar

27/07/2012 #2272

cesarimhola Amigo mecatrodo

hola amigo mecatrodo me podrias dar un camino o alguien de ustedes brindar una idea

con ejemplos de como empezar hacer este codigo me imagino que devo de crear registro

para almacenar un conteo y si quisiera usar tiempo difernete en encendido y apagado

deberia de usar dos registro pero desconozco de como hacerlo si ustedes me ayudaran les

agradeceria coordilmente

Citar

27/07/2012 #2273

reyvilla cesarim dijo: 

hola amigo mecatrodo me podrias dar un camino o alguien de ustedes brindar una idea con

ejemplos de como empezar hacer este codigo me imagino que devo de crear registro para

almacenar un conteo y si quisiera usar tiempo difernete en encendido y apagado deberia de usar

dos registro pero desconozco de como hacerlo si ustedes me ayudaran les agradeceria coordilmente

Hola cesarim, exactamente cual es tu duda, si sabes usar interrupciones y sabes calcular

el prescaler, lo demás es mas sencillo, lo que quiere decir que no deberías tener ningún

problema. Deberías de plantear un código nuevo echo a partir del ejemplo del amigo

mecatrodatos y no escribir encima de el. Fíjate los ejemplos propuestos aquí yo

particularmente los vería como ejemplo y para la practica, ya que solo para eso sirven,

puede que alguno lo logres adaptar a tus necesidades, pero también creo que es mas

difícil que hacer uno desde cero...Si es de tu interés podríamos empezar con un código

bien sencillo y que debido a que lo vas hacer tu podrás adaptarlo o modificarlo a tu antojo

y así no tener que deducir el código de otro, cada cabeza es un mundo y cada uno tiene

su manera de generar su código en un orden o desorden especifico, aparte de aprender

como funciona cada cosa... Avísame saludoss

Citar

Page 55: Program an Do

28/07/2012 #2274

cesarimReyvilla

hola gracias por respnderme bueno con el tutorial que mencione de nuestro amigo

mecatrodo me estoy iniciando es por ello que quisiera que me puedan orientar muy

agradecido por haberme respondido pense que no obtendria respuestas

Citar

28/07/2012 #2275

reyvilla Bueno empieza organizando un poco las ideas, y para eso te recomiendo hacer un código

de puras configuraciones, osea donde coloques las configuraciones de los fuses, el

oscilador, el tmr0, etc... Menos el código en si, esto para ir corrigiendo por partes en caso

de que haya algo mal en el código...Y unas vez que hayamos depurado esa parte entonces

es que vamos a ver como hacer las temporizaciones mas largas y funcionales.

Citar

30/07/2012 #2276

cesarimsaludos

vale entoncs lo hago y x la noche lo pongo aca en el foro gracias por tu alientos de querer

enseñarme

Citar

31/07/2012 #2277

cesarimAmigo Reyvilla

@ DEVICE PIC16F628A 

@ DEVICE Intrc_OSC

@ DEVICE WDT_OFF

@ DEVICE PWRT_OFF

@ DEVICE LVP_OFF 

@ DEVICE WRT_OFF

@ DEVICE CPD_OFF 

@ DEVICE PROTECT_OFF 

cmcon=7 ;digitaliza el puertoA

define osc 4

OPTION_REG=%10000101 ;----aca el prescaler es para 64----

Page 56: Program an Do

INTCON=%10100000

; aca defino de acuerdo al prescaler y el cristal ya sea interno o externo

; 1/fosc*4 ====> 1/4=0.25us*4=1us

; esta formula lo logro entender y haber si me ayudas y me corriges mi duda

;256* prescaler configurado=====>(256*64)=16384

;ahora 16384/1000 ===>este valor(1000)de donde vendria a salir del tiempo 1 seg

;que quedaria 16.384 y por ultimo dividiria 1us /16.384 ====61.035===>61

ConLed var word ;variable en el codigo de pausa

Incremento var byte ;esta variable seria las veces que contara? 61 antes de producirse la

interrupcion

Registro1 var word ;aca guardaria el conteo de encendido

Registro2 var word ;aca guardaria el conteo de apagado

;====>la variable incremento cuenta las 61 veces y se genera o se p`roduce la

interrupcion,cuando la interrupcion 

;se haya generado se visualizara en el led0 y luego se va gusrandando en el 

;registro1 ¿x veces? luego que llego al valor dado ¿x veces? enciende led1

;sigue ahora el conteo del registro1 donde va contando ¿n veces? lo que el led1 estara

prendido

;almacenando ese tiempo ahora en el registro2 ¿l veces? cuando llego al tiempo dado se

apaga el led1

TrisD=%11110100

portD=%00000000

Led0 var Portd.0

Led1 var portd.1

;este es el 1º paso del codigo que me pediste amigo te agradesco tu tiempo y ojala lo

podamos trabajar.

Citar

02/08/2012 #2278

reyvilla Hola disculpa la demora, te recomiendo colocar los codigos entre los comandos [ CODE ]

[ /CODE ] , para que se puedan leer mejor y ocupen menos espacio. Quedaria algo asi:

Código:

@ DEVICE PIC16F628A

@ DEVICE Intrc_OSC

@ DEVICE WDT_OFF

@ DEVICE PWRT_OFF

@ DEVICE LVP_OFF

@ DEVICE WRT_OFF

@ DEVICE CPD_OFF

@ DEVICE PROTECT_OFF

Page 57: Program an Do

cmcon=7 ;digitaliza el puertoA

define osc 4

OPTION_REG=%10000101 ;----aca el prescaler es para 64----

INTCON=%10100000

; aca defino de acuerdo al prescaler y el cristal ya sea interno o externo

; 1/fosc*4 ====> 1/4=0.25us*4=1us

; esta formula lo logro entender y haber si me ayudas y me corriges mi duda

;256* prescaler configurado=====>(256*64)=16384

;ahora 16384/1000 ===>este valor(1000)de donde vendria a salir del tiempo 1

seg

;que quedaria 16.384 y por ultimo dividiria 1us /16.384 ====61.035===>61

ConLed var word ;variable en el codigo de pausa

Incremento var byte ;esta variable seria las veces que contara? 61

antes de producirse la interrupcion

Registro1 var word ;aca guardaria el conteo de encendido

Registro2 var word ;aca guardaria el conteo de apagado

;====>la variable incremento cuenta las 61 veces y se genera o se p`roduce

la interrupcion,cuando la interrupcion

;se haya generado se visualizara en el led0 y luego se va gusrandando en el

;registro1 ¿x veces? luego que llego al valor dado ¿x veces? enciende led1

;sigue ahora el conteo del registro1 donde va contando ¿n veces? lo que el

led1 estara prendido

;almacenando ese tiempo ahora en el registro2 ¿l veces? cuando llego al

tiempo dado se apaga el led1

TrisD=%11110100

portD=%00000000

Led0 var Portd.0

Led1 var portd.1

No se si trataste de compilarlo pero yo al hacerlo me arroja 3 errores, de los cuales uno

tiene que ver con la configuracion de fuses, los otros dos con el puerto d.

Si te fijas en el porque de estos errores, puede que no sepas que el 16F628A, no posee un

puerto d y tampoco WRT, por lo cual no puedes configurar algo que no existe para ese pic,

eso no es necesario saberlo de memoria aunque muchos no los aprendemos, pero existen

muchos pic, con diferentes puertos y fuses, por lo cual para nosotros es de mucha ayuda

estos errores ya que nos indica donde nos estamos equivocando o que estamos haciendo

mal, permitiéndonos corregir el error antes de programar el pic.

Ahora ya corrigiendo eso nos permite compilar, asi mismo continuo revisando el codigo y

voy indicando a detalle que es lo que ocurre en cada linea.

Código:

Page 58: Program an Do

'****************************************************************

'* Name : UNTITLED.BAS *

'* Author : [select VIEW...EDITOR OPTIONS] *

'* Notice : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *

'* : All Rights Reserved *

'* Date : 02/08/2012 *

'* Version : 1.0 *

'* Notes : *

'* : *

'****************************************************************

@ DEVICE PIC16F628A ;Declaramos el pic a utilizar

@ DEVICE Intrc_OSC ;Declaramos el tipo de oscilador a usar, interno,

externo XT, RC, ETC...

@ DEVICE WDT_OFF ;Declaramos si(ON) Ó no(OFF)se va usar el WDT(Watchdog

Timer), temporizador perro guardian

@ DEVICE PWRT_OFF ;Declaramos si(ON) Ó no(OFF)se va usar el PWRT(Power-

up Timer ), tiempo de encendido

@ DEVICE LVP_OFF ;Declaramos si(ON) Ó no(OFF)se va usar el LVP(LOW

VOLTAGE PROGRAMMING), programacion de bajo voltaje

;@ DEVICE WRT_OFF ;Declaramos si(ON) Ó no(OFF)se va usar el WRT(FLASH

Program Memory Write)

@ DEVICE CPD_OFF ;Declaramos si(ON) Ó no(OFF)se va usar el (Data EE

Memory Code Protect)

@ DEVICE PROTECT_OFF ;Declaramos si(ON) Ó no(OFF)se va usar el (FLASH

Program Memory Code Protection)

cmcon=7 ;Configuracion del modulo comparador (CMCON), de 7 Bit's se

;describen a continuacion.

;bit 7 C2OUT: Comparator 2 Output

;When C2INV = 0:

;1 = C2 VIN+ > C2 VIN-

;0 = C2 VIN+ < C2 VIN

;When C2INV = 1:

;1 = C2 VIN+ < C2 VIN-

;0 = C2 VIN+ > C2 VIN

;bit 6 C1OUT: Comparator 1 Output

;When C1INV = 0:

Page 59: Program an Do

;1 = C1 VIN+ > C1 VIN-

;0 = C1 VIN+ < C1 VIN

;When C1INV = 1:

;1 = C1 VIN+ < C1 VIN-

;0 = C1 VIN+ > C1 VIN

;bit 5 C2INV: Comparator 2 Output Inversion

;1 = C2 Output inverted

;0 = C2 Output not inverted

;bit 4 C1INV: Comparator 1 Output Inversion

;1 = C1 Output inverted

;0 = C1 Output not inverted

;bit 3 CIS: Comparator Input Switch

;When CM2:CM0: = 001

;Then:

;1 = C1 VIN- connects to RA3

;0 = C1 VIN- connects to RA0

;When CM2:CM0 = 010

;Then:

;1 = C1 VIN- connects to RA3

; C2 VIN- connects to RA2

; = C1 VIN- connects to RA0

; C2 VIN- connects to RA1

;bit 2-0 CM2:CM0: Comparator Mode

;Figure 10-1 shows the Comparator modes and CM2:CM0 bit settings

;Ahora que significa cmcon = 7

;Significa que los primeros 3 bit's del cmon valen 1 y el resto vale 0

;Osea es igual que cmcon = %00000111

;Donde los bit's CM0, CM1 Y CM2 quedan en 1

;Si vemos la hoja de datos nos daremos cuentas y una mejor idea con la

grafica.

;Comparators Off

;CM2:CM0 = 111

Page 60: Program an Do

define osc 4 ;Definimos la frecuencia de oscilacion 4, 20, etc...

OPTION_REG=%10000101 ;Registro especial option

;se describe a continuacion.

;bit 7 RBPU: PORTB Pull-up Enable bit

;1 = PORTB pull-ups are disabled

;0 = PORTB pull-ups are enabled by individual port latch values

;bit 6 INTEDG: Interrupt Edge Select bit

;1 = Interrupt on rising edge of RB0/INT pin

;0 = Interrupt on falling edge of RB0/INT pin

;bit 5 T0CS: TMR0 Clock Source Select bit

;1 = Transition on RA4/T0CKI pin

;0 = Internal instruction cycle clock (CLKOUT)

;bit 4 T0SE: TMR0 Source Edge Select bit

;1 = Increment on high-to-low transition on RA4/T0CKI pin

;0 = Increment on low-to-high transition on RA4/T0CKI pin

;bit 3 PSA: Prescaler Assignment bit

;1 = Prescaler is assigned to the WDT

;0 = Prescaler is assigned to the Timer0 module

;bit 2-0 PS2:PS0: Prescaler Rate Select bits

'BIT.2 PS2

'BIT.1 PS1

'BIT.0 PS0

'Bit Value - TMR0 Rate - WDT Rate

'PS0,PS1,PS2 -

' 0 0 0 - 1 : 2 - 1 : 1

' 0 0 1 - 1 : 4 - 1 : 2

' 0 1 0 - 1 : 8 - 1 : 4

' 0 1 1 - 1 : 16 - 1 : 8

' 1 0 0 - 1 : 32 - 1 : 16

' 1 0 1 - 1 : 64 - 1 : 32

' 1 1 0 - 1 : 128 - 1 : 64

' 1 1 1 - 1 : 256 - 1 : 128

Page 61: Program an Do

;Donde quedo asi: OPTION_REG=%10000101

;Prescaler a 64 y con pulls-up activas

INTCON=%10100000 ;Registro especial INTCON

;se describe a continuacion.

;bit 7 GIE: Global Interrupt Enable bit

;1 = Enables all un-masked interrupts

;0 = Disables all interrupts

;bit 6 PEIE: Peripheral Interrupt Enable bit

;1 = Enables all un-masked peripheral interrupts

;0 = Disables all peripheral interrupts

;bit 5 T0IE: TMR0 Overflow Interrupt Enable bit

;1 = Enables the TMR0 interrupt

;0 = Disables the TMR0 interrupt

;bit 4 INTE: RB0/INT External Interrupt Enable bit

;1 = Enables the RB0/INT external interrupt

;0 = Disables the RB0/INT external interrupt

;bit 3 RBIE: RB Port Change Interrupt Enable bit

;1 = Enables the RB port change interrupt

;0 = Disables the RB port change interrupt

;bit 2 T0IF: TMR0 Overflow Interrupt Flag bit

;1 = TMR0 register has overflowed (must be cleared in software)

;0 = TMR0 register did not overflow

;bit 1 INTF: RB0/INT External Interrupt Flag bit

;1 = The RB0/INT external interrupt occurred (must be cleared in software)

;0 = The RB0/INT external interrupt did not occur

;bit 0 RBIF: RB Port Change Interrupt Flag bit

;1 = When at least one of the RB7:RB4 pins changed state (must be cleared in

software)

;0 = None of the RB7:RB4 pins have changed state

;Donde quedo asi: INTCON=%10100000

;Se activaron las interrupciones globales, y unicamente se uso la

interrupcion

;por desbordamiento del TMR0

Page 62: Program an Do

;Hasta aqui bastante bien...

;Aun faltan cosas antes de empezar a usar variables y son las declaraciones

;de los puertos y los pines de los puertos cuales con entradas y cuales

;son salidas, aparte de la instrupcion de interrupcion y la subrutina

;de salto en caso de interrupcion.

ConLed var word ;variable en el codigo de pausa

Incremento var byte ;esta variable seria las veces que contara? 61 antes de

producirse la interrupcion

Registro1 var word ;aca guardaria el conteo de encendido

Registro2 var word ;aca guardaria el conteo de apagado

;TrisD=%11110100 N/A, osea, NO EXISTE ó NO APLICA

;portD=%00000000 N/A, osea, NO EXISTE ó NO APLICA

;Led0 var Portd.0 N/A, osea, NO EXISTE ó NO APLICA

;Led1 var portd.1 N/A, osea, NO EXISTE ó NO APLICA

Bueno cualquier cosa me avisas saludoss

Citar

03/08/2012 #2279

cesarim amigo si tienes razon muy buena tu explicacion sobre el cmcon

Código:

@ DEVICE PIC16F628A

@ DEVICE Intrc_OSC

@ DEVICE WDT_OFF

@ DEVICE PWRT_OFF

@ DEVICE LVP_OFF

@ DEVICE CPD_OFF

@ DEVICE PROTECT_OFF

cmcon=7

define osc 4

OPTION_REG=%10000101

INTCON=%10100000

Page 63: Program an Do

ConLed var word ;variable en el codigo de pausa

Incremento var byte ;esta variable seria las veces que contara? 61 antes al

producirse la interrupcion salta a registro1

Registro1 var word ;guarda el conteo de encendido por 5 min luego salta al

registro2

Registro2 var word ;guarda el conteo de apagado por 1 min luego vuelve a

la misma rutina si no se creo ningun codigo mas

Led0 var PortB.0 ;avisó´que se produjo la interrupcion de echo me

imagino que ni se vera pero en un osciloscopio me gustaria ver

Led1 var PortB.6 ;cuando registro1 se activo se prende por 5 min

luego se apaga

Led2 var PortB.7 ;cuando registro2 se cativa se prende por 1 min

espero;;;;;espero poder estar haciendo algo correcto

;de verdad gracias por corregirme si me equivoco

Push1 var PortA.6 ;si se quisiera trabajar con pulsador1

Push2 var PortA.7 ;o pulsador2

Trisb=%00111110 ;$3E

PortB=0

TrisA=%11000000 ;$C0

PortA=0

aca dejo este codigo

Citar

03/08/2012 #2280

reyvilla que bueno, mira para que no te confundas tanto, en el icono de abajo de Más

Opciones..., te da una barra de herramientas donde tienes un icono con el símbolo #,

para poder usarlo seleccionas el texto que deseas que quede dentro del recuadro y luego

de tener seleccionado el texto le das al icono # y listo el lo coloca, para poder ver como

va a quedar le das a vista previa y eso te permite corregir antes de publicar tu

comentario, trata de corregirlo para poder entender mejor tu código...saludosss

GRAN MASTER#3 22/Ene/2009, 12:31

Bien puedes encontrar detallada informacion dentro de la hoja de datos del PIC que estas usando y a manera de resumen:

WDT o WDTEN = es el Watch Dog Timer, sirve para monitorear el estado de un PIC y si se ha trabado o hay un desbordamiento no Programado causa el reset del PIC, muy util en trabajos

Page 64: Program an Do

profesionales pero el no saber configurarlo nos trae muchos problemas.

XT = Es pra oscilador Externos de baja velocidad por ejemplo cuando usas un cristal de 4MHz

HS = High Speed para osciladores externos para cristales mayores a  8MHz debes habilitar dicho Fuse, en este PIC hay sus variaciones como los de USB y los registros PLL que son divisores los cuales elevan la frecuencia.

MCLR = Es para activar el reset manual del PIC, este va en la patilla marcada como MCLR que a veces posee funciones de I/O, es por ello que debe ser programada segun tus requerimientos. Hay PICs como el 16F84A que solo tiene la funcion de reset. Cuando funciona como tal debes poner un boton pulldown para generar el reset manual.

PWRT= Power-on Reset  Esta característica permite al PIC no inicializar hasta que le circuito interno se haya cargado completamente, lo cual es útil para evitar falsos inicios en el PIC.

LVP= Operación Low-Power Esta característica permite al PIC trabajar en bajo consumo, generalmente a 5V consumen cerca de 2mA pero si se activa esta opción puede operar con 15µA a 3V, lo cual lo hace muy funcional cuando se usan baterías.

CP = Code Protection, Habilita la proteccion de codigo de tu PIC, es decir una vez grabado lo puedes volver a leer pero no te mostrara el codigo fuente o el HEX si no mostrar solo FF o 00 lo cual sirve para proteger contra pirateria en chip jejeje.

CPD = Data Code Protec, Habilita la Proteccion de codigo de la EEprom del PIC evitando asi ser Leida.

Y bueno todos esos depende del PIC mas info en la hoja de datos del PIC que uses.

Saludos

M2ETH V2 soporte para PoE y VoIP: VoIPIC Comig soon! 

Usa el foro para preguntar, NO ENVIES PRIVADOS

ZEROYPAMEPADAWAN

#4 22/Ene/2009, 12:32

Ok en eso estoy de acuerdo, pero mi duda es cuando se deve activar cada opcion o para que se deve activar, para que es cada opcion del oscilador y de los fuses??

por ejemplo para un simple programita para prender y apagar un led:

'Programa que enciende un led

inicio:        High 0        pause 1000        low 0        pause 1000        goto inicioend

para un 16f628A, que se debe activar o desactivar y en la parte de oscilador que se selecciona?

y el circuito es el pic y el led a la pata 6 con su resistencia, sin oscilador

Gracias.

navaismoGRAN MASTER

#5 22/Ene/2009, 12:34

Cita:por ejemplo para un simple programita para prender y apagar un led:Todo depedn'Programa que enciende un led

Page 65: Program an Do

inicio:  High 0  pause 1000  low 0  pause 1000  goto inicioend

para un 16f628A, que se debe activar o desactivar y en la parte de oscilador que se selecciona?

y el circuito es el pic y el led a la pata 6 con su resistencia, sin oscilador

Gracias.

 Todo eso depende de las consideraciones del Programador, es decir, de ti tu defines que quieres usar y que no o como quieres que funcione, para un programa sencillo basta con activar el MCLR, el XT o INTRC etc y con eso funcionara.

M2ETH V2 soporte para PoE y VoIP: VoIPIC Comig soon! 

Usa el foro para preguntar, NO ENVIES PRIVADOS

ZEROYPAMEPADAWAN

#6 22/Ene/2009, 12:43

Ok con eso me doy por bien servido, muchchas gracias por su tiempo, a seguir estudiando y probando. gracias

ZEROYPAMEPADAWAN

#7 22/Ene/2009, 15:05

Hola otra vez molestandolos compañeros

solo una pregunta, encontr este programa en internet es para un letrero con matriz de leds:

http://www.4shared.com/file/81990506/e1dfc613/programa.html

alguien sabe en que programa lo puedo compilar???

por que lo he compilado en el micro code studio y con el proton y me manda muchos errores o sera que le faltan lineas???

Gracias...

navaismoGRAN MASTER

#8 22/Ene/2009, 15:18Editado por navaismo

Nop, no es ninguno de los dos, de hecho no parece tener una estructura conocida a algun Basic me aventuraria a decirte que lo probaras con MBASIC o PSI.

Pero lo que si es que se ve 100% traducible a PBP o Proton.

M2ETH V2 soporte para PoE y VoIP: VoIPIC Comig soon! 

Usa el foro para preguntar, NO ENVIES PRIVADOS

Page 66: Program an Do

ZEROYPAMEPADAWAN

#9 22/Ene/2009, 16:38

Ok gracias por tu teimpo comañero, voy a chekarlo.

DOMINGO, 8 DE JULIO DE 2012

Fusibles o "bits" de Configuración en PICLes dejo esta interesante y útil  información para quienes comienzan a programar los PIC en assembler y en C...

Quiero dar las GRACIAS a  http://xorwf.blogspot.com  por el aporte...

¿Fusibles? Los bit's de configuración o también llamados "fusibles" permiten configurar ciertas funciones en los microcontroladores PIC. La cantidad de funciones dependen del microcontrolador, por ejemplo, en el 16F84A existen 4 funciones, en el 16F88 son alrededor de 13 funciones.

¿Para qué sirven?Nos permiten configurar algunas funciones del micro, como el tipo de oscilador, la proteccion de codigo, habilitar el perro guardian (evita que se quede pegado el micro), habilitar el reset maestro, habilitar un reset inicial, habilitar reset por bajo voltage en la fuente, habilita el modo "depurador" o debugger, entre otros.

¿Cuándo se usan?Si estamos usando alguno de los programadores de Microchip como el pickit2 o el pickit3, debemos escribir la configuracion de estos fusibles en la cabecera de nuestro código fuente, antes de compilar.

¿Como se que fusibles usa el micro?Todo esto aparece en la hoja de datos del micro (datasheet) , y se pueden obtener del fichero que incluimos en la cabecera del fuente, el P16F88.INC por ejemplo, que se encuentra en la carpeta "MPASM suite" que esta dentro de la carpeta "microchip" donde instalamos el MPLAB, ojo que el nombre del fichero depende del micro.

De los ficheros antes mencionados se obtiene lo siguiente:

Para el 16F84A

_CP_ON              EQU   H'000F'_CP_OFF            EQU   H'3FFF'_PWRTE_ON      EQU   H'3FF7'_PWRTE_OFF    EQU   H'3FFF'_WDT_ON          EQU   H'3FFF'_WDT_OFF        EQU   H'3FFB'_LP_OSC            EQU   H'3FFC'_XT_OSC           EQU   H'3FFD'_HS_OSC           EQU   H'3FFE'_RC_OSC           EQU   H'3FFF'

La "Palabra de Configuración", es la que AGRUPA todos estos de la siguiente forma, usando la directiva: "__CONFIG" (ojo que tiene 2 guión bajo antes de config)

__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC

Si se quiere activar una de las opciones anteriores, solo hay que cambiar el OFF por el ON.

Page 67: Program an Do

Para el 16F88

_CONFIG1  EQU  H'2007'_CONFIG2  EQU  H'2008'

;Configuration Byte 1 Options_CP_ALL     EQU H'1FFF'_CP_OFF     EQU H'3FFF'_CCP1_RB0 EQU H'3FFF'_CCP1_RB3 EQU H'2FFF'_DEBUG_OFF EQU H'3FFF'_DEBUG_ON EQU H'37FF'_WRT_PROTECT_OFF EQU H'3FFF' ;No program memory write protection_WRT_PROTECT_256 EQU H'3DFF' ;First 256 program memory protected_WRT_PROTECT_2048 EQU H'3BFF' ;First 2048 program memory protected_WRT_PROTECT_ALL EQU H'39FF' ;All of program memory protected_CPD_ON EQU H'3EFF'_CPD_OFF EQU H'3FFF'_LVP_ON EQU H'3FFF'_LVP_OFF EQU H'3F7F'_BODEN_ON EQU H'3FFF'_BODEN_OFF EQU H'3FBF'_MCLR_ON EQU H'3FFF'_MCLR_OFF EQU H'3FDF'_PWRTE_OFF EQU H'3FFF'_PWRTE_ON EQU H'3FF7'_WDT_ON EQU H'3FFF'_WDT_OFF EQU H'3FFB'_EXTRC_CLKOUT EQU H'3FFF'_EXTRC_IO EQU H'3FFE'_INTRC_CLKOUT EQU H'3FFD'_INTRC_IO EQU H'3FFC'_EXTCLK EQU H'3FEF'_HS_OSC EQU H'3FEE'_XT_OSC EQU H'3FED'_LP_OSC EQU H'3FEC'

;Configuration Byte 2 Options_IESO_ON EQU H'3FFF'_IESO_OFF EQU H'3FFD'_FCMEN_ON EQU H'3FFF'_FCMEN_OFF EQU H'3FFE'

y la "Palabra de Configración" sería algo como esto:

;Program Configuration Register 1__CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _MCLR_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC

;Program Configuration Register 2__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFFPublicado por Paticio Cortés Aburto en 01:56 

Configuracion bits Pickit 2 programmer

Buenas a todos, abro este hilo porque estoy intentando averiguar cuales son los bits que

Page 68: Program an Do

corresponden a la configuracion de un pic mediante pickit 2 program para el pickit 2 clone,

si alguien tiene alguna informacion por lo minima que sea de que funcion activa y

desactiva cada bit en la config de pic y desea compartirla se lo agradeceria, en el MPlab se

activan y desactivan los fuses al mismo tiempo que compilas pero seria mucho mas

comodo el poder hacerlo desde el propio pickit 2 programmer sin tener que recompilar

para cambiar los fuses.

Os adjunto una imagen de la parte de la configuracion del pickit 2 programmer por si

estoy equivocado y desea arrojarme algo de luz al respecto.

config bit.jpg

Saludos a todos.

Citar

06/08/2011 #2

Daniel Meza Simplemente se tiene que hace click sobre las casillas que no estén sombreadas para

cambiar el valor de cada bit. Por otra parte en la hoja técnica del PIC que uses esta el

orden de los bits de la palabra de configuración para saber que bits modificar. Saludos

Citar

06/08/2011 #3

Moyano Jonathan Lo más recomendable es programar los fusibles dentro del código fuente, entonces

cuando compiles el programa lo único que tenés que hacer es grabarlo en el

microcontrolador, ya que el software del pickit2 se encarga de grabar los fuses contenidos

en el archivo .hex

Citar

06/08/2011 #4

rockbrand amigo te adjunto un txt con una configuracion básica encontrada en un ejercicio guia.

Espero te sirvan. Saludos

Archivos Adjuntos

config bits.txt (2,7 KB (Kilobytes), 365 visitas)

Citar

07/08/2011 #5

Page 69: Program an Do

mikeekim Si me sirve, aunque siento habeos hecho perder el tiempo, he encontrado una manera

bastante comoda de cambiar los fuses, en el MPlab en el menu configure/ configuration

bits te da un valor en la pestaña value que corresponden a los bits configurados, ese value

se lo introduces al pickit2 program en configuration y no necesitas recompilar para

cambiar la config/fuses, por ejemplo si el pic fuese un 16F84A con XT WDT OFF, PWRTE

ON, CP OFF el MPlab te da 3FF1 solo hay que introducirlo ese valor en el pickit 2 program

en configuracion, que value marque 3FF1 y tienes la config deseada.

Saludos y gracias por vuestra ayuda. 

Citar

29/10/2012 #6

ctronicDulceycodigo binario de configuracion del 16f877a para pickit2

que tal compañeros..!

tengo una pregunta: sé que se pueden configurar los fusibles del pic16f877a en la edicion

del codigo fuente..

pero para grabar el pic tengo el PICKIT2 y en la parte superior derecha del area de trabajo

hay un boton para configurar el dispositivo mediante un codigo binario el cual no

conozco...

alguien podria decirme por favor cual es el codigo de configuracion correspondiente al

16f877a para pickit2???? muchas gracias de antemano.....

buen dia

Citar

13/02/2013 #7

jeryusDuda en Configuracion de P16F887 Prog PICBASIC

saludos amigos! 

se me presento una duda, estoy iniciando en esto de la programación de

microcontroladores en el lenguaje Basic, inicie con el programa MicroCode Studio y un

pequeño manual de practicas y los pequeños codigos sin problemas, compilados

correctamente pero a la hora de querer escribir el pic me aparece un error en el PicKit

como el que adjunto en la imagen, hasta donde entiendo me falta la palabra de

configuración, intente escribirla como se escribe en ensamblador pero me da error de

sintaxis asi que lo borre pero el problema persistio, alguien sabe como corregir este

error ? de antemano, muchas gracias por la atención! 

Citar

Page 70: Program an Do

13/02/2013 #8

razetto Configuraste el PICkit para que funcione con el Micro Studio?. Fijate en View>Compile and

program options>Pestaña programmer. tenes que tener cargado el PICkit ahi.

Citar

13/02/2013 #9

jeryus si, de echo cuando presiono el boton de compile and program, compila el programa y me

abre el pckit pero cuando quiero cargar el Xnombre.hex me aparece el error mencionado

arriba... 

Citar

13/02/2013 #10

D@rkbytes

Moderador

Lo que pasa es que no estás declarando la palabra de configuración en tu código.

Agrega esta configuración de fuses en la cabecera de tu programa.Código:

;*****************************************************************************

**

; Palabra de configuración

@ DEVICE

INTOSCIO,PWRT_ON,MCLR_ON,WDT_OFF,BOD_OFF,LVP_OFF,FCMEN_OFF,IESO_OFF

@ DEVICE2 WRT_OFF,BOR21V

;*****************************************************************************

**

OSCCON = %1110101 ; Oscilador interno estable a 8MHz.

DEFINE OSC 8 ; Definir que se usaran 8MHz de reloj

;*****************************************************************************

**

Puedes modificar los que desees, conforme a los requerimientos de tu programa.

Ésta configuración es standard para trabajar con el oscilador interno a 8MHz.

Los fuses disponibles para el PIC16F887 los encuentras en la carpeta INC donde tengas

instalado PBP

Por default C:\PBP\INC

El archivo se llama M16F88X.INC

Suerte.

Page 71: Program an Do

Citar

13/02/2013 #11

jeryus D@rkbytes dijo: 

Lo que pasa es que no estás declarando la palabra de configuración en tu código.

Agrega esta configuración de fuses en la cabecera de tu programa.Código:

;*****************************************************************************

**

; Palabra de configuración

@ DEVICE

INTOSCIO,PWRT_ON,MCLR_ON,WDT_OFF,BOD_OFF,LVP_OFF,FCMEN_OFF,IESO_OFF

@ DEVICE2 WRT_OFF,BOR21V

;*****************************************************************************

**

OSCCON = %1110101 ; Oscilador interno estable a 8MHz.

DEFINE OSC 8 ; Definir que se usaran 8MHz de reloj

;*****************************************************************************

**

Puedes modificar los que desees, conforme a los requerimientos de tu programa.

Ésta configuración es standard para trabajar con el oscilador interno a 8MHz.

Los fuses disponibles para el PIC16F887 los encuentras en la carpeta INC donde tengas instalado PBP

Por default C:\PBP\INC

El archivo se llama M16F88X.INC

Suerte.

saludos Darkbytes, agregue la parte de codigo que me dijiste, y ahora me aparecen 2 alertas

y 2 errores como podras ver en la imagen, cual es el problema persistente? agrego que el

problema con PicKit2 Persiste :s

por otro lado, llamame novato si gustas pero, podrias explicarme mas a detalle que son los

fuses ? son los fuses los que se activan/desactivan en las palabras de configuracion ?

Citar

13/02/2013 #12

D@rkbytes

Moderador

Saludos, como este asunto de los fuses ya lo he tratado en varios temas,

aquí tienes un documento que te va a servir para su comprensión.

Significado de los Fuses (DOC) Y al parecer cuando en MicroCode al declarar los fuses, te

produce error,

debes actualizar el PBP que tienes a la versión 2.60, que fue la última antes de MCS v5.0.0.0

Page 72: Program an Do

con PBPX v3.0.X.X

Al hacer la actualización, ya podrás compilar sin errores.

Nota: No uses la opción (Use MPASM) para compilar a menos que vayas a usar un PIC18

Suerte.

Citar

27/02/2013 #13

electronica001problema con pickit2

hola tengo un problema con el pickit2 generico cuando le conecto no me reconoce como

nuevo dispocitivo pero si me reconoce el pic en el programa, aora lo grabo pero no me

funciona cuando lo armo en el proto e probado con circuitos sensillos como apagar y

encender un led pero no funciona a que se debe por que no esta grabando me parece que

debo configurar o que cambios debo hacer en el programa gracias.

la vercion que tengo es 2.61

Citar

27/02/2013 #14

jeryus electronica001 dijo: 

hola tengo un problema con el pickit2 generico cuando le conecto no me reconoce como nuevo

dispocitivo pero si me reconoce el pic en el programa, aora lo grabo pero no me funciona cuando lo

armo en el proto e probado con circuitos sensillos como apagar y encender un led pero no funciona

a que se debe por que no esta grabando me parece que debo configurar o que cambios debo hacer

en el programa gracias.

la vercion que tengo es 2.61

yo nunca pude hacer trabajar los programas en microcode studio, no encontre el proble,a

lo que yo hice fue instalarme el MikroBasic y trabajar en ese, con este programa no eh

tenido ningun problema

Citar

31/05/2013 #15

Alcocer Garcia

Felix Davi

tengo un problema parecido el programa lo graba bien en el pic 16f877a pero no funciona

al momento de implmentarlo en protoboard . Gracias

Citar

Page 73: Program an Do

31/05/2013 #16

D@rkbytes

Moderador

Alcocer Garcia Felix Davi dijo: 

tengo un problema parecido el programa lo graba bien en el pic 16f877a pero no funciona al

momento de implmentarlo en protoboard . Gracias

¿Ya revisaste bien la palabra de configuración?

¿La configuración del registro ADCON1, para determinar que pines serán análogos y

cuales digitales?

¿El pin de reset, cristal, etc.?