Velocidad de los PIC

Hola:

pic_controller.jpg


He estado observando por la red, y controlar ciertos dispositivos, los PIC convensionales son muy lentos, hasta los IC de lógica discreta funcionan más rápido.

Me imagino que los dsPIC van más rápido todavía en términos de controlar periféricos. Los PIC32 al menos tienen 80 MHz. Otros microcontroladores van excelentemente muy rápido. Es que veo gente que se meten con cualquier microcontrolador rápido e incluso FPGA de los pequeños. Al principio aprenden algo con PIC por ser muy popular a escala mundial.

Por lo que veo, Microchip tiene que espavilar y sacar PIC mucho más rápido aunque la tecnología nueva sea muy diferente y no compatible con los actuales, que vendan los dos al mismo tiempo. O renova o muere.

¿Qué opinan?

Hay muchos microcontroladores para escoger la verdad.
Microcontroladores




Un cordial saludo.
 
Última edición:
Opino que si y que no.
SI que es verdad que la velocidad de un pic da mucha risa comparada con la del peor pc que puedas comprar.
Pero para muuuuuchas aplicaciones NO hace falta mas velocidad.

Opino que si quieres algo serio con un interface de usuario complejo etc puedes usar un raspberryPI o similar.

También opino que nunca me gustaron los pic comparabdolos con cualquier otro microcontrolador; son demasiado diferentes al resto, pero me quito el sombrero por la política comercial y de soporte de microchip: Samples, precios bajos, herramientas gratuitas...
 
Meta me estas dando ganas de vender el programador de PICs, la verdad los PIC no me gustan mucho pero es lo que más se vende, casi como ir a la tienda de la esquina y lo pides :LOL:, lo usé solamente en un proyecto y después conseguí probar los MSP430 de TI que me han sido bastante amigables para usar y muy versátiles, ahora probando unos ARM (Cortex M0+ y M4F) y con el costo a los que me venden estos chips (que aun importándolos me salen más baratos que comprar un PIC aquí) ya no se para que quiero PIC.
 
Para aprender, los PIC están bien, es donde se consiguen por todas partes. En asm son medio fáciles de entender y con posibilidad de otros lenguajes de alto nivel de todo tipo.

Tiene muchos libros sobre ellos frente a otra competencia que no lo tiene, al menos en español. No conozco ningún libro al español de AVR de Atmel, sobre PIC de Microchip a patadas y siguen apareciendo más nuevos y modernos.

En cuanto a otros microcontroladores poco conocido también he visto libros en español hace mucho tiempo.

Total, parece ser que el más favorito que hay son ARM. Si pasas de PIC a AVR no será gran cosa, según he lído por Internet, mejor ARM, siempre con ARM, como si fuera fácil como los PIC, ajjaaja, ojalá hayan libros sobre ellos.

Total, al menos con PIC hace cositas.
 
Meta, yo quiero hacer algo que no necesita tanta velocidad, pero no encuentro información.

En tu vasta información y conocimientos ¿Me podrías recomendar una página o libro para conocer algo del pic 16f819 en modo Capture-Compare, algún ejemplo para guiarme? (de preferencia para programar en ASM que es el que conozco).

Te pregunto porque gracias a tí aprendí a usar el 16f84 con el libro que nos recomendaste.

Saludos.
 
Hola:

Con el PIC16F886 tengo algunos ejemplos. Libro recomendado dedicado a ella es:

microcontroladores-pic-teoria-y-practica-el-pic16f88x-y-el-labo-ratorio-usb-pci-school-9788492779987.jpg


Solo me he metido en captura y comparar por el aire y funciona bien, tanto en ASM como en C.

Código:
Los módulos CCPx. 
;Modo de Captura, Medida de un periodo.
;
;El ejemplo emplea el módulo CCP1 y trata de capturar el valor del TMR1 cada vez que lleguen
;dos flancos ascendentes por la línea RC2/CCP1. Conocida la velocidad a la que evoluciona el 
;TMR1, se puede determinar el lapsus de tiempo transcurrido entre un flanco y el siguiente
;(el periodo).
;
;La pantalla LCD visualiza dicho lapsus de tiempo expresado en microsegundos. Hay que multiplicarlo
;por 8 (valor del preescaler del TMR1) para obtener el valor final del periodo
        
        List    p=16F886        ;Tipo de procesador
        include    "P16F886.INC"    ;Definiciones de registros internos

;Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
;adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades

        __config    _CONFIG1, _LVP_OFF&_PWRTE_ON&_WDT_OFF&_EC_OSC&_FCMEN_OFF&_BOR_OFF    ;Palabra 1 de configuración
        __config    _CONFIG2, _WRT_OFF&_BOR40V                                    ;Palabra 2 de configuración

            cblock    0x20        ;Inicio de variables de la aplicación
                Byte_L            ;Parte baja del byte a convertir
                Byte_H            ;Parte alta del byte a convertir
                BCD_2            ;Byte 2 de conversión a BCD
                BCD_1            ;Byte 1 de conversión a BCD
                BCD_0            ;Byte 0 de conversión a BCD
                Contador        ;Variable de contaje
                Captura            ;Nº de capturas
                Temporal        ;Variable temporal                            
            endc    

Lcd_var        equ    0x70            ;Variables para las rutinas de manejo del LCD

            org    0x00            ;Vector de RESET    
            goto    Inicio
            org    0x04            ;Vector de interrupción
            goto    CCP1_Inter
            org    0x05

    include    "LCD4bitsPIC16.inc"    ;Incluye rutinas de manejo del LCD

