Una inquietud acerca de aplicacion ¿utilizar C o ASM?

Buen dia compañeros del foro:

Quizas me puedes ayudar con una inquietud.....
Miren estoy por empezar en mi instituto un proyecto con las siguientes carateristicas:
*Pantalla glcd 240X128 (se puede en C pero ocupa mas espacio de mem flash por lo q entiendo o en ASM)
*RTC DS1302 (se puede en C pero ocupa mas espacio de mem flash por lo q entiendo o en ASM)
*Mem 24LC512 (se puede en C pero ocupa mas espacio por lo q entiendo o en ASM)
*Xbee-PRO (se puede en C pero ocupa mas espacio por lo q entiendo o en ASM)
*Teclado 4X4 (se puede en C pero ocupa mas espacio por lo q entiendo o en ASM)
*conexion USB (Todo lo encuentro en C ¿se puede en asm?)

Me preocupa el espacio de la mem de programa del micro PIC18F4550

Q me recomiendan???? C o ASM???

Muchas gracias por la colaboracion
 
Personalmente, no me lo pensaría y usaría C.

Si lo haces en ASM el código resultante es mucho más largo y tedioso, además de difícil de depurar.

El ASM, personalmente, lo uso para aquellas rutinas particulares o aplicaciones cortas donde el resultado debe ser lo más rápido y/o corto posible, dejando el resto al compilador.

Claro que dicho compilador debe ser realmente eficiente. Lo digo porque los que he usado para AVR hacen un trabajo realmente estupendo y es muy difícil hacer optimizaciones mejores.

Un pequeño detalle: las pantallas LCD tienen un añadido que les hace 'consuir' mucha memoria: las fuentes de texto (mira si el controlador tiene dichas fuentes), gráficos, imágenes, bitmaps, textos, etc. No es nada raro que dichos datos se almacenen en una memoria externa como la que comentas.
 
Buen dia compañeros del foro:

Quizas me puedes ayudar con una inquietud.....
Miren estoy por empezar en mi instituto un proyecto con las siguientes carateristicas:
*Pantalla glcd 240X128 (se puede en C pero ocupa mas espacio de mem flash por lo q entiendo o en ASM)
*RTC DS1302 (se puede en C pero ocupa mas espacio de mem flash por lo q entiendo o en ASM)
*Mem 24LC512 (se puede en C pero ocupa mas espacio por lo q entiendo o en ASM)
*Xbee-PRO (se puede en C pero ocupa mas espacio por lo q entiendo o en ASM)
*Teclado 4X4 (se puede en C pero ocupa mas espacio por lo q entiendo o en ASM)

Se puede en C y en ASM. Si, es cierto que C requiere más memoria Flash, RAM, etc...


*conexion USB (Todo lo encuentro en C ¿se puede en asm?)

Si, tanto en C como en ASM se pueden hacer muy bien.

Me preocupa el espacio de la mem de programa del micro PIC18F4550

Precisamente está optimizado en C. Es el PIC indocado.

Q me recomiendan???? C o ASM???

Para un proyecto pequeño el ASM, ya que es para un proyecto que vas hacer no tan pequeño, se recomienda C.

Con C, acabas antes los proyectos, en ASM tardas mucho tiempo y es más complejo.

Muchas gracias por la colaboracion

GR-LCD240x128Touch.jpg


16F877

Código:
List    p=16F877            ;Tipo de procesador    
                include "P16F877.inc"
                #define Fosc 20000000        ;Velocidad de trabajo

    __config _CP_OFF&_CPD_OFF&_WDT_OFF&_HS_OSC&_BODEN_OFF&_LVP_OFF

N_FILAS            equ        .128                ;Resolución vertical del LCD
N_COLUMNAS        equ        .240                ;Resolución horizontal del LCD
TEXT_HOME        equ        0x0000                ;Dirección de inicio de la RAM para visualizar texto
GRAPH_HOME        equ        0x0200                ;Dirección de inicio de la RAM para visualizar gráficos
TEXT_AREA        equ        N_COLUMNAS/8        ;Máxima área para visualizar texto
GRAPH_AREA        equ        N_COLUMNAS/8        ;Máxima área para visualizar gráficos

Contador        equ        0x20
Secuencia        equ        0x21                ;Contador de secuencias
Random_H        equ        0x22                ;
Random_L        equ        0x23                ;Variables para el nº aleatorio

                org        0x00
                goto    Reset                ;Vector de Reset
                org        0x05

;******************************************************************************************
;Según el valor contenido en el registro W, se devuelve el carácter a visualizar

Tabla_Mensajes    movwf    PCL        ;Calcula el desplazamiento sobre la tabla

;***********************************************************************************
;La directiva dt genera tantas intsrucciones retlw como bytes o caracteres contenga

Mens_0            equ    $                        ;Mens_0 apunta al primer carácter del mensaje 0
                dt    "Hello Word !",0x00
Mens_1            equ    $                        ;Mens_1 apunta al primer carácter del mensaje 1
                dt    "Microsystems",0x00
Mens_2            equ    $                        ;Mens_2 apunta al primer carácter del mensaje 2
                dt    "Engineering",0x00
Mens_3            equ    $                        ;Mens_3 apunta al primer carácter del mensaje 3
                dt    "PIC16F.",0x00

                include "T6963C_PIC16F.INC"    ;Incluir rutinas básicas de manejo de LCD gráfico
                include    "MSE_Delay.inc"        ;Incluir rutinas de temporización

;******************************************************************************************
;Mensaje: Esta rutina visualiza en el LCD el mensaje cuyo inicio está  indicado en
;el acumulador. El fin de un mensaje se determina mediante el código 0x00 y se supone que se
;estableció la dirección inicial de la RAM de texto.

Mensaje            movwf   Temporal_1          ;Salva posición de la tabla
Mensaje_1          movf    Temporal_1,W        ;Recupera posición de la tabla
                   call    Tabla_Mensajes      ;Busca caracter de salida
                   movwf   DATABUFA              ;Guarda el caracter
                   movf    DATABUFA,F
                   btfss   STATUS,Z            ;Mira si es el último
                   goto    No_es_ultimo
                   return
No_es_ultimo       movlw    0x20
                subwf    DATABUFA,F            ;Ajusta carácter ASCII al juego de caracteres del T6963C
                movlw    0xc0
                movwf    COMMANDBUF
                call    SEND_1DATA_CMD        ;Escribe el carácter sobre el LCD
                incf    Temporal_1,F        ;Siguiente caracter
                goto    Mensaje_1

;********************************************************************************************************
;Random - Esta rutina genera un nº aleatorio de 16 bits que se deposita en Random_H y Random_L. Estas
;variables se pueden cargar un un nº inicial o "semilla" o bien se dejan con el valor alatorio tras el
;power-up.

Random            clrf    Temporal_1
                clrf    Temporal_2
                btfsc    Random_L,3
                bsf        Temporal_1,0
                btfsc    Random_H,6
                bsf        Temporal_1,1
                btfsc    Random_H,4
                bsf        Temporal_2,0
                btfsc    Random_H,7
                bsf        Temporal_2,1
                movf    Temporal_2,W
                xorwf    Temporal_1,F        ;Función XOR entre los bits 3-12 y 14-15 (a=3^12 y b= 14^15)
                clrf    Temporal_2
                btfsc    Temporal_1,1
                bsf        Temporal_2,0
                movf    Temporal_2,W
                xorwf    Temporal_1,F        ;Función XOR entre a y b (c=a^b)    
                bcf        STATUS,C
                btfsc    Temporal_1,0
                bsf        STATUS,C            ;El resultado de la XOR pasa al Carry
                rlf        Random_L,F
                rlf        Random_H,F            ;Rotación a la izda. del Nº aleatorio.
                return

;***************************** INICIO DEL PROGRAMA PRINCIPAL *************************************