;Visualizar: Visualiza sobre la pantalla LCD los cinco dígitos situados en las variables
;BCD_0, BC_1 y BCD_2

Visualizar    movlw    0x80
            call    LCD_REG        ;Posiciona el cursor
            movlw    3
            movwf    Contador    ;Inicia contador de bytes a convertir
            movlw    BCD_0
            movwf    FSR            ;Inicia puntero índice
Visual_loop    swapf    INDF,W
            andlw    0x0f
            iorlw    0x30        ;Convierte a ASCII el nible de más peso
            call    LCD_DATO    ;Lo visualiza
            movf    INDF,W
            andlw    0x0f
            iorlw    0x30        ;Convierte a ASCII el nible de menos peso
            call    LCD_DATO    ;Lo visualiza
            decf    FSR,F        ;Siguiente byte
            decfsz    Contador,F
            goto    Visual_loop
            movlw    ' '
            call    LCD_DATO    ;Visualiza ' '
            movlw    0xe4
            call    LCD_DATO    ;Visualiza micro
            movlw    'S'
            call    LCD_DATO    ;Visualiza 'S'
            return

;16Bits_BCD: Esta rutina convierte un número binario de 16 bits situado en Byte_H y
;Byte_L y, en 5 dígitos BCD que se depositan en las variables BCD_0, BCD_1 y BCD_2,
;siendo esta última la de menos peso.
;Está presentada en la nota de aplicación AN544 de MICROCHIP y adaptada por Ingeniería de
;Microsistemas Programados S.L.

Bits16_BCD    bcf        STATUS,C
            clrf    Contador    
            bsf        Contador,4    ;Carga el contador con 16        
            clrf    BCD_0
            clrf    BCD_1
            clrf    BCD_2        ;Puesta a 0 inicial

Loop_16        rlf        Byte_L,F
            rlf        Byte_H,F
            rlf        BCD_2,F
            rlf        BCD_1,F
            rlf        BCD_0,F        ;Desplaza a izda. (multiplica por 2)
            decfsz    Contador,F
            goto    Ajuste
            return

Ajuste        movlw    BCD_2
            movwf    FSR            ;Inicia el índice
            call    Ajuste_BCD    ;Ajusta el primer byte
            incf    FSR,F
            call    Ajuste_BCD    ;Ajusta el segundo byte
            incf    FSR,F
            call    Ajuste_BCD
            goto    Loop_16

Ajuste_BCD    movf    INDF,W        
            addlw    0x03
            movwf    Temporal    
            btfsc    Temporal,3    ;Mayor de 7 el nibble de menos peso ??
            movwf    INDF        ;Si, lo acumula
            movf    INDF,W        
            addlw    0x30
            movwf    Temporal
            btfsc    Temporal,7    ;Mayor de 7 el nibble de menos peso ??
            movwf    INDF        ;Si, lo acumula
            return
    
;Programa de tratamiento de la interrupción que provoca el módulo CCP1 cada vez que se
;detecta un flanco ascendente por la línea RC2/CCP1.
    
CCP1_Inter    btfsc    Captura,0    ;Es la captura del 2º flanco ??
            goto    Medir        ;Si, medir el tiempo transcurrido entre ambas
            incf    Captura,F    ;No, ha sido la captura del 1er. flanco
            clrf    TMR1H
            clrf    TMR1L        ;Borra el TMR1 para iniciar la medida            
            bcf        PIR1,CCP1IF    ;Repone el flag del módulo CCP1
            retfie

;Al detectar 2 flancos ascendentes se obtiene el tiempo transcurrido entre la 1ª y 2ª captura
Medir        movf    CCPR1L,W
            movwf    Byte_L
            movf    CCPR1H,W
            movwf    Byte_H        ;Lee el valor capturado desde el TMR1

;Se convierte a BCD y visualiza en el LCD
            call    Bits16_BCD    ;Convertir a BCD
            call    Visualizar    ;Salida a pantalla LCD
            incf    Captura,F    ;Capturar el 1er. flanco
            bcf        PIR1,CCP1IF    ;Repone el flag del módulo CCP1            
            retfie

;Programa principal

Inicio          clrf    PORTB        ;Desconecta salidas
            clrf    PORTA
            bsf        STATUS,RP0    
            bsf        STATUS,RP1    ;Banco 3
            clrf    ANSEL        
            clrf    ANSELH        ;Puertas A y B digitales
            bcf        STATUS,RP1    ;Banco 1
            bsf        PIE1,CCP1IE    ;Habilita interrupción del módulo CCP1
            bcf        STATUS,RP0    ;Banco 0

;Configura e inicia la pantalla LCD    
            call    UP_LCD        ;Configura puertos para el LCD
            call    LCD_INI        ;Inicia el LCD
            movlw    b'00001100'
            call    LCD_REG        ;LCD On, cursor y blink Off

;El TMR1 actúa en el modo temporizador con reloj interno y un preescaler 1:8 evoluciona cada 8uS a 4MHz.
;Según esto, el periodo máximo que se puede medir estará comprendido entre 0,5s (2Hz) y 8 uS (125 KHz) aproximadamente.
;Para otros rangos se debe seleccionar un preescaler diferente.

            movlw    b'00110001'
            movwf    T1CON        ;TMR1 en On, preescaler 1:8        
            movlw    b'11000000'
            movwf    INTCON        ;Habilita interrupciones