Reset            bsf        STATUS,RP0            ;Selecciona el banco 1
                btfsc    PCON,NOT_POR        ;Ha sido Power UP ??
                goto    No_power_up            ;No
                bsf        PCON,NOT_POR        ;Si, desactiva flag de Power UP
                bcf        STATUS,RP0            ;Selecciona el banco 0
                movlw    b'00000001'
                movwf    Secuencia            ;Inicia contador de secuencias
                goto    Inicio

No_power_up        bcf        STATUS,RP0            ;Selecciona el banco 0
                bcf        STATUS,C
                rlf        Secuencia,F            ;Ajusta el contador de tareas
                btfss    Secuencia,3            ;Se han hecho todas ??
                goto    Inicio                ;No
                movlw    b'00000001'
                movwf    Secuencia            ;Si, ajusta contador de tareas
                
Inicio            Delay    60 Milis            ;Temporiza 60mS para el Power-Up del LCD
                bsf        STATUS,RP0            ;Selecciona banco 1
                movlw    0x06
                movwf    ADCON1                ;Puerta A digital
                bcf        STATUS,RP0            ;Selecciona banco 0
                call    LCD_CONFIG            ;Configura puertos de E/S para interface con el LCD
                
;*************************************** BUCLE PRINCIPAL ***************************************

                btfsc    Secuencia,0            ;hay que hacer la secuencia 0 ??
                goto    Sec_0_0                ;Si
                btfsc    Secuencia,1            ;Hay que hacer la secuencia 1 ??
                goto    Sec_1                ;Si
                goto    Sec_2                ;No, hacer la secuencia 2

;**************************** Secuencia 0: Presentación de MSE *********************************
        
Sec_0_0            call    LCD_GRAPH_INI        ;Inicia la pantalla en modo gráfico y borra pantalla
                call    LCD_TEXT_INI        ;Inicia la pantalla en modo texto y borra la pantalla 

                MOVLW   TEXT_ON_GRAPH_ON
                movwf   COMMANDBUF
                CALL    SEND_CMD            ; Display gráfico ON, texto en ON
        
                movlw   XOR_MODE
                   movwf   COMMANDBUF
                  call    SEND_CMD            ;Función XOR entre el modo texto y el modo gráfico
        
;********************************************************************************************************
;Dibuja una barra gráfica horizontal de 13 pixels de grosor a partir de la fila 6ª y de un extremo al otro
                                                     
                movlw    high (GRAPH_HOME+(GRAPH_AREA*(6-1))) 
                movwf    DATABUFA
                movlw    low (GRAPH_HOME+(GRAPH_AREA*(6-1)))    
                movwf    DATABUFB            ;Calcula la dirección inicial en función de la fila deseadea
                movlw    SET_ADDR_PTR
                movwf    COMMANDBUF
                call    SEND_2DATA_CMD        ;Ajusta dirección de inicio en RAM gráfica para la barra horizontal

                movlw    high (GRAPH_AREA*13)+1    
                movwf    H_byte                    
                movlw    low    (GRAPH_AREA*13)
                movwf    L_byte                ;Nº de bytes a escribir en modo gráfico
Sec_0_1            movlw    0xff                ;Byte a escribir (0xFF=11111111). Se escriben 8 pixels
                movwf    DATABUFA            ;horizontales por cada byte
                movlw    0xc0
                movwf    COMMANDBUF            ;Comando de escritura
                call    SEND_1DATA_CMD
                decfsz    L_byte,F            ;Repetir la escritura 
                goto    Sec_0_1
                decfsz    H_byte,F            ;Fin ??
                goto    Sec_0_1                ;No
                            
;********************************************************************************************
;Imprime el mensaje de texto "Hello Word !" en la fila 2ª, 2ª columna

                movlw    .2                    
                movwf    Y                    
                movlw    .2                    
                movwf    X                    
                call    SET_TEXT_XY            ;Calcula la dirección de la fila 2ª, 2ª columna
                movlw    Mens_0
                call    Mensaje                ;Visualiza el mensaje

;*********************************************************************************************
;Inicia una intermitencia del texto mediante la conexión/desconexión de la RAM de texto
            
                movlw    .5
                movwf    Contador            ;Se realizan 5 intermitencias
Sec_0_2            movlw    TEXT_OFF_GRAPH_ON    
                movwf    COMMANDBUF
                call    SEND_1DATA_CMD        ;Desconecta la RAM de texto
                Delay    500 Milis            ;Temporiza 0,5 seg.
                movlw    TEXT_ON_GRAPH_ON    
                movwf    COMMANDBUF
                call    SEND_1DATA_CMD        ;Conecta la RAM de texto
                Delay    500    Milis            ;Temporiza 0,5 seg.
                decfsz    Contador,F            ;Repite la intermitencia
                goto    Sec_0_2

;********************************************************************************************
;Imprime el mensaje de texto "Microsystems" en la fila 7ª , columna 0

                movlw    .7                    
                movwf    Y                    
                movlw    0                    
                movwf    X                
                call    SET_TEXT_XY            ;Calcula la dirección de la fila 7ª, columna 0
                movlw    Mens_1
                call    Mensaje                ;Visualiza el mensaje

;********************************************************************************************
;Imprime el mensaje de texto "Engineering" en la fila 8ª, 5ª columna

                movlw    .8                    
                movwf    Y                    
                movlw    .5                    
                movwf    X                                
                call    SET_TEXT_XY            
                movlw    Mens_2
                call    Mensaje                ;Visualiza el mensaje

;*********************************************************************************************
;Dibuja una línea gráfica horizontal de 1 pixel de grosor a partir de la 47ª fila y de un 
;extremo al otro
                                                     
                movlw    high (GRAPH_HOME+(GRAPH_AREA*(47-1)))
                movwf    DATABUFA
                movlw    low (GRAPH_HOME+(GRAPH_AREA*(47-1)))
                movwf    DATABUFB            ;Calcula la dirección inicial en función de la fila deseadea
                movlw    SET_ADDR_PTR
                movwf    COMMANDBUF
                call    SEND_2DATA_CMD        ;Ajusta dirección de inicio en RAM gráfica para la barra horizontal

                movlw    (N_COLUMNAS/8)*1
                movwf    Temporal_1            ;Nº de bytes a escribir en modo gráfico
Sec_0_3            movlw    0xff                ;Byte a escribir (0xFF=11111111). Se escriben 8 pixels
                movwf    DATABUFA            ;horizontales por cada byte
                movlw    0xc0
                movwf    COMMANDBUF            ;Comando de escritura
                call    SEND_1DATA_CMD
                decfsz    Temporal_1,F        ;Repetir la escritura 
                goto    Sec_0_3

;*********************************************************************************************
;Dibuja una línea gráfica horizontal de 1 pixel de grosor a partir de la 66ª fila y de un 
;extremo al otro
                                                     
                movlw    high (GRAPH_HOME+(GRAPH_AREA*(66-1)))
                movwf    DATABUFA
                movlw    low (GRAPH_HOME+(GRAPH_AREA*(66-1)))
                movwf    DATABUFB            ;Calcula la dirección inicial en función de la fila deseadea
                movlw    SET_ADDR_PTR
                movwf    COMMANDBUF
                call    SEND_2DATA_CMD        ;Ajusta dirección de inicio en RAM gráfica para la barra horizontal

                movlw    (N_COLUMNAS/8)*1
                movwf    Temporal_1            ;Nº de bytes a escribir en modo gráfico
Sec_0_4            movlw    0xff                ;Byte a escribir (0xFF=11111111). Se escriben 8 pixels
                movwf    DATABUFA            ;horizontales por cada byte
                movlw    0xc0
                movwf    COMMANDBUF            ;Comando de escritura
                call    SEND_1DATA_CMD
                decfsz    Temporal_1,F        ;Repetir la escritura 
                goto    Sec_0_4
            
                Delay    200 Milis            ;Temporiza 0,2 seg.

;********************************************************************************************
;Imprime el mensaje de texto "PIC16F." en la fila 16ª, 9ª columna

                movlw    .16                    ;high (TEXT_HOME+(TEXT_AREA*(16-1))+9)
                movwf    Y                    ;DATABUFA
                movlw    .9                    ;low    (TEXT_HOME+(TEXT_AREA*(16-1))+9)
                movwf    X                    ;DATABUFB            
                call    SET_TEXT_XY            ;Calcula la dirección de la fila 16ª, 9ª columna
                movlw    Mens_3
                call    Mensaje                ;Visualiza el mensaje            

;*********************************************************************************************
;Dibuja 10 líneas gráficas horizontales de 1 pixel de grosor a partir de la columna 72 hasta 
;el final y a partir de la fila 118
                                                     
                movlw    high (GRAPH_HOME+(GRAPH_AREA*(119-1))+(72/8))
                movwf    H_byte
                movlw    low (GRAPH_HOME+(GRAPH_AREA*(119-1))+(72/8))
                movwf    L_byte                ;Calcula la dirección inicial en función de la fila deseadea

                movlw    .10
                movwf    Contador            ;Nº de líneas o filas a dibujar

Sec_0_5            movf    H_byte,W
                movwf    DATABUFA
                movf    L_byte,W
                movwf    DATABUFB
                movlw    SET_ADDR_PTR
                movwf    COMMANDBUF
                call    SEND_2DATA_CMD        ;Ajusta dirección de inicio en RAM gráfica para la 1ª línea  horizontal

                movlw    (N_COLUMNAS-.72)/8    
                movwf    Temporal_1            ;Nº de bytes a escribir en modo gráfico
Sec_0_6            movlw    0xff                ;Byte a escribir (0xFF=11111111). Se escriben 8 pixels
                movwf    DATABUFA            ;horizontales por cada byte
                movlw    0xc0
                movwf    COMMANDBUF            ;Comando de escritura
                call    SEND_1DATA_CMD
                decfsz    Temporal_1,F        ;Repetir la escritura 
                goto    Sec_0_6

                movlw    GRAPH_AREA
                addwf    L_byte,F
                btfsc    STATUS,C
                incf    H_byte,F            ;Calcular la dirección de la siguiente fila
                decfsz    Contador,F            ;Se han dibujado todas las líneas ??
                goto    Sec_0_5                ;No, hacer la siguiente
                
                Delay    2000 Milis
                Delay    2000 Milis            ;Si, temporizar 4 segundos

;*********************************************************************************************
;Inicia una intermitencia del texto y gráfico mediante la conexión/desconexión de la RAM de 
;textos y gráficos
            
                movlw    .5
                movwf    Contador            ;Se realizan 5 intermitencias
Sec_0_7            movlw    DISPLAY_OFF    
                movwf    COMMANDBUF
                call    SEND_1DATA_CMD        ;Desconecta la RAM de texto y gráficos (DISPLAY_OFF)
                Delay    500 Milis            ;Temporiza 0,5 seg.
                movlw    TEXT_ON_GRAPH_ON    
                movwf    COMMANDBUF
                call    SEND_1DATA_CMD        ;Conecta la RAM de texto y gráficos
                Delay    500    Milis            ;Temporiza 0,5 seg.
                decfsz    Contador,F            ;Repite la intermitencia
                goto    Sec_0_7

                Delay    1000 Milis            ;Temporiza 1 seg.

                goto    Sec_0_0                ;Repetir el bucle

;**************************** Secuencia 1: Puntos aleatorios *********************************

Sec_1            call    LCD_GRAPH_INI        ;Inicia la pantalla en modo gráfico, y borra pantalla
                MOVLW   TEXT_OFF_GRAPH_ON
                movwf   COMMANDBUF
                CALL    SEND_CMD            ; Display gráfico ON, texto en OFF

                bsf        CTRL_BITS,3            ;El pixel se pinta en negro            
Sec_1_0            call    Random                ;Obtiene un nº aleatorio de 16 bits
                movlw    ~N_COLUMNAS
                subwf    Random_H,W
                movwf    X                    ;La parte alta del nº determina la coordenada X
                movlw    ~N_FILAS
                subwf    Random_L,W
                movwf    Y                    ;La parte baja del nº determina la coordenada Y
                call    PIXEL                ;Dibuja el pixel
                
                Delay    2 Milis                ;Temporiza 2 miliseg.
            
                goto    Sec_1_0                ;Repetición indefinida

;**************************** Secuencia 2: Líneas aleatorias *********************************

Sec_2            call    LCD_GRAPH_INI        ;Inicia la pantalla en modo gráfico, y borra pantalla
                MOVLW   TEXT_OFF_GRAPH_ON
                movwf   COMMANDBUF
                CALL    SEND_CMD            ;Display gráfico ON, texto en OFF
                bsf        CTRL_BITS,3            ;Los pixels se pintarán en negro
            
;Dibuja una línea horizantal
Sec_2_0            call    Random                ;Busca nº aleatorio
                movlw    ~N_COLUMNAS
                subwf    Random_H,W
                movwf    X_org                ;La parte alta del nº determina la coordenada X de origen
                movlw    ~N_FILAS
                subwf    Random_L,W
                movwf    Y_org                ;La parte baja del nº determina la coordenada Y de origen
                call    Random                ;Busca otro nº aleatroio
                movlw    ~N_COLUMNAS
                subwf    Random_H,W
                movwf    X_des                ;La parte alta del nº determina la coordenada X de destino
                call    LINEA_H                ;Dibuja línea horizontal

;Dibuja una línea vertical            
                call    Random                ;Busca nº aleatorio
                movlw    ~N_COLUMNAS
                subwf    Random_H,W
                movwf    X_org                ;La parte alta del nº determina la coordenada X de origen
                movlw    ~N_FILAS
                subwf    Random_L,W
                movwf    Y_org                ;La parte baja del nº determina la coordenada Y de origen
                call    Random                ;Busca otro nº aleatroio
                movlw    ~N_FILAS
                subwf    Random_H,W
                movwf    X_des                ;La parte alta del nº determina la coordenada Y de destino
                call    LINEA_V                ;Dibuja línea vertical
    
                Delay    200 Milis            ;Temporiza 0.2 seg.

                goto    Sec_2_0
18F4550
Código:
;Programa de demostración y empleo de una pantalla LCD con las rutinas incluidas en "T6963C_PIC18F.INC"
;Esta demo aglutina los tres ejemplos anteriores. Con el power Up se ejecuta la presentación (Ejemplo 1).
;Con cada pulsación del Reset se ejecuta secuencialmente el programa de puntos aleatorios (Ejemplo 2), 
;el programa de líneas aleatorias (Ejemplo 3) y vuelta al programa de presentación.

                List    p=18F4550            ;Tipo de procesador    
                include "P18F4550.inc"
                #define Fosc 48000000        ;Velocidad de trabajo

;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

;********** Configuración para trabajar con PLL a 96MHz a partir del oscilador externo de 4MHz ***********
    CONFIG    FOSC=ECPLLIO_EC        ;Oscilador externo, RA6=E/S,PLL ON (CONFIG1H)
    CONFIG    PLLDIV = 1            ;Prescaler del PLL=1 --> 4MHz (CONFIG1L)
    CONFIG    CPUDIV=OSC1_PLL2    ;Postcaler del PLL=2, Frec. CPU=96MHz/2=48MHz (CONGIG1L)
                                ;Ciclo de instrucción = 83nS (1/(48000000/4))

;****************************************** Otras configuraciones ****************************************    
    CONFIG    PWRT=ON,BOR=OFF        ;(CONFIG2L)
    CONFIG    WDT=OFF                ;(CONFIG2H)
    CONFIG    PBADEN=OFF            ;RB<4:0> E/S digitales (CONFIG3H) trás el RESET
    CONFIG    LVP=OFF                ;(CONFIG4L)