;El módulo CCP1 actúa en modo de captura cada flanco ascendente

            movlw    b'00000101'
            movwf    CCP1CON        ;Módulo CCP en On
            clrf    Captura        ;Inicia captura en el 1er. flaco ascendente

Loop        nop
            goto    Loop        ;Bucle infinito        

            end                    ;Fin del programa fuente



Otro ejemplo:
Código:
Los módulos CCPx. 
;Modo de Captura, Medida de la duración de un pulso.
;
;El ejemplo emplea el módulo CCP1 y trata de capturar el valor del TMR1 cada vez que lleguen
;un flanco ascendente y otro descendente por la línea RC2/CCP1. Conocida la velocidad a la 
;que evoluciona el TMR1, se puede determinar el lapsus de tiempo transcurrido entre ambos
;flancos, lo que nos dará la anchura del pulso.
;    
;La pantalla LCD visualiza dicho lapsus de tiempo expresado en microsegundos. Hay que multiplicarlo
;por 8 (valor del preescaler del TMR1) para obtener el valor final.
        
        List    p=16F886        ;Tipo de procesador
        include    "P16F886.INC"    ;Definiciones de registros internos

;Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
;adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades

        __config    _CONFIG1, _LVP_OFF&_PWRTE_ON&_WDT_OFF&_EC_OSC&_FCMEN_OFF&_BOR_OFF    ;Palabra 1 de configuración
        __config    _CONFIG2, _WRT_OFF&_BOR40V                                    ;Palabra 2 de configuración

            cblock    0x20        ;Inicio de variables de la aplicación
                Byte_L            ;Parte baja del byte a convertir
                Byte_H            ;Parte alta del byte a convertir
                BCD_2            ;Byte 2 de conversión a BCD
                BCD_1            ;Byte 1 de conversión a BCD
                BCD_0            ;Byte 0 de conversión a BCD
                Contador        ;Variable de contaje
                Captura            ;Nº de capturas
                Temporal        ;Variable temporal                            
            endc    

Lcd_var        equ    0x70            ;Variables para las rutinas de manejo del LCD

            org    0x00            ;Vector de RESET    
            goto    Inicio
            org    0x04            ;Vector de interrupción
            goto    CCP1_Inter
            org    0x05

    include    "LCD4bitsPIC16.inc"    ;Incluye rutinas de manejo del LCD

;Visualizar: Visualiza sobre la pantalla LCD los cinco dígitos situados en las variables
;BCD_0, BC_1 y BCD_2

Visualizar    movlw    0x80
            call    LCD_REG        ;Posiciona el cursor
            movlw    3
            movwf    Contador    ;Inicia contador de bytes a convertir
            movlw    BCD_0
            movwf    FSR            ;Inicia puntero índice
Visual_loop    swapf    INDF,W
            andlw    0x0f
            iorlw    0x30        ;Convierte a ASCII el nible de más peso
            call    LCD_DATO    ;Lo visualiza
            movf    INDF,W
            andlw    0x0f
            iorlw    0x30        ;Convierte a ASCII el nible de menos peso
            call    LCD_DATO    ;Lo visualiza
            decf    FSR,F        ;Siguiente byte
            decfsz    Contador,F
            goto    Visual_loop
            movlw    ' '
            call    LCD_DATO    ;Visualiza espacio
            movlw    0xe4
            call    LCD_DATO    ;Visualiza micro
            movlw    'S'
            call    LCD_DATO    ;Visualiza 'S'
            return

;16Bits_BCD: Esta rutina convierte un número binario de 16 bits situado en Byte_H y
;Byte_L y, en 5 dígitos BCD que se depositan en las variables BCD_0, BCD_1 y BCD_2,
;siendo esta última la de menos peso.
;Está presentada en la nota de aplicación AN544 de MICROCHIP y adaptada por Microsystems
;Engineering

Bits16_BCD    bcf        STATUS,C
            clrf    Contador    
            bsf        Contador,4    ;Carga el contador con 16        
            clrf    BCD_0
            clrf    BCD_1
            clrf    BCD_2        ;Puesta a 0 inicial

Loop_16        rlf        Byte_L,F
            rlf        Byte_H,F
            rlf        BCD_2,F
            rlf        BCD_1,F
            rlf        BCD_0,F        ;Desplaza a izda. (multiplica por 2)
            decfsz    Contador,F
            goto    Ajuste
            return

Ajuste        movlw    BCD_2
            movwf    FSR            ;Inicia el índice
            call    Ajuste_BCD    ;Ajusta el primer byte
            incf    FSR,F
            call    Ajuste_BCD    ;Ajusta el segundo byte
            incf    FSR,F
            call    Ajuste_BCD
            goto    Loop_16

Ajuste_BCD    movf    INDF,W        
            addlw    0x03
            movwf    Temporal    
            btfsc    Temporal,3    ;Mayor de 7 el nibble de menos peso ??
            movwf    INDF        ;Si, lo acumula
            movf    INDF,W        
            addlw    0x30
            movwf    Temporal
            btfsc    Temporal,7    ;Mayor de 7 el nibble de menos peso ??
            movwf    INDF        ;Si, lo acumula
            return

;Programa de tratamiento de la interrupción que provoca el módulo CCP1 cada vez que se
;detecta, primero un flanco ascendente y luego un descendente por la línea RC2/CCP1.