N_FILAS            equ        .128                ;Resolución vertical del LCD
N_COLUMNAS        equ        .240                ;Resolución horizontal del LCD
TEXT_HOME        equ        0x0000                ;Dirección de inicio de la RAM para visualizar texto
GRAPH_HOME        equ        0x0200                ;Dirección de inicio de la RAM para visualizar gráficos
TEXT_AREA        equ        N_COLUMNAS/8        ;Máxima área para visualizar texto
GRAPH_AREA        equ        N_COLUMNAS/8        ;Máxima área para visualizar gráficos

Contador        equ        0x00
Secuencia        equ        0x01                ;Contador de secuencias
Random_H        equ        0x02                ;
Random_L        equ        0x03                ;Variables para el nº aleatorio

                org        0x0000
                bra        Reinicio            ;Vector de Reset
                org        0x0020                ;Salva área de vectores


;*******************************************************************************************
;Almacena en la memoria de programa todos los caracteres de las distinas cadenas o mensajes.

Mens_0            equ    $                        ;Mens_0 apunta al primer carácter del mensaje 0
                db    "Hello Word !",0x00
Mens_1            equ    $                        ;Mens_1 apunta al primer carácter del mensaje 1
                db    "Microsystems",0x00
Mens_2            equ    $                        ;Mens_2 apunta al primer carácter del mensaje 2
                db    "Engineering",0x00
Mens_3            equ    $                        ;Mens_3 apunta al primer carácter del mensaje 3
                db    "PIC18F.",0x00

                include "T6963C_PIC18F.INC"    ;Incluir rutinas básicas de manejo de LCD gráfico
                include    "MSE_Delay.inc"        ;Incluir rutinas de temporización

;******************************************************************************************
;Mensaje: Esta rutina visualiza en el LCD el mensaje cuyo inicio está  indicado en
;el W. El fin de un mensaje se determina mediante el código 0x00 y se supone que se
;estableció la dirección inicial de la RAM de texto.

Mensaje            movwf    TBLPTRL
                clrf    TBLPTRH
                clrf    TBLPTRU            ;Inicia puntero TBLPTR con inicio de la tabla
Mensaje_1        tblrd*+                    ;Lee un byte de la tabla
                movf    TABLAT,W
                btfsc    STATUS,Z        ;Es el último ??
                return                    ;Si
                movlw    0x20
                subwf    TABLAT,W        ;Ajusta carácter ASCII al juego de caracteres del T6963C
                movwf    DATABUFA
                movlw    0xc0
                movwf    COMMANDBUF
                call    SEND_1DATA_CMD    ;Escribe el carácter sobre el LCD
                bra        Mensaje_1        ;Siguiente carácter

;********************************************************************************************************
;Random - Esta rutina genera un nº aleatorio de 16 bits que se deposita en Random_H y Random_L. Estas
;variables se pueden cargar un un nº inicial o "semilla" (p.e. 0x3045) o bien se dejan con el valor 
;alatorio tras el power-up.

Random            rlcf    Random_H,W
                xorwf    Random_H,W
                rlcf    WREG,F                ;El bit Carry = función xor entre los bits 14 y 15

                swapf    Random_H,F
                swapf    Random_L,W
                rlncf    WREG,F
                xorwf    Random_H,W            ;El bit de menos peso = función xor entre los bits 12 y 3
                swapf    Random_H,F
                andlw    0x01
                rlcf    Random_L,F
                xorwf    Random_L,F
                rlcf    Random_H,F
                return

;***************************** INICIO DEL PROGRAMA PRINCIPAL *************************************

Reinicio        btfsc    RCON,NOT_POR        ;Ha sido Power UP ??
                goto    No_power_up            ;No
                bsf        RCON,NOT_POR        ;Si, desactiva flag de Power UP
                movlw    b'00000001'
                movwf    Secuencia            ;Inicia contador de secuencias
                goto    Inicio

No_power_up        bcf        STATUS,C
                rlcf    Secuencia,F            ;Ajusta el contador de tareas
                btfss    Secuencia,3            ;Se han hecho todas ??
                goto    Inicio                ;No
                movlw    b'00000001'
                movwf    Secuencia            ;Si, ajusta contador de tareas
                
Inicio            Delay    60 Milis            ;Temporiza 60mS para el Power-Up del LCD
                movlw    b'00001111'
                movwf    ADCON1                ;Puerta A digital
                movlw    b'00000111'    
                movwf    CMCON                ;Comparadores OFF

                call    LCD_CONFIG            ;Configura puertos de E/S para interface con el LCD
                
;*************************************** BUCLE PRINCIPAL ***************************************

                btfsc    Secuencia,0            ;hay que hacer la secuencia 0 ??
                bra        Sec_0_0                ;Si
                btfsc    Secuencia,1            ;Hay que hacer la secuencia 1 ??
                bra        Sec_1                ;Si
                bra        Sec_2                ;No, hacer la secuencia 2

;**************************** Secuencia 0: Presentación de MSE *********************************
        
Sec_0_0            call    LCD_GRAPH_INI        ;Inicia la pantalla en modo gráfico y borra pantalla
                call    LCD_TEXT_INI        ;Inicia la pantalla en modo texto y borra la pantalla 

                movlw   TEXT_ON_GRAPH_ON
                movwf   COMMANDBUF
                call    SEND_CMD            ; Display gráfico ON, texto en ON
        
                movlw   XOR_MODE
                   movwf   COMMANDBUF
                  call    SEND_CMD            ;Función XOR entre el modo texto y el modo gráfico
        
;********************************************************************************************************
;Dibuja una barra gráfica horizontal de 13 pixels de grosor a partir de la fila 6ª y de un extremo al otro
                                                     
                movlw    high (GRAPH_HOME+(GRAPH_AREA*(6-1))) 
                movwf    DATABUFA
                movlw    low (GRAPH_HOME+(GRAPH_AREA*(6-1)))    
                movwf    DATABUFB            ;Calcula la dirección inicial en función de la fila deseadea
                movlw    SET_ADDR_PTR
                movwf    COMMANDBUF
                call    SEND_2DATA_CMD        ;Ajusta dirección de inicio en RAM gráfica para la barra horizontal

                movlw    high (GRAPH_AREA*13)+1    
                movwf    H_byte                    
                movlw    low    (GRAPH_AREA*13)
                movwf    L_byte                ;Nº de bytes a escribir en modo gráfico
Sec_0_1            movlw    0xff                ;Byte a escribir (0xFF=11111111). Se escriben 8 pixels
                movwf    DATABUFA            ;horizontales por cada byte
                movlw    0xc0
                movwf    COMMANDBUF            ;Comando de escritura
                call    SEND_1DATA_CMD
                decfsz    L_byte,F            ;Repetir la escritura 
                bra        Sec_0_1
                decfsz    H_byte,F            ;Fin ??
                bra        Sec_0_1                ;No
                            
;********************************************************************************************
;Imprime el mensaje de texto "Hello Word !" en la fila 2ª, 2ª columna

                movlw    .2                    
                movwf    Y                    
                movlw    .2                    
                movwf    X                    
                call    SET_TEXT_XY            ;Calcula la dirección de la fila 2ª, 2ª columna
                movlw    Mens_0
                call    Mensaje                ;Visualiza el mensaje

;*********************************************************************************************
;Inicia una intermitencia del texto mediante la conexión/desconexión de la RAM de texto
            
                movlw    .5
                movwf    Contador            ;Se realizan 5 intermitencias
Sec_0_2            movlw    TEXT_OFF_GRAPH_ON    
                movwf    COMMANDBUF
                call    SEND_1DATA_CMD        ;Desconecta la RAM de texto
                Delay    500 Milis            ;Temporiza 0,5 seg.
                movlw    TEXT_ON_GRAPH_ON    
                movwf    COMMANDBUF
                call    SEND_1DATA_CMD        ;Conecta la RAM de texto
                Delay    500    Milis            ;Temporiza 0,5 seg.
                decfsz    Contador,F            ;Repite la intermitencia
                bra        Sec_0_2

;********************************************************************************************
;Imprime el mensaje de texto "Microsystems" en la fila 7ª , columna 0

                movlw    .7                    
                movwf    Y                    
                movlw    0                    
                movwf    X                
                call    SET_TEXT_XY            ;Calcula la dirección de la fila 7ª, columna 0
                movlw    Mens_1
                call    Mensaje                ;Visualiza el mensaje

;********************************************************************************************
;Imprime el mensaje de texto "Engineering" en la fila 8ª, 5ª columna

                movlw    .8                    
                movwf    Y                    
                movlw    .5                    
                movwf    X                                
                call    SET_TEXT_XY
                movlw    Mens_2
                call    Mensaje                ;Visualiza el mensaje

;*********************************************************************************************
;Dibuja una línea gráfica horizontal de 1 pixel de grosor a partir de la 47ª fila y de un 
;extremo al otro
                                                     
                movlw    high (GRAPH_HOME+(GRAPH_AREA*(47-1)))
                movwf    DATABUFA
                movlw    low (GRAPH_HOME+(GRAPH_AREA*(47-1)))
                movwf    DATABUFB            ;Calcula la dirección inicial en función de la fila deseadea
                movlw    SET_ADDR_PTR
                movwf    COMMANDBUF
                call    SEND_2DATA_CMD        ;Ajusta dirección de inicio en RAM gráfica para la barra horizontal

                movlw    (N_COLUMNAS/8)*1
                movwf    Temporal_1            ;Nº de bytes a escribir en modo gráfico
Sec_0_3            movlw    0xff                ;Byte a escribir (0xFF=11111111). Se escriben 8 pixels
                movwf    DATABUFA            ;horizontales por cada byte
                movlw    0xc0
                movwf    COMMANDBUF            ;Comando de escritura
                call    SEND_1DATA_CMD
                decfsz    Temporal_1,F        ;Repetir la escritura 
                bra        Sec_0_3

;*********************************************************************************************
;Dibuja una línea gráfica horizontal de 1 pixel de grosor a partir de la 66ª fila y de un 
;extremo al otro
                                                     
                movlw    high (GRAPH_HOME+(GRAPH_AREA*(66-1)))
                movwf    DATABUFA
                movlw    low (GRAPH_HOME+(GRAPH_AREA*(66-1)))
                movwf    DATABUFB            ;Calcula la dirección inicial en función de la fila deseadea
                movlw    SET_ADDR_PTR
                movwf    COMMANDBUF
                call    SEND_2DATA_CMD        ;Ajusta dirección de inicio en RAM gráfica para la barra horizontal

                movlw    (N_COLUMNAS/8)*1
                movwf    Temporal_1            ;Nº de bytes a escribir en modo gráfico
Sec_0_4            movlw    0xff                ;Byte a escribir (0xFF=11111111). Se escriben 8 pixels
                movwf    DATABUFA            ;horizontales por cada byte
                movlw    0xc0
                movwf    COMMANDBUF            ;Comando de escritura
                call    SEND_1DATA_CMD
                decfsz    Temporal_1,F        ;Repetir la escritura 
                bra        Sec_0_4
            
                Delay    200 Milis            ;Temporiza 0,2 seg.

;********************************************************************************************
;Imprime el mensaje de texto "PIC18F." en la fila 16ª, 9ª columna

                movlw    .16                    ;high (TEXT_HOME+(TEXT_AREA*(16-1))+9)
                movwf    Y                    ;DATABUFA
                movlw    .9                    ;low    (TEXT_HOME+(TEXT_AREA*(16-1))+9)
                movwf    X                    ;DATABUFB            
                call    SET_TEXT_XY            ;Calcula la dirección de la fila 16ª, 9ª columna
                movlw    Mens_3
                call    Mensaje                ;Visualiza el mensaje            

;*********************************************************************************************
;Dibuja 10 líneas gráficas horizontales de 1 pixel de grosor a partir de la columna 72 hasta 
;el final y a partir de la fila 118
                                                     
                movlw    high (GRAPH_HOME+(GRAPH_AREA*(119-1))+(72/8))
                movwf    H_byte
                movlw    low (GRAPH_HOME+(GRAPH_AREA*(119-1))+(72/8))
                movwf    L_byte                ;Calcula la dirección inicial en función de la fila deseadea

                movlw    .10
                movwf    Contador            ;Nº de líneas o filas a dibujar

Sec_0_5            movff    H_byte,DATABUFA
                movff    L_byte,DATABUFB
                movlw    SET_ADDR_PTR
                movwf    COMMANDBUF
                call    SEND_2DATA_CMD        ;Ajusta dirección de inicio en RAM gráfica para la 1ª línea  horizontal

                movlw    (N_COLUMNAS-.72)/8    
                movwf    Temporal_1            ;Nº de bytes a escribir en modo gráfico
Sec_0_6            movlw    0xff                ;Byte a escribir (0xFF=11111111). Se escriben 8 pixels
                movwf    DATABUFA            ;horizontales por cada byte
                movlw    0xc0
                movwf    COMMANDBUF            ;Comando de escritura
                call    SEND_1DATA_CMD
                decfsz    Temporal_1,F        ;Repetir la escritura 
                bra        Sec_0_6

                movlw    GRAPH_AREA
                addwf    L_byte,F
                btfsc    STATUS,C
                incf    H_byte,F            ;Calcular la dirección de la siguiente fila
                decfsz    Contador,F            ;Se han dibujado todas las líneas ??
                bra        Sec_0_5                ;No, hacer la siguiente
                
                Delay    2000 Milis
                Delay    2000 Milis            ;Si, temporizar 4 segundos

;*********************************************************************************************
;Inicia una intermitencia del texto y gráfico mediante la conexión/desconexión de la RAM de 
;textos y gráficos
            
                movlw    .5
                movwf    Contador            ;Se realizan 5 intermitencias
Sec_0_7            movlw    DISPLAY_OFF    
                movwf    COMMANDBUF
                call    SEND_1DATA_CMD        ;Desconecta la RAM de texto y gráficos (DISPLAY_OFF)
                Delay    500 Milis            ;Temporiza 0,5 seg.
                movlw    TEXT_ON_GRAPH_ON    
                movwf    COMMANDBUF
                call    SEND_1DATA_CMD        ;Conecta la RAM de texto y gráficos
                Delay    500    Milis            ;Temporiza 0,5 seg.
                decfsz    Contador,F            ;Repite la intermitencia
                bra        Sec_0_7

                Delay    1000 Milis            ;Temporiza 1 seg.

                bra        Sec_0_0                ;Repetir el bucle

;**************************** Secuencia 1: Puntos aleatorios *********************************

Sec_1            call    LCD_GRAPH_INI        ;Inicia la pantalla en modo gráfico, y borra pantalla
                MOVLW   TEXT_OFF_GRAPH_ON
                movwf   COMMANDBUF
                call    SEND_CMD            ; Display gráfico ON, texto en OFF

                bsf        CTRL_BITS,3            ;El pixel se pinta en negro            
Sec_1_0            call    Random                ;Obtiene un nº aleatorio de 16 bits
                movlw    ~N_COLUMNAS
                subwf    Random_H,W
                movwf    X                    ;La parte alta del nº determina la coordenada X
                movlw    ~N_FILAS
                subwf    Random_L,W
                movwf    Y                    ;La parte baja del nº determina la coordenada Y
                call    PIXEL                ;Dibuja el pixel
                
                Delay    2 Milis                ;Temporiza 2 miliseg.
            
                bra        Sec_1_0                ;Repetición indefinida

;**************************** Secuencia 2: Líneas aleatorias *********************************