CCP1_Inter    btfsc    Captura,0    ;Es la captura del flanco descendente
            goto    Medir        ;Si, medir el tiempo transcurrido entre ambas
            incf    Captura,F    ;No, ha sido la captura del flanco ascendente
            bcf        CCP1CON,0    ;Capturar al flanco descendente
            clrf    TMR1H
            clrf    TMR1L        ;Borra el TMR1 para iniciar la medida
            bcf        PIR1,CCP1IF    ;Repone el flag del módulo CCP1
            retfie

;Al detectar 2 flancos, uno ascendente y otro descendente, se calcula el tiempo 
;transcurrido entre la 1ª y 2ª captura
Medir        movf    CCPR1L,W
            movwf    Byte_L
            movf    CCPR1H,W
            movwf    Byte_H        ;Lee el valor capturado desde el TMR1

;Se convierte a BCD y visualiza en el LCD
            bsf        CCP1CON,0    ;Captura al flanco ascendente
            call    Bits16_BCD    ;Convertir a BCD
            call    Visualizar    ;Salida a pantalla LCD
            incf    Captura,F    ;Capturar el 1er. flanco
            bcf        PIR1,CCP1IF    ;Repone el flag del módulo CCP1
            retfie

;Programa principal

Inicio          clrf    PORTB        ;Desconecta salidas
            clrf    PORTA
            bsf        STATUS,RP0    
            bsf        STATUS,RP1    ;Banco 3
            clrf    ANSEL        
            clrf    ANSELH        ;Puertas A y B digitales
            bcf        STATUS,RP1    ;Banco 1
            bsf        PIE1,CCP1IE    ;Habilita interrupción del módulo CCP1
            bcf        STATUS,RP0    ;Banco 0

;Configura e inicia la pantalla LCD    
            call    UP_LCD        ;Configura puertos para el LCD
            call    LCD_INI        ;Inicia el LCD
            movlw    b'00001100'
            call    LCD_REG        ;LCD On, cursor y blink Off

;El TMR1 actúa en el modo temporizador con reloj interno y un preescaler 1:8 evoluciona cada 8uS a 4MHz.
;Según esto, el periodo máximo que se puede medir estará comprendido entre 0,5s (2Hz) y 8 uS (125 KHz) 
;aproximadamente. Para otros rangos se debe seleccionar un preescaler diferente.

            movlw    b'00110001'
            movwf    T1CON        ;TMR1 en On, preescaler 1:8        
            movlw    b'11000000'
            movwf    INTCON        ;Habilita interrupciones

;El módulo CCP1 actúa en modo de captura al flanco ascendente

            movlw    b'00000101'
            movwf    CCP1CON        ;Módulo CCP en On
            clrf    Captura        ;Inicia captura en el 1er. flaco ascendente

Loop        nop
            goto    Loop        ;Bucle infinito        

            end                    ;Fin del programa fuente

Una más:
Código:
;Los módulos CCPx. 
;Modo de Captura. Medida del tiempo entre un pulso y el siguiente.
;
;El ejemplo emplea el módulo CCP1 y trata de capturar el valor del TMR1 cada vez que lleguen
;un flanco descendente y otro ascendente por la línea RC2/CCP1. Conocida la velocidad a la 
;que evoluciona el TMR1, se puede determinar el lapsus de tiempo transcurrido entre ambos
;flancos, lo que nos dará el tiempo transcurrido entre el final de un pulso y el comienzo 
;del siguiente.
;
;La pantalla LCD visualiza dicho lapsus de tiempo expresado en microsegundos. Hay que multiplicarlo
;por 8 (valor del preescaler del TMR1) para obtener el valor final.
        
        List    p=16F886        ;Tipo de procesador
        include    "P16F886.INC"    ;Definiciones de registros internos

;Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
;adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades

        __config    _CONFIG1, _LVP_OFF&_PWRTE_ON&_WDT_OFF&_EC_OSC&_FCMEN_OFF&_BOR_OFF    ;Palabra 1 de configuración
        __config    _CONFIG2, _WRT_OFF&_BOR40V                                    ;Palabra 2 de configuración

            cblock    0x20        ;Inicio de variables de la aplicación
                Byte_L            ;Parte baja del byte a convertir
                Byte_H            ;Parte alta del byte a convertir
                BCD_2            ;Byte 2 de conversión a BCD
                BCD_1            ;Byte 1 de conversión a BCD
                BCD_0            ;Byte 0 de conversión a BCD
                Contador        ;Variable de contaje
                Captura            ;Nº de capturas
                Cap_1_L
                Cap_1_H            ;Variables temporales para las capturas
                Temporal        ;Variable temporal                            
            endc    

Lcd_var        equ    0x70            ;Variables para las rutinas de manejo del LCD

            org    0x00            ;Vector de RESET    
            goto    Inicio
            org    0x04            ;Vector de interrupción
            goto    CCP1_Inter
            org    0x05

    include    "LCD4bitsPIC16.inc"    ;Incluye rutinas de manejo del LCD

;Visualizar: Visualiza sobre la pantalla LCD los cinco dígitos situados en las variables
;BCD_0, BC_1 y BCD_2

Visualizar    movlw    0x80
            call    LCD_REG        ;Posiciona el cursor
            movlw    3
            movwf    Contador    ;Inicia contador de bytes a convertir
            movlw    BCD_0
            movwf    FSR            ;Inicia puntero índice