Sec_2            call    LCD_GRAPH_INI        ;Inicia la pantalla en modo gráfico, y borra pantalla
                MOVLW   TEXT_OFF_GRAPH_ON
                movwf   COMMANDBUF
                CALL    SEND_CMD            ;Display gráfico ON, texto en OFF
                bsf        CTRL_BITS,3            ;Los pixels se pintarán en negro
            
;Dibuja una línea horizantal
Sec_2_0            call    Random                ;Busca nº aleatorio
                movlw    ~N_COLUMNAS
                subwf    Random_H,W
                movwf    X_org                ;La parte alta del nº determina la coordenada X de origen
                movlw    ~N_FILAS
                subwf    Random_L,W
                movwf    Y_org                ;La parte baja del nº determina la coordenada Y de origen
                call    Random                ;Busca otro nº aleatroio
                movlw    ~N_COLUMNAS
                subwf    Random_H,W
                movwf    X_des                ;La parte alta del nº determina la coordenada X de destino
                call    LINEA_H                ;Dibuja línea horizontal

;Dibuja una línea vertical            
                call    Random                ;Busca nº aleatorio
                movlw    ~N_COLUMNAS
                subwf    Random_H,W
                movwf    X_org                ;La parte alta del nº determina la coordenada X de origen
                movlw    ~N_FILAS
                subwf    Random_L,W
                movwf    Y_org                ;La parte baja del nº determina la coordenada Y de origen
                call    Random                ;Busca otro nº aleatroio
                movlw    ~N_FILAS
                subwf    Random_H,W
                movwf    X_des                ;La parte alta del nº determina la coordenada Y de destino
                call    LINEA_V                ;Dibuja línea vertical
    
                Delay    200 Milis            ;Temporiza 0.2 seg.

                bra        Sec_2_0


                end
16F877/877A ya no se fabrica, ahora el sustituto es el 16F887. Tenlo encuenta, ya que se empezará usar proyectos para este PIC.

Mi consejo es usar C para 18F4550, más rápido en acabar antes y con menos de posibilidad de cometer errores frente a ensamblador.

ASM es para proyectos pequeños. Donde aprendes asm muy bien es con este libro:

20kv20.gif


Ver proyectos del lirbo aquí:

http://www.pic16f84a.org/index.php?option=com_content&view=article&id=66&Itemid=87

Proyectos muy buenos sin problemas de memoria, velocidad y con muchos dispositivos a la vez, es mejor un PIC32 y en C. www.mypic32.com

Saludo.
 
Última edición:
Excelente... muchas gracias por la yuda companeros (y):aplauso::aplauso:
Ahora realizare todo en C, espero que de memoria de programa alcance...............
revizare las rutinas de la pantalla q tanto he estado buscando... gracias
Tambien estoy en otro foro entendiendo una rutinas en CCS
Muchas gracias
Si existen mas aportes .. bienvenidos sean
Gracias:apreton:
 
ASM es mas eficiente, pero C te permite terminar tu proyecto mas rápidamente y mantener un código fácilmente legible (para, por ejemplo, modificar el programa o corregir errores).
Saludos.
 
Hoy por hoy, si uno es un programador más o menos eficiente en C, y usa un compilador presentable, difícilmente las rutinas del ensamblado después de compilar con las optimizaciones saldrán más lentas o grandes que programando directamente en ensamblador.

Uno tiene que ser muy buen programador en ensamblador (o muy mal programador en C) para obtener mejores resultados que los compiladores actuales de la mayoría de micros. Por supuesto, también depende del compilador, pero mi experiencia con los varios compiladores de PSoC, AVR y ARM es esta. Lo de que el código generado en C sale más grande y lento es un mito o leyenda urbana, al menos por lo que yo he visto.
 
Dentro del C, también puedes insertar código ASM, se hace cuando el PIC es nuevo y no puede desde C llegar a ciertos registros. También te vale, por si quieres aumentar rendimiento en algunas partes del código.
 
Hoy por hoy, si uno es un programador más o menos eficiente en C, y usa un compilador presentable, difícilmente las rutinas del ensamblado después de compilar con las optimizaciones saldrán más lentas o grandes que programando directamente en ensamblador.

Uno tiene que ser muy buen programador en ensamblador (o muy mal programador en C) para obtener mejores resultados que los compiladores actuales de la mayoría de micros. Por supuesto, también depende del compilador, pero mi experiencia con los varios compiladores de PSoC, AVR y ARM es esta. Lo de que el código generado en C sale más grande y lento es un mito o leyenda urbana, al menos por lo que yo he visto.

Siempre ehe escuchado q hace lento al micro.
Pero que tal es el ccs:confused:
 
Hummm.. gracias.. quizas me pueden colaborar aqui!!!
es posible con C crear un registro virtual. Me explico
4 bits alto del puerto B y 4 bajos de A como un registro TRIS_X y PORT_X
Lo digo por que encontr rutinas de teclado q utlizan todo el puerto B y tengo el puerto B0-B3 utilizado por el I2C.
Es posible hacer esto CCS y como?

Muchas Gracias compa;eros
 
Última edición:
Como programar en C no se, lo que suelo hacer es crear librerias asi y las depuro, despues hacer un programa largo no es muy dificil, eso si, si nunca hiciste librerias se que te va allevar tiempo.

Cambiando de tema, alguien sabe como se programan los PIC18F en el MPLAB?
 
sin dudas el C facilita mas las cosas, en cuanto a que ocupe o no mas espacio no tiene nada que ver si esta en C o ASM uno deberia poder compactar y simplificar el codigo es asi de simple jajaja
 
En ASM el código es mas largo pero se aprovecha mejor la memoria. Sin embargo los PIC18 están optimizados para programarse en C. Microchip tiene su propio compilador MPLAB C18 que aunque no es gratis si te permite probarlo durante 60 días. Además también tienen un compilador gratuito para uso académico, que incluye todas las librerías del compilador comercial.

Para un PIC18 yo no me lo pensaría y utilizaría directamente C.
 
Tengo entendido que C18 cuando se te acaba los 60 días sigue siendo gratuito pero el problema que viene de atrás es que no optimiza el .HEX y gastas mucho memoria de programa y sbre todo RAM más de la cuenta. ¿Es cierto?

Tengo el 18F2550 y 18F4550 por ahí y los que no usan Proteus.

¿Intentamos hacer un pequeño ejemplo de encender y apagar LED? Por ejemplo, que si en el PORTA encendemos b'00001101' en su salida PORTB tenemos el mismo resultado. Puedes elegir los puertos que desees para hacer la prueba.

He visto gente programando en aSM con os 18F. La única diferencia es que el mismo resultado lo condige en muchos líneas de códigos.


Código:
;************************************** Ensam_03.asm ************************************
;
; Por el Puerto B se obtiene el dato de las cinco líneas del Puerto A al que está conectado
; un array de interruptores. Por ejemplo, si por el Puerto A se introduce "---11001", por
; el Puerto B aparecerá "xxx11001" (el valor de las tres líneas superiores no importa).
;
; ZONA DE DATOS **********************************************************************

    __CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC    ; Configuración para el
                                                            ; grabador.
    LIST    P=16F84A            ; Procesador.
    INCLUDE <P16F84A.INC>        ; Definición de los operandos utilizados.

; ZONA DE CÓDIGOS ********************************************************************

    ORG     0                    ; El programa comienza en la dirección 0 de memoria de
Inicio                            ; programa.
    bsf        STATUS,RP0            ; Pone a 1 el bit 5 del STATUS. Acceso al Banco 1.
    clrf    TRISB                ; Las líneas del Puerto B se configuran como salidas.
    movlw    b'11111111'
    movwf    TRISA                ; Las líneas del Puerto A se configuran como entradas.
    bcf        STATUS,RP0            ; Pone a 0 el bit 5 de STATUS. Acceso al Banco 0.
Principal
    movf     PORTA,W                ; Lee el Puerto A.
    movwf    PORTB                ; El contenido de W se visualiza por el Puerto B.
    goto     Principal            ; Crea un bucle cerrado.

    END                            ; Fin del programa.

Vamos a ver si somos capaces de pasar el 16F84A a los 18Fx550.
 
Aca lo hice (o almenos eso creo) lo que no pude hacer es poner los fuses de configuracion. en este momento no tengo ningun 18F para probarlo.

Código:
; Primer programa en 18F
; Se trata de un programa 
;que copia el puerto A y 
;lo escribe en puerto B
;---
; Microcontrolador : PIC18F2550
; Oscilador : HS 20MHz
;--	by SEBITRONIC  --

	LIST 	P=18F2550
	#INCLUDE	"P18F2550.INC"

INICIO	CLRF		TRISB		; PUETO B COMO SALIDAS
		MOVLW	H'FF'	
		MOVWF	ADCON1		; TODAS LAS ENTRADAS DE PORTA COMO DIGITALES

;BUCLE PRINCIPAL
LOOP		MOVF		PORTA,W		;CARGA AL ACUMULADOR EL VALOR DE PORTA
		MOVWF	PORTB		;CARGA A PORTB EL VALOR DEL ACUMULADOR 
		GOTO		LOOP

END
 
No creo que te funciona tan a la ligera. Los Fuses son imprensindibles.

sinttulo1utu.gif


Ahora hay que averiguar como sea como configurarlos y tener claro cuánto MHz vamos a usar en el cristal ¿48 MHz?

Código:
;==========================================================================
;==========================================================================
;
;       Configuration Bits
;
;   NAME            Address
;   CONFIG1L        300000h
;   CONFIG1H        300001h
;   CONFIG2L        300002h
;   CONFIG2H        300003h
;   CONFIG3H        300005h
;   CONFIG4L        300006h
;   CONFIG5L        300008h
;   CONFIG5H        300009h
;   CONFIG6L        30000Ah
;   CONFIG6H        30000Bh
;   CONFIG7L        30000Ch
;   CONFIG7H        30000Dh
;
;==========================================================================

; The following is an assignment of address values for all of the
; configuration registers for the purpose of table reads
_CONFIG1L        EQU  H'300000'
_CONFIG1H        EQU  H'300001'
_CONFIG2L        EQU  H'300002'
_CONFIG2H        EQU  H'300003'
_CONFIG3H        EQU  H'300005'
_CONFIG4L        EQU  H'300006'
_CONFIG5L        EQU  H'300008'
_CONFIG5H        EQU  H'300009'
_CONFIG6L        EQU  H'30000A'
_CONFIG6H        EQU  H'30000B'
_CONFIG7L        EQU  H'30000C'
_CONFIG7H        EQU  H'30000D'

;----- CONFIG1L Options --------------------------------------------------
_PLLDIV_1_1L         EQU  H'F8'    ; No prescale (4 MHz oscillator input drives PLL directly)
_PLLDIV_2_1L         EQU  H'F9'    ; Divide by 2 (8 MHz oscillator input)
_PLLDIV_3_1L         EQU  H'FA'    ; Divide by 3 (12 MHz oscillator input)
_PLLDIV_4_1L         EQU  H'FB'    ; Divide by 4 (16 MHz oscillator input)
_PLLDIV_5_1L         EQU  H'FC'    ; Divide by 5 (20 MHz oscillator input)
_PLLDIV_6_1L         EQU  H'FD'    ; Divide by 6 (24 MHz oscillator input)
_PLLDIV_10_1L        EQU  H'FE'    ; Divide by 10 (40 MHz oscillator input)
_PLLDIV_12_1L        EQU  H'FF'    ; Divide by 12 (48 MHz oscillator input)

_CPUDIV_OSC1_PLL2_1L EQU  H'E7'    ; [OSC1/OSC2 Src: /1][96 MHz PLL Src: /2]
_CPUDIV_OSC2_PLL3_1L EQU  H'EF'    ; [OSC1/OSC2 Src: /2][96 MHz PLL Src: /3]
_CPUDIV_OSC3_PLL4_1L EQU  H'F7'    ; [OSC1/OSC2 Src: /3][96 MHz PLL Src: /4]
_CPUDIV_OSC4_PLL6_1L EQU  H'FF'    ; [OSC1/OSC2 Src: /4][96 MHz PLL Src: /6]

_USBDIV_1_1L         EQU  H'DF'    ; USB clock source comes directly from the primary oscillator block with no postscale
_USBDIV_2_1L         EQU  H'FF'    ; USB clock source comes from the 96 MHz PLL divided by 2

;----- CONFIG1H Options --------------------------------------------------
_FOSC_XT_XT_1H       EQU  H'F0'    ; XT oscillator, XT used by USB
_FOSC_XTPLL_XT_1H    EQU  H'F2'    ; XT oscillator, PLL enabled, XT used by USB
_FOSC_ECIO_EC_1H     EQU  H'F4'    ; External clock, port function on RA6, EC used by USB
_FOSC_EC_EC_1H       EQU  H'F5'    ; External clock, CLKOUT on RA6, EC used by USB
_FOSC_ECPLLIO_EC_1H  EQU  H'F6'    ; External clock, PLL enabled, port function on RA6, EC used by USB
_FOSC_ECPLL_EC_1H    EQU  H'F7'    ; External clock, PLL enabled, CLKOUT on RA6, EC used by USB
_FOSC_INTOSCIO_EC_1H EQU  H'F8'    ; Internal oscillator, port function on RA6, EC used by USB
_FOSC_INTOSC_EC_1H   EQU  H'F9'    ; Internal oscillator, CLKOUT on RA6, EC used by USB
_FOSC_INTOSC_XT_1H   EQU  H'FA'    ; Internal oscillator, XT used by USB
_FOSC_INTOSC_HS_1H   EQU  H'FB'    ; Internal oscillator, HS used by USB
_FOSC_HS_1H          EQU  H'FC'    ; HS oscillator, HS used by USB
_FOSC_HSPLL_HS_1H    EQU  H'FE'    ; HS oscillator, PLL enabled, HS used by USB

_FCMEN_OFF_1H        EQU  H'BF'    ; Fail-Safe Clock Monitor disabled
_FCMEN_ON_1H         EQU  H'FF'    ; Fail-Safe Clock Monitor enabled

_IESO_OFF_1H         EQU  H'7F'    ; Oscillator Switchover mode disabled
_IESO_ON_1H          EQU  H'FF'    ; Oscillator Switchover mode enabled

;----- CONFIG2L Options --------------------------------------------------
_PWRT_ON_2L          EQU  H'FE'    ; PWRT enabled
_PWRT_OFF_2L         EQU  H'FF'    ; PWRT disabled

_BOR_OFF_2L          EQU  H'F9'    ; Brown-out Reset disabled in hardware and software
_BOR_SOFT_2L         EQU  H'FB'    ; Brown-out Reset enabled and controlled by software (SBOREN is enabled)
_BOR_ON_ACTIVE_2L    EQU  H'FD'    ; Brown-out Reset enabled in hardware only and disabled in Sleep mode (SBOREN is disabled)
_BOR_ON_2L           EQU  H'FF'    ; Brown-out Reset enabled in hardware only (SBOREN is disabled)

_BORV_0_2L           EQU  H'E7'    ; Maximum setting
_BORV_1_2L           EQU  H'EF'    ; 
_BORV_2_2L           EQU  H'F7'    ; 
_BORV_3_2L           EQU  H'FF'    ; Minimum setting

_VREGEN_OFF_2L       EQU  H'DF'    ; USB voltage regulator disabled
_VREGEN_ON_2L        EQU  H'FF'    ; USB voltage regulator enabled

;----- CONFIG2H Options --------------------------------------------------
_WDT_OFF_2H          EQU  H'FE'    ; HW Disabled - SW Controlled
_WDT_ON_2H           EQU  H'FF'    ; HW Enabled - SW Disabled