Visual_loop    swapf    INDF,W
            andlw    0x0f
            iorlw    0x30        ;Convierte a ASCII el nible de más peso
            call    LCD_DATO    ;Lo visualiza
            movf    INDF,W
            andlw    0x0f
            iorlw    0x30        ;Convierte a ASCII el nible de menos peso
            call    LCD_DATO    ;Lo visualiza
            decf    FSR,F        ;Siguiente byte
            decfsz    Contador,F
            goto    Visual_loop
            movlw    ' '
            call    LCD_DATO    ;Visualiza ' '
            movlw    0xe4
            call    LCD_DATO    ;Visualiza micro
            movlw    'S'
            call    LCD_DATO    ;Visualiza 'S'
            return

;16Bits_BCD: Esta rutina convierte un número binario de 16 bits situado en Byte_H y
;Byte_L y, en 5 dígitos BCD que se depositan en las variables BCD_0, BCD_1 y BCD_2,
;siendo esta última la de menos peso.
;Está presentada en la nota de aplicación AN544 de MICROCHIP y adaptada por Microsystems
;Engineering

Bits16_BCD    bcf        STATUS,C
            clrf    Contador    
            bsf        Contador,4    ;Carga el contador con 16        
            clrf    BCD_0
            clrf    BCD_1
            clrf    BCD_2        ;Puesta a 0 inicial

Loop_16        rlf        Byte_L,F
            rlf        Byte_H,F
            rlf        BCD_2,F
            rlf        BCD_1,F
            rlf        BCD_0,F        ;Desplaza a izda. (multiplica por 2)
            decfsz    Contador,F
            goto    Ajuste
            return

Ajuste        movlw    BCD_2
            movwf    FSR            ;Inicia el índice
            call    Ajuste_BCD    ;Ajusta el primer byte
            incf    FSR,F
            call    Ajuste_BCD    ;Ajusta el segundo byte
            incf    FSR,F
            call    Ajuste_BCD
            goto    Loop_16

Ajuste_BCD    movf    INDF,W        
            addlw    0x03
            movwf    Temporal    
            btfsc    Temporal,3    ;Mayor de 7 el nibble de menos peso ??
            movwf    INDF        ;Si, lo acumula
            movf    INDF,W        
            addlw    0x30
            movwf    Temporal
            btfsc    Temporal,7    ;Mayor de 7 el nibble de menos peso ??
            movwf    INDF        ;Si, lo acumula
            return

;Programa de tratamiento de la interrupción que provoca el módulo CCP1 cada vez que se
;detecta, primero un flanco descendente y, luego un ascendente por la línea RC2/CCP1.
CCP1_Inter    btfsc    Captura,0    ;Es la captura del flanco ascendente ??
            goto    Medir        ;Si, medir el tiempo transcurrido entre ambas
            incf    Captura,F    ;No, ha sido la captura del flanco descendente
            bsf        CCP1CON,0    ;Capturar al flanco ascendente
            clrf    TMR1H
            clrf    TMR1L        ;Borra el TMR1 para iniciar la medida
            bcf        PIR1,CCP1IF    ;Repone el flag del módulo CCP1
            retfie

;Al detectar 2 flancos, uno descendente y otro ascendente, se calcula el tiempo 
;transcurrido entre la 1ª y 2ª captura
Medir        movf    CCPR1L,W
            movwf    Byte_L
            movf    CCPR1H,W
            movwf    Byte_H        ;Lee el valor capturado desde el TMR1

;Se convierte a BCD y visualiza en el LCD
            bcf        CCP1CON,0    ;Captura al flanco descendente
            call    Bits16_BCD    ;Convertir a BCD
            call    Visualizar    ;Salida a pantalla LCD
            incf    Captura,F    ;Capturar el 1er. flanco
            bcf        PIR1,CCP1IF    ;Repone el flag del módulo CCP1
            retfie

;Programa principal

Inicio          clrf    PORTB        ;Desconecta salidas
            clrf    PORTA
            bsf        STATUS,RP0    
            bsf        STATUS,RP1    ;Banco 3
            clrf    ANSEL        
            clrf    ANSELH        ;Puertas A y B digitales
            bcf        STATUS,RP1    ;Banco 1
            bsf        PIE1,CCP1IE    ;Habilita interrupción del módulo CCP1
            bcf        STATUS,RP0    ;Banco 0

;Configura e inicia la pantalla LCD    
            call    UP_LCD        ;Configura puertos para el LCD
            call    LCD_INI        ;Inicia el LCD
            movlw    b'00001100'
            call    LCD_REG        ;LCD On, cursor y blink Off

;El TMR1 actúa en el modo temporizador con reloj interno y un preescaler 1:8 evoluciona cada 8uS a 4MHz.
;Según esto, el periodo máximo que se puede medir estará comprendido entre 0,5s (2Hz) y 8 uS (125 KHz) 
;aproximadamente. Para otros rangos se debe seleccionar un preescaler diferente.

            movlw    b'00110001'
            movwf    T1CON        ;TMR1 en On, preescaler 1:8        
            movlw    b'11000000'
            movwf    INTCON        ;Habilita interrupciones

;El módulo CCP1 actúa en modo de captura al flanco descendente

            movlw    b'00000100'
            movwf    CCP1CON        ;Módulo CCP en On
            clrf    Captura        ;Inicia captura en el 1er. flaco descendente

Loop        nop
            goto    Loop        ;Bucle infinito        

            end                    ;Fin del programa fuente

Te darán ideas. A lo mejor quieres algo relacionado con PWM, ya me dirás.
 
...Tiene muchos libros sobre ellos frente a otra competencia que no lo tiene, al menos en español. No conozco ningún libro al español de AVR de Atmel, sobre PIC de Microchip a patadas y siguen apareciendo más nuevos y modernos.

Lamentablemente la mejor información siempre se consigue en inglés, pero por otro lado también eso es relativamente bueno, que haya un idioma sobre el resto para no tener que saberte todos los demás idiomas vivos que existen.
 
Hola:

Con el PIC16F886 tengo algunos ejemplos.

Muchas gracias, Maestro Meta. :aplauso:

Voy a ponerme a estudiarlos. Eres grande!!. Saludos.

Postdata: Quisiera ver si puedo adquirir el libro.

Lamentablemente la mejor información siempre se consigue en inglés, pero por otro lado también eso es relativamente bueno, que haya un idioma sobre el resto para no tener que saberte todos los demás idiomas vivos que existen.

Pues yo considero que sé lo suficiente de inglés, pero aún así en microchip no he comprendido bien los manuales de temas como éste que me ha compartido Meta.

Y desde luego que ha de haber sitios en inglés que sean entendibles, pero por ahora no he encontrado o tal vez no he buscado mucho.
Saludos.
 
Última edición:
Es peliagudo el tema de las traducciones, leer el original etc...
A ver, en ocasiones he traducido algún manual para mi uso y siempre tengo el dilema en algunos puntos en los que yo entiendo mejor la palabra original que la traducida. De si al traducir la palabra pierde sentido la abreviatura que nombra al registro etc.
Por otra parte programar un microcontrolador suele ser confuso, los modos de los temporizadores etc suelen involucrar a varios bits de varios registros que se han de programar de una forma determinada y eso precisa de tiempo y concentración.
 
Pero eso no es por un tema de idioma, sino que Meta te tira la información ya digerida por él.

Y eso te va a pasar en español, inglés o en cualquier otro idioma.

Tengo años interpretando manuales en inglés, tienes razón, todo depende de quien explica.
El problema que he encontrado en Microchip es que los ejemplos que he encontrado vienen en Pic Basic. Yo domino el Basic y el Visual Basic, pero no me he metido al Pic Basic y como tengo implementado el MPLAB, me ha gustado programar en ASM y no he querido perder el tiempo por ahora descargando el Pic Basic (Ya sé que tiene muchas ventajas utilizar el alto nivel, pero quiero experimentar con ensamblador).

Por otro lado, Microchip al darte un ejemplo, supone que uno ya armó el principio del programa y para quien está aprendiendo, necesita ver el programa desde el principio.

Ahora que Meta es muy bueno para explicar y eso en cualquier idioma es invaluable.

Y Scooter tiene toda la razón también en que por primera vez entender todas esas directivas es confuso, ya sea en inglés o en chino, por lo que siempre ayuda ver ejemplos completos paso a paso.

Saludos.
 
Última edición:
Meta, donde bajo la libreria
"LCD4bitsPIC16.inc"
que esta en los ejemplos que posteas?
quiero correrlos/simularlos y modificarlos a mis necesidades (16F819)

pues si nos conseguimos el libro, seguro que ahi vienen.
por eso lo pienso comprar, ya lo vi en varios sitios anunciado.

pero por lo pronto a mi me basta con ver los ejemplos porque voy a hacer otras cosas y estos me sirven mucho.
 
Última edición:
mmhhhh... primero pruebo el ejemplo crudo, tal cual me lo planteann, después empiezo a hacer modificaciones, por eso la solicitaba, de echo como visualizador, todas las veces empleo Led display de 7 segmentos, porque con esos mini números de los LCD no veo nada!
Aquí encontre algo, imagino que es la mísma, la que pone Meta en el ejemplo...
lcd_4bit.asm%20.txt
 
Miré a vuelo de pájaro la librería, porque se me vino a la cabeza lo que has pensado...
le ví unos andlw b'11110000' antes de depacharse con los datos por el PORTB.
Después la simularée en el Proteus, y lo montaré en la protoboard, pero ya trabando con led display de 7 segmentos con un código 100% mío, donde tengo la seguridad que el RB3, es solo para el CCP.



Hablando del título del hilo, es verdad que los PIC vienen a paso de tortuga... es que son menos poderosos y flexibles que son competidores, pero hay algo que no podemos renegar de MicroChip, y creo que es fundamental a la hora de tomar una disición, es la terrible cantidad de información que hay al respecto, lo estoy padeciendo, ando entrando en el mundillo de los Atmel, y no hay tanta info como en el caso de los pic's.
Eso de mucha velocidad, no me imagino tratando de hacer funcionar un chip en la protoboard, un chip que en realidad es una emisora de FM de tanta velocidad que tiene...
 
Última edición:
donde tengo la seguridad que el RB3, es solo para el CCP.

Ya probé uno de los ejemplos con MPLAB y con Proteus, yo tenía puesta la entrada de Captura con un push button en RB3 y por más que hice pruebas no me funcionaba, pero luego cambié la entrada de Captura a RB2 y funcionó muy bien.
Ahora, lo que no entiendo es cómo se puede elegir a RB2 o a RB3 como entrada de Captura.
El datasheet dice que eso se configura en el registro "This selection is set in bit 12
(CCPMX) of the Configuration Word register." Pero no sé cómo configurar el bit 12.
Por lo pronto lo voy a seguir usando el RB2 para el CPP.
Así es que los ejemplos tienen razón, son para RB2. (lo que no sé es porqué jeje)
 
Última edición:
La librería del LCD de 4 bits orientada para le 16F886.