_WDTPS_1_2H          EQU  H'E1'    ; 1:1
_WDTPS_2_2H          EQU  H'E3'    ; 1:2
_WDTPS_4_2H          EQU  H'E5'    ; 1:4
_WDTPS_8_2H          EQU  H'E7'    ; 1:8
_WDTPS_16_2H         EQU  H'E9'    ; 1:16
_WDTPS_32_2H         EQU  H'EB'    ; 1:32
_WDTPS_64_2H         EQU  H'ED'    ; 1:64
_WDTPS_128_2H        EQU  H'EF'    ; 1:128
_WDTPS_256_2H        EQU  H'F1'    ; 1:256
_WDTPS_512_2H        EQU  H'F3'    ; 1:512
_WDTPS_1024_2H       EQU  H'F5'    ; 1:1024
_WDTPS_2048_2H       EQU  H'F7'    ; 1:2048
_WDTPS_4096_2H       EQU  H'F9'    ; 1:4096
_WDTPS_8192_2H       EQU  H'FB'    ; 1:8192
_WDTPS_16384_2H      EQU  H'FD'    ; 1:16384
_WDTPS_32768_2H      EQU  H'FF'    ; 1:32768

;----- CONFIG3H Options --------------------------------------------------
_MCLRE_OFF_3H        EQU  H'7F'    ; RE3 input pin enabled; MCLR disabled
_MCLRE_ON_3H         EQU  H'FF'    ; MCLR pin enabled; RE3 input pin disabled

_LPT1OSC_OFF_3H      EQU  H'FB'    ; Timer1 configured for higher power operation
_LPT1OSC_ON_3H       EQU  H'FF'    ; Timer1 configured for low-power operation

_PBADEN_OFF_3H       EQU  H'FD'    ; PORTB<4:0> pins are configured as digital I/O on Reset
_PBADEN_ON_3H        EQU  H'FF'    ; PORTB<4:0> pins are configured as analog input channels on Reset

_CCP2MX_OFF_3H       EQU  H'FE'    ; CCP2 input/output is multiplexed with RB3
_CCP2MX_ON_3H        EQU  H'FF'    ; CCP2 input/output is multiplexed with RC1

;----- CONFIG4L Options --------------------------------------------------
_STVREN_OFF_4L       EQU  H'FE'    ; Stack full/underflow will not cause Reset
_STVREN_ON_4L        EQU  H'FF'    ; Stack full/underflow will cause Reset

_LVP_OFF_4L          EQU  H'FB'    ; Single-Supply ICSP disabled
_LVP_ON_4L           EQU  H'FF'    ; Single-Supply ICSP enabled

_XINST_OFF_4L        EQU  H'BF'    ; Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
_XINST_ON_4L         EQU  H'FF'    ; Instruction set extension and Indexed Addressing mode enabled

_DEBUG_ON_4L         EQU  H'7F'    ; Background debugger enabled, RB6 and RB7 are dedicated to In-Circuit Debug
_DEBUG_OFF_4L        EQU  H'FF'    ; Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins

;----- CONFIG5L Options --------------------------------------------------
_CP0_ON_5L           EQU  H'FE'    ; Block 0 (000800-001FFFh) code-protected
_CP0_OFF_5L          EQU  H'FF'    ; Block 0 (000800-001FFFh) not code-protected

_CP1_ON_5L           EQU  H'FD'    ; Block 1 (002000-003FFFh) code-protected
_CP1_OFF_5L          EQU  H'FF'    ; Block 1 (002000-003FFFh) not code-protected

_CP2_ON_5L           EQU  H'FB'    ; Block 2 (004000-005FFFh) code-protected
_CP2_OFF_5L          EQU  H'FF'    ; Block 2 (004000-005FFFh) not code-protected

_CP3_ON_5L           EQU  H'F7'    ; Block 3 (006000-007FFFh) code-protected
_CP3_OFF_5L          EQU  H'FF'    ; Block 3 (006000-007FFFh) not code-protected

;----- CONFIG5H Options --------------------------------------------------
_CPB_ON_5H           EQU  H'BF'    ; Boot block (000000-0007FFh) code-protected
_CPB_OFF_5H          EQU  H'FF'    ; Boot block (000000-0007FFh) not code-protected

_CPD_ON_5H           EQU  H'7F'    ; Data EEPROM code-protected
_CPD_OFF_5H          EQU  H'FF'    ; Data EEPROM not code-protected

;----- CONFIG6L Options --------------------------------------------------
_WRT0_ON_6L          EQU  H'FE'    ; Block 0 (000800-001FFFh) write-protected
_WRT0_OFF_6L         EQU  H'FF'    ; Block 0 (000800-001FFFh) not write-protected

_WRT1_ON_6L          EQU  H'FD'    ; Block 1 (002000-003FFFh) write-protected
_WRT1_OFF_6L         EQU  H'FF'    ; Block 1 (002000-003FFFh) not write-protected

_WRT2_ON_6L          EQU  H'FB'    ; Block 2 (004000-005FFFh) write-protected
_WRT2_OFF_6L         EQU  H'FF'    ; Block 2 (004000-005FFFh) not write-protected

_WRT3_ON_6L          EQU  H'F7'    ; Block 3 (006000-007FFFh) write-protected
_WRT3_OFF_6L         EQU  H'FF'    ; Block 3 (006000-007FFFh) not write-protected

;----- CONFIG6H Options --------------------------------------------------
_WRTB_ON_6H          EQU  H'BF'    ; Boot block (000000-0007FFh) write-protected
_WRTB_OFF_6H         EQU  H'FF'    ; Boot block (000000-0007FFh) not write-protected

_WRTC_ON_6H          EQU  H'DF'    ; Configuration registers (300000-3000FFh) write-protected
_WRTC_OFF_6H         EQU  H'FF'    ; Configuration registers (300000-3000FFh) not write-protected

_WRTD_ON_6H          EQU  H'7F'    ; Data EEPROM write-protected
_WRTD_OFF_6H         EQU  H'FF'    ; Data EEPROM not write-protected

;----- CONFIG7L Options --------------------------------------------------
_EBTR0_ON_7L         EQU  H'FE'    ; Block 0 (000800-001FFFh) protected from table reads executed in other blocks
_EBTR0_OFF_7L        EQU  H'FF'    ; Block 0 (000800-001FFFh) not protected from table reads executed in other blocks

_EBTR1_ON_7L         EQU  H'FD'    ; Block 1 (002000-003FFFh) protected from table reads executed in other blocks
_EBTR1_OFF_7L        EQU  H'FF'    ; Block 1 (002000-003FFFh) not protected from table reads executed in other blocks

_EBTR2_ON_7L         EQU  H'FB'    ; Block 2 (004000-005FFFh) protected from table reads executed in other blocks
_EBTR2_OFF_7L        EQU  H'FF'    ; Block 2 (004000-005FFFh) not protected from table reads executed in other blocks

_EBTR3_ON_7L         EQU  H'F7'    ; Block 3 (006000-007FFFh) protected from table reads executed in other blocks
_EBTR3_OFF_7L        EQU  H'FF'    ; Block 3 (006000-007FFFh) not protected from table reads executed in other blocks

;----- CONFIG7H Options --------------------------------------------------
_EBTRB_ON_7H         EQU  H'BF'    ; Boot block (000000-0007FFh) protected from table reads executed in other blocks
_EBTRB_OFF_7H        EQU  H'FF'    ; Boot block (000000-0007FFh) not protected from table reads executed in other blocks


_DEVID1          EQU  H'3FFFFE'
_DEVID2          EQU  H'3FFFFF'

_IDLOC0          EQU  H'200000'
_IDLOC1          EQU  H'200001'
_IDLOC2          EQU  H'200002'
_IDLOC3          EQU  H'200003'
_IDLOC4          EQU  H'200004'
_IDLOC5          EQU  H'200005'
_IDLOC6          EQU  H'200006'
_IDLOC7          EQU  H'200007'
 
Atrás
Arriba