Código:
;Este conjunto de rutinas diseñadas para PIC16 que permiten realizar las tareas 
;básicas de control del módulo de visualización LCD, mediante un interface de 4 bits. 
;Este fichero se debe incluir en los futuros programas fuente mediante la directiva INCLUDE
;
;Las rutinas están adaptadas a las velocidades más lentas de algunos módulos LCD, en las cuales 
;el tiempo de activación (Tc) entre una señal ENABLE y la siguiente es de unos 4 uS. La 
;velocidad de trabajo se supone de 4MHz. 

;UP_LCD:         Configuración PIC para el LCD.
;
;LCD_INI:         Rutina de visualización según Wintek. El LCD queda activado, borrado
;                y en la 1ª posición del cursor
;
;LCD_DATO:         Escritura de datos en DDRAM o CGRAM. Envía el dato presente en el W
;
;LCD_REG:         Escritura de comandos en el LCD. Envía el comando presente en el W
;

;Se supone un interface de 4 bits. RB0-RB3 es la puerta de datos. RA1-RA3 son las señales de control. 
;Estas conexiones se pueden modificar según se necesite

#define ENABLE           bsf PORTA,1     ;Activa señal E (RA1)
#define DISABLE          bcf PORTA,1     ;Desactiva señal E (RA1)
#define LEER             bsf PORTA,2     ;Pone LCD en Modo RD (RA2)
#define ESCRIBIR         bcf PORTA,2     ;Pone LCD en Modo WR (RA2)
#define LCD_COMANDO      bcf PORTA,3     ;Desactiva RS (modo comando)(RA3)
#define LCD_DATOS       bsf PORTA,3       ;Activa RS (modo dato)(RA3)
#define LCD_C_PORT        PORTA            ;Puerta de control del LCD (RA1-RA3)
#define    LCD_C_TRIS        TRISA            ;Control de la puerta de control del LCD
#define LCD_PORT        PORTB            ;Puerta de datos del LCD (RB0-RB3)
#define LCD_TRIS        TRISB            ;Control de la puerta de datos del LCD

;Variables empleadas por las rutinas de control del LCD        
                        CBLOCK    Lcd_var    ;Inicio de las variables. Será la primera                        
                            Lcd_Temp_1    ;direccón libre disponible
                            Lcd_Temp_2
                            Lcd_Temp_3
                        ENDC                                            

;*************************************************************************
;UP_LCD: Configuración PIC para el LCD.
;
UP_LCD          LCD_COMANDO             ;RS=0
                DISABLE                 ;E=0
                ESCRIBIR                ;R/W=0
                bsf        STATUS,RP0        ;Banco 1
                movf    LCD_C_TRIS,W
                andlw    b'11110001'
                movwf    LCD_C_TRIS        ;Puerta de control del LCD como salida
                movf    LCD_TRIS,W
                andlw    0xF0
                movwf   LCD_TRIS        ;Puerta de datos del LCD como salidas
                bcf        STATUS,RP0        ;Banco 0
                return

;**************************************************************************
;LCD_BUSY: Lectura del Flag Busy y de la dirección. No retorna hasta que busy sea "0"
;
LCD_BUSY    clrwdt
            bsf        STATUS,RP0        ;Banco 1
               movf    LCD_TRIS,W
            andlw    0xf0
            iorlw    0x0f
            movwf    LCD_TRIS        ;Puerta de interface como entradas
            bcf        STATUS,RP0        ;Banco 0
            LCD_COMANDO                ;Modo dato
            LEER                    ;Pone el LCD en Modo RD
LCD_BUSY_1    nop
            ENABLE                  ;Activa el LCD
               swapf    LCD_PORT,W
            andlw    b'11110000'
            movwf    Lcd_Temp_3        ;Lee y salva los 4 bits de mas peso
            DISABLE
            nop
            ENABLE                    ;Activa el LCD
            nop
            movf    LCD_PORT,W
            andlw    b'00001111'
            iorwf    Lcd_Temp_3,F    ;Lee y salva los 4 bits de menos peso
            nop
            DISABLE
            btfsc    Lcd_Temp_3,7    ;Busy activado ??
            goto    LCD_BUSY_1        ;Si, volver a leer
            ESCRIBIR                ;Modo escritura
            bsf        STATUS,RP0        ;Banco 1
              movf    LCD_TRIS,W
            andlw    0xf0    
            movwf   LCD_TRIS        ;Puerta de interface como salida
            bcf        STATUS,RP0        ;Banco 0
            return
        
;**************************************************************************
;LCD_E: Pulso de Enable. En algunos LCD's esta señal debe estar a "0" un tiempo mínimo 
;antes de volver a ponerse a "1". Se puede variar el valor de temporización en función
;del tipo de LCD.
;
LCD_E           ENABLE              ;Activa E
                nop
                nop
                DISABLE             ;Desactiva E
                nop
                nop
                return

;**************************************************************************
;LCD_DATO: Escritura de datos en DDRAM o CGRAM. Envía el dato presente en el W
;
LCD_DATO        movwf    Lcd_Temp_2    ;Salva el dato a visualizar
                call    LCD_BUSY    ;Espera que el LCD esté libre
                movlw    0xf0
                andwf    LCD_PORT,F
                swapf    Lcd_Temp_2,W
                andlw    0x0F
                iorwf    LCD_PORT,F    ;Salida de los 4 bits de mas peso
                ESCRIBIR            ;Modo escritura
                LCD_DATOS            ;Modo datos
                call    LCD_E        ;Genera pulso de Enable
                movlw    0xf0
                andwf    LCD_PORT,F
                movf     Lcd_Temp_2,W
                andlw    0x0f
                iorwf    LCD_PORT,F    ;Salida de los 4 bits de menos peso
                call    LCD_E        ;Genera pulso de Enable
                return
                
;**************************************************************************
;LCD_REG: Escritura de comandos en el LCD. Envía el comando presente en el W

LCD_REG         movwf    Lcd_Temp_2    ;Salva el dato a visualizar
                call    LCD_BUSY    ;Espera que el LCD esté libre
                movlw    0xf0
                andwf    LCD_PORT,F
                swapf    Lcd_Temp_2,W
                andlw    0x0f
                iorwf    LCD_PORT,F    ;Salida de los 4 bits de mas peso
                ESCRIBIR            ;Modo escritura
                LCD_COMANDO            ;Modo comandos
                call    LCD_E        ;Genera pulso de Enable
                movlw    0xf0
                andwf    LCD_PORT,F
                movf    Lcd_Temp_2,W    
                andlw    0x0f
                iorwf    LCD_PORT,F    ;Salida de los 4 bits de menos peso
                call    LCD_E        ;Genera pulso de Enable
                return

;***************************************************************************
;LCD_INI: Rutina de visualización según Wintek. El LCD queda activado, borrado
;y en la 1ª posición del cursor

LCD_INI            movlw    .75
                movwf    Lcd_Temp_1
                call    LCD_DELAY    ;Temporización de unos 15mS tras el Power-On
                DISABLE
                ESCRIBIR
                LCD_COMANDO            ;Modo comando y escritura
                movlw    0xf0
                andwf    LCD_PORT,F
                movlw    0x03
                iorwf    LCD_PORT,F    ;Comando FUNCTION SET sin chequeo de busy
                call    LCD_E        ;Genera pulso de Enable
                movlw    .25
                movwf    Lcd_Temp_1
                call    LCD_DELAY    ;Temporiza unos 5mS
                movlw    0xf0
                andwf    LCD_PORT,F
                movlw    0x03        
                iorwf    LCD_PORT,F    ;Comando FUNCTION SET sin chequeo de busy
                call    LCD_E        ;Genera pulso de Enable
                movlw    .5
                movwf    Lcd_Temp_1
                call    LCD_DELAY    ;Temporiza unos 1 ms
                movlw    0xf0
                andwf    LCD_PORT,F
                movlw    0x02
                iorwf    LCD_PORT,F    ;Comando FUNCTION SET a 4 bits sin chequeo de busy
                call    LCD_E        ;Genera pulso de Enable
                movlw    b'00101000'    
                call    LCD_REG        ;Comando FUNCTION SET con chequeo de busy
                movlw    b'00001000'
                call    LCD_REG        ;Display Off
                movlw    b'00000001'
                call    LCD_REG        ;Comando HOME
                movlw    b'00001100'
                call    LCD_REG        ;Comando Diaplay ON
                return    

;*****************************************************************************
;LCD_DELAY: Rutina de temporización de unos 200 uS a 4MHz que se repite tantas veces
;como indica la variable Lcd_Temp_1. Se emplean las variables Lcd_Temp_1
;y LCD_Temp_2 en lugar del TMR0. Este queda libre para las aplicaciones del usuario

LCD_DELAY:        movlw    .50
                movwf    Lcd_Temp_2
LCD_DELAY_1:    clrwdt
                decfsz    Lcd_Temp_2,F
                goto    LCD_DELAY_1
                decfsz    Lcd_Temp_1,F    ;Bucle de 4uS que se repite 50 veces (200us)
                goto    LCD_DELAY        ;El bucle de 200uS se repite Lcd_Temp_1 veces
                return
Si el PIC16F886 y tienes otro, puedes adaptarlo al tuyo mirando los registros, un conjo, usa para cambiar de banco y nombre de la memoria RAM con la directiva:

BANKSEL PORTA

por poner un ejemplo.

Los mejores libros que he visto para aprender biuen, bien el asm es el www.pic16f84a.org te vale para cualquier PIC, es verdad que los proyecto ya son obsoletos, el asm sigue en pie.

El otro es el que puse arriba, el libro rojo, es como un datasheet pero en español y con ejemplos en asm y C, vale la pena para los nuevos PIC, orientado al PIC16F886, te vale para el PIC16F88 al PIC16F887 de 40 pines.

Ahora la gente sacan libros de arduino, se cree que estará en español si hay demanda uno de 170 páginas, me regiero el oficial, aquí hay otro libro de arduino en español.

5741458be040b780414e740972687e83.jpg


Este libro tengo ganas de comprarlo cuando tenga algo de €€€€€€€ y su entrenadora. Es muchísimo más fácil programarlo que un PIC.

http://www.creacionescopyright.com/...product_id=141&option=com_virtuemart&Itemid=2

Índice:
http://www.creacionescopyright.com/documentoscc/978-84-15270-26-3.pdf

Saludo.
 
Última edición:
Meta, gracias por subir la librería.

Vistroni, mirado lo que has posteado, efectivamente en la hoja de datos del 16F819, se puede optar por el RB2 ó RB3, se hacen en el encabezado del programa, ese asunto del:
__CONFIG _CCP1_RB3
lo deja en RB3
Tambien existe en el CCS, pero ya lo cambie y no me funciona el programa... no sé que demonios está fallando. :cry:
 
Atrás
Arriba