# Error al compilar con PIC C de CCS



## Clematida (Abr 17, 2010)

Hola,

Estoy iniciandome en la programación de pics en ccs, para ello me han proporcionado el software y hardware necesario.

En principio iba a utilizar el mplab y luego para compilar el programa el pic c compiler, tenia solo el plug in para mplab del pic c compiler pero me han recomendado instalarme el pic c compiler completo. Tengo un programa de ejemplo que simplemente tendría que copiar, compilarlo y que funcionase, pero me da un error al compilarlo.

Hasta ahora lo que he hecho con pics ha sido en lenguaje ensamblador y con el pic 16f84, ahora estoy usando ccs y el pic 18F67J50 en una placa entrenadora: http://www.microingenia.com/electronics/product.php?id_product=3

Este es el programa de ejemplo:


```
[I]#include "config18F67J50Trainer.c"          <-------- ESTO LO PONGO MÁS ABAJO Y 
                                                             <-------   AQUI ES DONDE DA EL ERROR
                                                
#include "usb/usb_bootloader.h"
#include "usb/usb_cdc.h"

void main(void)
{
   PLLEN = 1;
   
   disable_interrupts(GLOBAL);
   disable_interrupts(INT_TIMER0);
   
   setup_timer_0(RTCC_DIV_128);
   set_timer0(18661);
   
   enable_interrupts(GLOBAL); 
   enable_interrupts(INT_TIMER0);
   
   while(TRUE);
}

#int_timer0
void isr_timer0(void)
{
   // Toggle each PIN every second   
   set_timer0(18661);
   
   output_toggle(PIN_A0);
   output_toggle(PIN_A1);
   output_toggle(PIN_A2);
   output_toggle(PIN_A3);
   output_toggle(PIN_A4);
   output_toggle(PIN_A5);
   output_toggle(PIN_B0);
   output_toggle(PIN_B1);
   output_toggle(PIN_B2);
   output_toggle(PIN_B3);
   output_toggle(PIN_B4);
   output_toggle(PIN_B5);
   output_toggle(PIN_B6);
   output_toggle(PIN_B7);
   //output_toggle(PIN_C0);
   output_toggle(PIN_C1);
   output_toggle(PIN_C2);
   output_toggle(PIN_C3);
   output_toggle(PIN_C4);
   output_toggle(PIN_C5);
   output_toggle(PIN_C6);
   output_toggle(PIN_C7);
   output_toggle(PIN_D0);
   output_toggle(PIN_D1);
   output_toggle(PIN_D2);
   output_toggle(PIN_D3);
   output_toggle(PIN_D4);
   output_toggle(PIN_D5);
   output_toggle(PIN_D6);
   output_toggle(PIN_D7);
   output_toggle(PIN_E0);
   output_toggle(PIN_E1);
   output_toggle(PIN_E2);
   output_toggle(PIN_E3);
   output_toggle(PIN_E4);
   output_toggle(PIN_E5);
   output_toggle(PIN_E6);
   output_toggle(PIN_E7);
   output_toggle(PIN_F2);
   output_toggle(PIN_F3);
   output_toggle(PIN_F4);
   output_toggle(PIN_F5);
   output_toggle(PIN_F6);
   output_toggle(PIN_F7);  
   output_toggle(PIN_G0);
   output_toggle(PIN_G1);
   output_toggle(PIN_G2);
   output_toggle(PIN_G3);
   output_toggle(PIN_G4);
}[/I]

Esto es config18F67J50Trainer.c


[I]#include <18F67J50.h>
#fuses HS_PLL,NOWDT,NOXINST,STVREN,NOPROTECT,FCMEN,PLL2,NOCPUDIV,MSSPMSK7,IESO,NODEBUG
#use delay(clock=48000000)

// Enable PLL
#bit PLLEN = 0xf9b.6
[/I]
```

El error dice unknown keyword in #fuses "HS_PLL"

El compilador no me pregunta el pic a utilizar, cosa que el mplab sí que hace y se supone que el mplab lleva incluida la librería 18F67J50.h (corríjanme si me equivoco) y no sé si el error es debido a que el compilador no tenga acceso a esa librería, no se me ocurre otra cosa, no sé tampoco si hay que decirle al pic c compiler con qué pic estamos trabajando o si no hace falta, y en caso de que haya que decirselo no sé desde que menu se hace.


----------



## ByAxel (Abr 17, 2010)

Dale un vistazo a esto:
https://www.forosdeelectronica.com/f24/programas-pic-c-compiler-tutorial-21770/



> #include <18F67J50.h>
> #fuses HS_PLL,NOWDT,NOXINST,STVREN,NOPROTECT,FCMEN,PLL2,NOCPUDIV,MSSPMSK7,IESO,NODEBUG
> #use delay(clock=48000000)
> 
> ...



Esto debe de ir en la cabecera del programa de lo contrario no sabrá con que PIC está trabajando.
El resto de #include o #define deben de ir debajo.


----------



## Clematida (Abr 17, 2010)

eso va incluido en el programa con #include "config18F67J50Trainer.c" y da ese error...


----------



## ByAxel (Abr 17, 2010)

Ya lo vi detenidamente y lo curioso es que al parecer el ejemplo esta desactualizado (veo que solo le han cambiado la fecha) por lo que el compilador tiene la razón al decir que #fuses "HS_PLL no existe.

La versión que tengo es 4.093 y el PIC en cuestión tiene estas características:


Como se lo veo no existe "HS_PLL" por lo que tendrás que configurar sus fuses de otra manera.

PD: Utiliza el PIC Wizard.


----------



## Clematida (Abr 17, 2010)

Vaya muchas gracias, no sé como configurarlos pero contactaré con los de la empresa para que lo cambien y lo pongan bien en su web tambien.

Carlos te iba mandar un MP pero el foro no me deja porque no tengo suficientes mensajes, asique te lo dejo aquí a ver si me puedse aclarar mis dudas.

Que me quisiste decir con lo de que usase el PIC Wizard? es que no manejo el programa pero cuando le doy a pic wizard para buscar un archivo en mi pc y busco el archivo .c que es lo que tengo no puedo, solo me deja buscar .pjt y no tengo ningún archivo .pjt.


----------



## Eduardo (Abr 17, 2010)

Carlos Alexis dijo:


> Ya lo vi detenidamente y lo curioso es que al parecer el ejemplo esta desactualizado (veo que solo le han cambiado la fecha) por lo que el compilador tiene la razón al decir que #fuses "HS_PLL no existe.
> 
> La versión que tengo es 4.093 y el PIC en cuestión tiene estas características:
> ..........................
> Como se lo veo no existe "HS_PLL" por lo que tendrás que configurar sus fuses de otra manera.


Es un bug de la versión 4.093

En el listado de la 4.104 figura "HS_PLL" y compila sin problemas.


----------



## ByAxel (Abr 17, 2010)

Eduardo dijo:


> Es un bug de la versión 4.093
> 
> En el listado de la 4.104 figura "HS_PLL" y compila sin problemas.



OK.. será momento para actualizarme 

El PIC Wizard es un ayudante para configurar el proyecto y solo es usado la primera vez, pero no es indispensable ya que todo se puede hacer manualmente...



Al usarlo, en la 1ra ventana que aparece te pregunta en donde vas a guardar el nuevo proyecto; luego ya aparece la ventana donde escoges el PIC, le haces todas sus configuraciones y a terminar aparece la hoja del proyecto con el código que ha sido generado por el PIC Wizard.


----------



## Clematida (Abr 17, 2010)

Vale muchas gracias Carlos, estaba intentando abrir un archivo en lugar de crear uno jaja normal que no me funcionase.

Gracias Eduardo, acabo de instalarme esa versión del programa y sí, ya compila perfecto!


----------



## mdg (Sep 24, 2010)

Hola queridos amigo de este lindo mundo de la electronica soy nuevo en esto y encontre un circuito de un temporizador ciclico (http://www.microcontroladorespic.co...res-pic/temporizador-ciclico/interruptor.html) quise modificar los tiempos pero cuando compilo me saltan errores y no entiendo mucho de esto me puse a leer sobre el tema pero se me quemaron los papeles alguien me podria ayudar a ver cual es el problema que tiene se los agradeceria muchisimooooooo....

Este es el codigo del programa.

; º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º 
; º            |  |  |  |  |  |  |  |  |  |  |  |                             º
; º           _|__|__|__|__|__|__|__|__|__|__|__|_        _\\|//_   Jose      º
; º          |                                    |      (| o-o |)  Martinez  º 
; º          |    www.microcontroladorespic.com   |       \ (_) /   Ortiz     º 
; º          |)                                   |        \_"_/              º
; º          |  TEMPORIZADOR CICLICO PROGRAMABLE  |       __|U|__             º
; º          |                                    |      /       \            º 
; º          |_ __ __ __ __ __ __ __ __ __ __ __ _|     / /|   |\ \           º 
; º            |  |  |  |  |  |  |  |  |  |  |  |      / / |   | \ \          º
; º            |  |  |  |  |  |  |  |  |  |  |  |      ""  |___|  ""          º 
; º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º 

;******************************   CONFIGURACION    ****************************
;CP_OFF              - Codigo de proteccion programa desactivado
;CPD_OFF             - Codigo de proteccion eeprom desactivado 
;WDT_OFF             - Perro guardian desconectado 
;BODEN_OFF           - No actua el reset por bajada de tension
;PWRTE_OFF           - Reset de inicio desconectado
;MCLRE_OFF           - Reset externo desconectado, sino pierdo una entrada A5
;XT_OSC              - oscilador exterior
;INTOSC_OSC_NOCLKOUT - funcionamiento con reloj interno
;LVP_OFF             - programacion de bajo voltage desconectado,
;                      para activar el pin 4 de RB

   __CONFIG _MCLRE_OFF & _CP_OFF & _WDT_ON & _INTRC_OSC_NOCLKOUT & _PWRTE_ON        

      LIST	   P=16F629       ;Procesador utilizado.
      INCLUDE   <P12F629.INC> 

;*****************************   MAPA DE MEMORIA   ****************************

  CBLOCK    0x20   ;Inicio de la memoria de datos
PDel0              ;utilizado para los retardos
PDel1              ;utilizado para los retardos
tiempN          ;utilizado para los retardos
tiempFF         ;utilizado para los retardos
   ENDC 

;******************************   ZONA DE DATOS    ****************************

 #define Led   GPIO,5         ;puerto utilizado pala la conexion del led
 #define Rele  GPIO,4         ;puerto utilizado pala la conexion del Rele
 #define Micros GPIO          ;Entradas para microinterruptores GP0,1,2,3

 #define   Banco0             bcf STATUS,RP0
 #define   Banco1             bsf STATUS,RP0   

;******************************************************************************
;**********************************  INICIO  **********************************
;******************************************************************************

reset	org 0x00            ;El programa comienza en la dirección 0.
        goto  inicio        ;pasa a la posicion de inicio para evitar la int.                                                    
        org 0x04            ;aqui se atienden las interupciones

inicio  Banco1 

        call	0x3ff       ;       CALIBRACION DEL 	        
    	movwf  	OSCCAL      ;      OSCILADOR INTERNO             

        movlw	b'001111'   ;0=salida, 1=entrada
        movwf	TRISIO      ;lo tranfiere al puerto 

 ; instrucciones para habilitar las resistencias internas
        movlw   b'00001111'  ;habilita pull-ups
        movwf   OPTION_REG
        movlw   b'00000111'  ;para GP0,GP1,GP2
        movwf   WPU

        Banco0 

 ;instrucciones para poder utilizar GP0 y GP1 como entradas
        movlw	b'00000111' 	;  desactiva el comparador 
        movwf	CMCON           ; selecciona GPIO en vez de comparador

      clrf GPIO          ;todas las salidas puestas a 0



;******************************************************************************
;*******************************  PRINCIPAL ***********************************
;******************************************************************************
principal

        movf Micros,W           ;lee el valor de las entradas  
        andlw b'00001111'       ;se queda con los 4 bit de menor peso
        addwf     PCL,F

tabla   goto      cero
        goto      uno
        goto      dos  
        goto      tres
        goto      cuatro
        goto      cinco
        goto      seis
        goto      siete
        goto      ocho
        goto      nueve
        goto      diez
        goto      once
        goto      doce
        goto      trece
        goto      catorce
        goto      quince

;******************************************************************************
;******************************  CONFIGURACION  *******************************
;******************************************************************************

cero      call    ON_10min        ;tiempo de encendido - 100%
          goto    principal       ;miro la posicion de los microinterruptores 

uno       call    ON_9min5        ;tiempo de encendido  - 95%
          call    OFF_0min5       ;tiempo de apagado 
          goto    principal       ;miro la posicion de los microinterruptores  

dos       call    ON_9min         ;tiempo de encendido  - 90%
          call    OFF_1min        ;tiempo de apagado 
          goto    principal       ;miro la posicion de los microinterruptores 

tres      call    ON_8min5        ;tiempo de encendido  - 85%
          call    OFF_1min5       ;tiempo de apagado 
          goto    principal       ;miro la posicion de los microinterruptores 

cuatro    call    ON_8min         ;tiempo de encendido  - 80%
          call    OFF_2min        ;tiempo de apagado 
          goto    principal       ;miro la posicion de los microinterruptores 

cinco     call    ON_7min5        ;tiempo de encendido  - 75%
          call    OFF_2min5       ;tiempo de apagado 
          goto    principal       ;miro la posicion de los microinterruptores 

seis      call    ON_7min         ;tiempo de encendido  - 70%
          call    OFF_3min        ;tiempo de apagado 
          goto    principal       ;miro la posicion de los microinterruptores 

siete     call    ON_6min5        ;tiempo de encendido  - 65%
          call    OFF_3min5       ;tiempo de apagado 
          goto    principal       ;miro la posicion de los microinterruptores 

ocho      call    ON_6min         ;tiempo de encendido  - 60%
          call    OFF_4min        ;tiempo de apagado 
          goto    principal       ;miro la posicion de los microinterruptores 

nueve     call    ON_5min5        ;tiempo de encendido  - 55%
          call    OFF_4min5       ;tiempo de apagado 
          goto    principal       ;miro la posicion de los microinterruptores 

diez      call    ON_5min         ;tiempo de encendido  - 50%
          call    OFF_5min        ;tiempo de apagado 
          goto    principal       ;miro la posicion de los microinterruptores 

once      call    ON_4min5        ;tiempo de encendido  - 45%
          call    OFF_5min5       ;tiempo de apagado 
          goto    principal       ;miro la posicion de los microinterruptores 

doce      call    ON_4min         ;tiempo de encendido  - 40%
          call    OFF_6min        ;tiempo de apagado 
          goto    principal       ;miro la posicion de los microinterruptores 

trece     call    ON_3min         ;tiempo de encendido  - 30%
          call    OFF_7min        ;tiempo de apagado 
          goto    principal       ;miro la posicion de los microinterruptores 

catorce   call    ON_2min         ;tiempo de encendido  - 20%
          call    OFF_8min        ;tiempo de apagado 
          goto    principal       ;miro la posicion de los microinterruptores  

quince    call    ON_1min         ;tiempo de encendido  - 10%
          call    OFF_9min        ;tiempo de apagado 
          goto    principal       ;miro la posicion de los microinterruptores 

;******************************************************************************
;***************************      TIEMPOS ON        ***************************
;******************************************************************************
ON_10min   call     ON_30s
ON_9min5   call     ON_30s
ON_9min    call     ON_30s
ON_8min5   call     ON_30s
ON_8min    call     ON_30s
ON_7min5   call     ON_30s
ON_7min    call     ON_30s
ON_6min5   call     ON_30s
ON_6min    call     ON_30s
ON_5min5   call     ON_30s
ON_5min    call     ON_30s
ON_4min5   call     ON_30s
ON_4min    call     ON_30s
ON_3min5   call     ON_30s
ON_3min    call     ON_30s
ON_2min5   call     ON_30s
ON_2min    call     ON_30s
ON_1min5   call     ON_30s
ON_1min    call     ON_30s
ON_0min5   call     ON_30s            
           return              ; vuelvo donde se hizo la llamada

;******************************************************************************
;***************************        ON_1min         ***************************
;******************************************************************************

ON_30s     bsf     Rele        ;conecta el rele
           movlw   .30        ;corresponde a 30, para hacer 30 segundos          
           movwf   tiempN  

s30_ON  call    ON_1seg        ; Va a esperar 1seg
        decfsz  tiempN,1    ; comienza a restar. cuando sea 0 salta 1 linea
        goto    s30_ON         ; sigue restando hasta que llege a 0

        return                 ; vuelvo donde se hizo la llamada

;******************************************************************************
;***************************        ON_1seg         ***************************
;******************************************************************************

ON_1seg     call    ON_1s       ;repite la rutina siguiente para hacer 1seg.
ON_1s       bsf     Led         ;enciende el led
            call    DEMORA      ;249msg 
            bsf     Led         ;enciende el led
            call    DEMORA      ;249msg

            return              ; vuelvo donde se hizo la llamada

;******************************************************************************
;***************************      TIEMPOS OFF       ***************************
;******************************************************************************
OFF_10min   call     OFF_30s
OFF_9min5   call     OFF_30s
OFF_9min    call     OFF_30s
OFF_8min5   call     OFF_30s
OFF_8min    call     OFF_30s
OFF_7min5   call     OFF_30s
OFF_7min    call     OFF_30s
OFF_6min5   call     OFF_30s
OFF_6min    call     OFF_30s
OFF_5min5   call     OFF_30s
OFF_5min    call     OFF_30s
OFF_4min5   call     OFF_30s
OFF_4min    call     OFF_30s
OFF_3min5   call     OFF_30s
OFF_3min    call     OFF_30s
OFF_2min5   call     OFF_30s
OFF_2min    call     OFF_30s
OFF_1min5   call     OFF_30s
OFF_1min    call     OFF_30s
OFF_0min5   call     OFF_30s 
            return              ; vuelvo donde se hizo la llamada

;******************************************************************************
;***************************        OFF_30seg       ***************************
;******************************************************************************
OFF_30s    bcf     Rele       ; desconecta el rele
           movlw   0x1e       ;corresponde a 30, para hacer 30 segundos          
           movwf   tiempFF  

s30_OFF   call    OFF_1seg        ; Va a esperar 1seg
          decfsz  tiempFF,1    ;comienza a restar cuando sea 0 salta 1 linea
          goto    s30_OFF         ; sigue restando hasta que llege a 0

          return                 ; vuelvo donde se hizo la llamada

;******************************************************************************
;***************************        OFF_1min        ***************************
;******************************************************************************
OFF_1mi    bcf     Rele           ; desconecta el rele
           movlw   .60            ;corresponde a 60, para hacer 1 minuto          
           movwf   tiempFF  

unFF   call    OFF_1seg        ; Va a esperar 1seg
          decfsz  tiempFF,1    ;comienza a restar cuando sea 0 salta 1 linea
          goto    unFF         ; sigue restando hasta que llege a 0

          return                 ; vuelvo donde se hizo la llamada

;******************************************************************************
;***************************        OFF_1seg        ***************************
;****************************************************************************** 

OFF_1seg   call    OFF_1s      ;repite la rutina siguiente para hacer 1seg.
OFF_1s     bsf     Led         ;enciende el led
           call    DEMORA      ;249msg 
           bcf     Led         ;apaga el led
           call    DEMORA      ;249msg

           return              ; vuelvo donde se hizo la llamada

;******************************************************************************
;*****************           RETARDO 250ms                 ********************
;******************************************************************************  
;-------------------------------------------------------------
; Generado con PDEL ver SP  
; Descripcion: Delay 249996 ciclos
;-------------------------------------------------------------
DEMORA  movlw     .195      ; 1 set numero de repeticion  (B)
        movwf     PDel0     ; 1 |
PLoop1  movlw     .213      ; 1 set numero de repeticion  (A)
        movwf     PDel1     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
PDelL1  goto PDelL2         ; 2 ciclos delay
PDelL2  
        decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
        clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.
;----------------------------------------------------------------------------
         org      0x3FF       ;          OSSCAL          --------------------
         retlw    0x20        ;    VALOR DE CALIBRACION  --------------------
;----------------------------------------------------------------------------
  END

Gracias por su ayuda ya de antemano.

Los errores me saltan en la siguiente parte

inicio  Banco1 

        call	0x3ff       ;       CALIBRACION DEL 	        
    	movwf  	OSCCAL      ;      OSCILADOR INTERNO             

        movlw	b'001111'   ;0=salida, 1=entrada
        movwf	TRISIO      ;lo tranfiere al puerto 

 ; instrucciones para habilitar las resistencias internas
        movlw   b'00001111'  ;habilita pull-ups
        movwf   OPTION_REG
        movlw   b'00000111'  ;para GP0,GP1,GP2
        movwf   WPU

        Banco0 


Espero su ayuda

Un saludo enorme a toda la comunidad


----------



## el-rey-julien (Sep 24, 2010)

es mas importante que publiques el archivo de errores que el compilador te deja,solo mirando ese archivo puedo llegar a saber cual es el error,de otra forma tendría que ponerme a compilarlo en mi pc para poder saber a ciencia cierta cual es el error,quizas solo sea algún problema de sintaxis ,alguna coma,alguna  letra etc,etc
saludos


----------



## mdg (Sep 26, 2010)

Hola el_rey_julien muchisimas gracias por responder ahora no se que le pico lo compilo me tiraba este error y ahora lo pasa de alto

Debug build of project `C:\seg\seg.mcp' started.
Preprocessor symbol `__DEBUG' is defined.
Sun Sep 26 04:35:18 2010
----------------------------------------------------------------------
Make: The target "C:\seg\ciclico.o" is out of date.
Executing: "C:\Archivos de programa\Microchip\MPASM Suite\MPASMWIN.exe" /q /p12F629 "ciclico.asm" /l"ciclico.lst" /e"ciclico.err" /d__DEBUG=1
Warning[215] C:\SEG\CICLICO.ASM 28 : Processor superseded by command line.  Verify processor symbol.
Message[302] C:\SEG\CICLICO.ASM 60 : Register in operand not in bank 0.  Ensure that bank bits are correct.
Message[302] C:\SEG\CICLICO.ASM 63 : Register in operand not in bank 0.  Ensure that bank bits are correct.
Message[302] C:\SEG\CICLICO.ASM 67 : Register in operand not in bank 0.  Ensure that bank bits are correct.
Message[302] C:\SEG\CICLICO.ASM 69 : Register in operand not in bank 0.  Ensure that bank bits are correct.
Loaded C:\seg\ciclico.cod.
----------------------------------------------------------------------
Debug build of project `C:\seg\seg.mcp' succeeded.
Preprocessor symbol `__DEBUG' is defined.
Sun Sep 26 04:35:20 2010
----------------------------------------------------------------------
BUILD SUCCEEDED




No entiendo mucho este tema del lenguaje vos no me podrias decir como lo hago para que me funcione cada 10 segundos los intervalos, es decir te explico el programa va contando el tiempo de 30 segundos en 30 segundos y yo quisiera obtener un tiempo en ON= 50 segundos y un tiempo en OFF= 180 minutos y en otra parte ademas que pueda tener ON= 30 segundos y OFF= 60 minutos... he intentado hacerlo pero no me sale jeje a lo mejor vos que lo entendes y andas en esa sintonia podrias decirme que tendria que cambiar y hacerlo pero necesito una ayuda de un guia que entienda je.

No se si lo dije pero el programa de este pic es de un circuito que maneja un temporizador ciclico es decir que repite la configuracion de tiempo en ON y OFF indefinidamente.

Muchas gracias compañero

Abrazo


----------



## el-rey-julien (Sep 26, 2010)

> BUILD SUCCEEDED


 si el resultado es ese es porque salio bien 


> Warning[215] C:\SEG\CICLICO.ASM 28 : Processor superseded by command line. Verify processor symbol.
> Message[302] C:\SEG\CICLICO.ASM 60 : Register in operand not in bank 0. Ensure that bank bits are correct.
> Message[302] C:\SEG\CICLICO.ASM 63 : Register in operand not in bank 0. Ensure that bank bits are correct.
> Message[302] C:\SEG\CICLICO.ASM 67 : Register in operand not in bank 0. Ensure that bank bits are correct.
> Message[302] C:\SEG\CICLICO.ASM 69 : Register in operand not in bank 0. Ensure that bank bits are correct.


esos no son errores son advertencias ,


> C:\SEG\CICLICO.ASM 28 : Processor superseded by command line. Verify processor symbol.


eso te indica que verifiques el compilador,porque estas compilando supón un  16f84 en ves de un 16f628
es configuración en el MPASMWIN,

pd:
ahora te paso una rutina para el programa del pic,eso de 60 minutos es tiempo  largo 
saludos


----------



## mdg (Sep 26, 2010)

Bueno gracias me voy a fijar eso de que capaz este configurando la compilacion con los pic distintos.

Vos decis que con esa rutina podre armar los dos tipos de tiempos ON 50 seg y OFF 60 min y el otro de ON 30 seg y OFF 60 min???

Gracias 

Saludos


----------



## mdg (Sep 27, 2010)

Hola compañeros si de ultima no puedo obtener esos tiempos con ese circuito me podrias decir como hago para hacer algun circuito en el cual pueda obtener esos tiempos digamos te comento mejor tengo un aparato que necesito dos automatizaciones por separadas para hacer andar por un lado un motor 50 segundos cada 3 horas repetitivamente y despues necesito hacer andar un ventilador 30 segundos cada 1 hora tambien que cada una hora se repita el ciclo desde ya agradezco al que me pueda ayudar.

Saludos


----------



## Ricar (Oct 13, 2010)

Hola, estoy empezando con los microcontroladores y me ha surgido un problema a ver si alguien me podría hechar una mano.  En  el ejemplo  T5_E1.c  del libro " COMPILADOR C CCS y simulador proteus para microcontroladores PIC "  cuando compilo me salen los siguientes errores :

Error 12 “ C:\Program Files\PICC\drivers\LCD.C”Line 128(5,9):Undefined identifier
Error 48 “ C:\Program Files\PICC\drivers\LCD.C”Line 128(17,23):Expecting a (
Error 48 “ C:\Program Files\PICC\drivers\LCD.C”Line 129(5,9):Expecting a (
Error 48 “ C:\Program Files\PICC\drivers\LCD.C”Line 129(18,25):Expecting a (
Error 48 “ C:\Program Files\PICC\drivers\LCD.C”Line 129(33,34):Expecting a (
Error 43 “ C:\Program Files\PICC\drivers\LCD.C”Line 129(34,38):Expecting a declaration 
6 Errors, 0 Warnings 

El programa lo he llegado a compilar y simular en ISIS, pero ahora no sé por qué me dá error. Con otros programas que también utilizan este LCD me pasa lo mismo. Y lo único que hago es copiar la carpeta del CD adjunto al disco E:  y desde allí abrirlo.  
He desinstalado el compilador PCWHD y lo he vuelto a instalar , pero me sigue ocurriendo lo mismo . 

El programa es el siguiente :

#include <16F876.h>
#device adc=10
#FUSES XT,NOWDT
#FUSES
#use delay(clock=4000000)
#include <LCD.C>

void main() {
   int16 q;
   float p;

   setup_adc_ports(AN0);                                        //Canal 0 analógico
   setup_adc(ADC_CLOCK_INTERNAL);                 //Fuente de reloj RC

   lcd_init();

   for (; {
      set_adc_channel(0);                          //Habilitación canal0
      delay_us(20);
      q = read_adc();                                 //Lectura canal0
      p = 5.0 * q / 1024.0;                        //Conversión a tensión 

      printf(lcd_putc, "\fADC = %4ld", q);
      printf(lcd_putc, "\nVoltage = %01.2fV", p);

      delay_ms(100);
      }
}


Gracias ...


----------



## Eduardo (Oct 13, 2010)

Ese código lo compilo sin problemas. 
Habrás editado por accidente el archivo LCD.C y le borraste/agregaste algo.


----------



## victormanuel12 (Oct 13, 2010)

Yo tambien pase un mal trago con ese ejemplito del libro, hasta que dandole vueltas descubri que era una tonteria. Si te fijas, la libreria lcd.c esta configurada para que la salida al lcd sea, por defecto, por el puerto d, y si miras el esquematico que te da el libro... sorpresa!! el pic16f876 solo tiene hasta el puerto c. Es decir, tienes que cambiar el archivo lcd.c para que la salida sea por el puerto b. Te copio y pego el codigo del archivo lcd.c desde la linea 38 hasta la 58, y si te funciona ya me invitaras a una cervecita en "El castillo", jejeje 

// Un-comment the following define to use port B
 #define use_portb_lcd TRUE


struct lcd_pin_map {                 // This structure is overlayed
           BOOLEAN enable;           // on to an I/O port to gain
           BOOLEAN rs;               // access to the LCD pins.
           BOOLEAN rw;               // The bits are allocated from
           BOOLEAN unused;           // low order up.  ENABLE will
           int     data : 4;         // be pin B0.
        } lcd;


#if defined use_portb_lcd
   #locate lcd = getenv("sfrORTB")    // This puts the entire structure over the port
   #ifdef __pch__
    #locate lcd = 0xf81
   #else
    #locate lcd = 6
   #endif
   #define set_tris_lcd(x) set_tris_b(x)


----------



## Ricar (Oct 16, 2010)

Muchas gracias..  la verdad es que puede ser que haya borrado algo sin querer... de todas formas voy a probar el código .. 
Gracias


----------



## sshoice esparza (Abr 24, 2012)

hola estoy iniciando en esto de programar pic's y estoy viendo tutoriales por youtube y todos los que e hecho me marcan error a la hora de compilar me puede decir alguien cual es el problema
gracias


----------



## Limako (Abr 24, 2012)

Bien, cuando comienzas un proyecto lo aces dandole a picwizard??
si es asi en la casilla de i/o pins ahi te pondra pin_a, pin_a2.... etc, y podrasponerle como entrada salida etc, pues en vede pin_a1 lo cambias por LED1, o si no en tu programa en vede poner LED1 pon pin_XX
donde la primera X es el puerto y la segunda X el numero de pin


----------



## sshoice esparza (Abr 29, 2012)

muchas gracias Limako te agradezco por tu aporte gracias 


tengo un problema con este código me podrás ayudar lo que pasa es que si funciona y todo
nada mas que no se para que sirve los siguen tes comandos:
#byte PORTB=0x06
#byte PORTc=0x07
e tratado de variar los valores para ver si así lo puedo entender pero pues nada :S
te dejo el código completo que es el siguiente:




#include <16f76.h>
#use delay (clock=4000000)
#fuses XT,NOWDT,NOPUT,NOPROTECT


#byte PORTB=0x06
#byte PORTc=0x07

int dato;

void main(void)


    {

      set_tris_b(0x00);
      set_tris_c(0xff);
      portb=0x00;

         while (true)
            {
              dato= portc;
              switch(dato)
                     {
              case 1: PORTB =0xff;
              break;

              case 2: portb=0b00001111;
              break;


              case 3: portb=0b00111100;
              break;

              default: portb=0x00;
              break;


                     }

            }

    }


gracias men


----------



## Orfiel (Jul 10, 2012)

Hola a todos.

Todos los proyectos que había realizado con PIC C PCW y que estaban funcionando de un momento a otro comenzaron a mostrar el error que se ve en la imagen. La verdad no se que pasa ya elimine el programa y lo volví a instalar y funciona normal pero al día siguiente vuelve y pasa lo mismo, probé creando un proyecto nuevo y tampoco funcionan. ¿no se que pasa ?


----------



## danyferchu (Jul 11, 2012)

es muy raro, a mi me pasa algo parecido, ojala alguien nos pueda dar una mano, si averiguo algo te aviso


----------



## Orfiel (Jul 14, 2012)

danyferchu dijo:


> es muy raro, a mi me pasa algo parecido, ojala alguien nos pueda dar una mano, si averiguo algo te aviso



Hola mira la verdad tampoco se que pasa pero encontré una solución. Digamos que creamos un proyecto y vamos a utilizar el PIC 16F877A y un modulo LCD, lo que tenemos que hacer para evitar que salga ese error es copiar en la carpeta del proyecto que creamos los archivos de cabecera 16F877A.h y el archivo LCD.C que se encuentran la carpeta donde se instalo el programa PCW. Ademas en el código hay que escribir los #include de esta manera 
#include <LM_35.h>
#include <LCD.c> 

Despues dar clik derecho sobre <LM_35.h> y seleccionar open file at cursor
se abrira otra pestaña en el editor de código. 
y para finalizar cambiar en el #include <16F877A.h>
por #include "16F877A.h"

Así fue que me funciono cualquier cosa si encuentre el motivo por el cual sale ese error te comento, espero que haya sido de tu ayuda.


----------



## arrivaellobo (Jul 14, 2012)

Probad ésta solución


----------



## danyferchu (Jul 15, 2012)

Orfiel dijo:


> Hola mira la verdad tampoco se que pasa pero encontré una solución. Digamos que creamos un proyecto y vamos a utilizar el PIC 16F877A y un modulo LCD, lo que tenemos que hacer para evitar que salga ese error es copiar en la carpeta del proyecto que creamos los archivos de cabecera 16F877A.h y el archivo LCD.C que se encuentran la carpeta donde se instalo el programa PCW. Ademas en el código hay que escribir los #include de esta manera
> #include <LM_35.h>
> #include <LCD.c>
> 
> ...



hola, gracias voy a probar de momento lo volvi a instalarl y no me volvio a suceder


----------



## zerofull (Ago 19, 2012)

HOLA soy nuevo, estoy  intentando programr el pic 16f628a : esto es lo que intento compilar:

#include <16f628a.h>
#use delay(clock=4m)
void man(){
while (1){
  output_high(pin_a1);output_high(pin_a2);
  delay_ms(500);
  output_low(pin_a1);output_low(pin_a2);
  delay_ms(500);
}
}


pero al querer compilarlo me sale una pestaña al costado y me sale este error que noce como solucionarlo:


#include <16F628A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES MCLR                     //Master Clear pin enabled
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES RESERVED                 //Used to set the reserved FUSE bits

#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)


al final donde salen los errores me dice que el error esta en la ultima linea;osea este es el error:

***Error 100"C:\User\nombredel equipo\desktop\leds\leds.h"Line 14(5,61):USE parameter value is out of range Not a number: PIN_C6

#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

les agradeceria que me apoyaran por favor ,el sofguare que uso es el PIC C COMPILER....  pero el problema es solo es con el 16f628A porque con el resto de pics no hay problemas compila con perfeccion

GRACIAS DE ANTE MANO...


----------



## electroconico (Ago 20, 2012)

Hola compa!

El error esta en que el pic16F628A no tiene puerto C y tu estas definiendo RX y TX en los pines C6 y C7.
Cambialos por algun pin que si tengas , como el puerto A o el B.

Si vas a usar el hardware del pic solo pon UART1 , si quieres usar la comunicacion por soft es como lo estas definiendo.

Saludos!

#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=8)


----------



## zerofull (Oct 3, 2012)

hummmmm ok amigo gracias por la ayuda ya la estba dejando de lado....... pero gracias por revivir mi aniamo a seguir con la programacion ,........


----------



## grev (Nov 27, 2012)

lo que sucede esque la compilacion o el programa debe de mandar ciertos pulsos cuando se opriman los push boton y los hace la compilacion no manda erorr y en el proteus funciona perfecto solo que cuando el pic esta programado no hace nada percido alo que deveria realiza les dejo la compilacion y ajala que se pueda encontrar una solucion 
al pricipio pense que el pic estaba dañado pero hace lo mismo y ya he programado 4 pic's diferentes y no hay cambio
 #include<16f628A.h>
#fuses xt,nowdt,nolvp
#use delay (clock=4000000)
#byte porta=5
#byte portb=6
 void main()
   {
   set_tris_a(0x00);
   set_tris_b(0xF0);
   while(1)
        {
         if (input (PIN_B0))
         output_high (pin_a0);

         if (input (PIN_B1))
         output_high (pin_b4);

         if (input (PIN_B2))
         porta=0x03;

        }


   }
esta es la compilacion


----------



## Vergil (Nov 28, 2012)

en el proteus funciona perfecto solo que cuando el pic esta programado no hace nada percido alo que deveria realiza


----------



## Vergil (Nov 28, 2012)

grev dijo:


> proteus funciona perfecto solo que cuando el pic esta programado no hace nada percido alo que deveria realiza



Y como funciona tu montaje??? que hace????, por lo que veo de tu codigo al oprimir el pulsador siempre queda en estado alto tus salidas, no las vuelves a dejar en low, tambien veo que no dejaste un tiempo que evite que al orpimir el pulsador se repita la misma instruccion miles de veces, recuerda que estas se ejecutan en us o ms. Espero haberte ayudado saludos........


----------



## fuzzer0110 (Nov 28, 2012)

Hola grev, como te ha dicho Vergil tu programa tiene algunas incosistencias.  Creo que estás declarando algunas cosas innecesarias,  a menos que las pienses usar más adelante.  Si lo que quieres es que se active una salida cuando pulses un botón conectado a un puerto y luego se apague, entonces te dejo un pequeño código de muestra para que te bases en él y puedas seguir con tu desarrollo.


```
#include <16F628A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(clock=4000000)

void main()
{

   while(TRUE)
   {
      if (input (PIN_B0))
         output_high (PIN_A0);
      else
         output_low (PIN_A0);

      if (input (PIN_B1))
         output_high (PIN_B4);
      else
         output_low (PIN_B4);
   }
}
```

También sería bueno que subieras tu diagrama de conexiones.

Saludos!


----------



## Psyke (Jun 11, 2015)

Hola, tengo un problema con respecto al CCS. Uso la versión 4.023 y cuando tengo dos códigos abiertos, y necesito compilar los dos, siempre me compila el primero que abrí. Cómo lo puedo solucionar? Gracias


----------



## D@rkbytes (Jun 11, 2015)

Mira si la información del siguiente vídeo te sirve:


----------



## Psyke (Jun 15, 2015)

D@rkbytes dijo:


> Mira si la información del siguiente vídeo te sirve:
> 
> https://youtu.be/TMifA3lCPrc​



Tenía fe de encontrar una solución definitiva. Pero de todos modos me sirve de mucho. Muy amable D@rk, muchas gracias!!


----------



## Berto75 (Jul 10, 2015)

Hola DOSMETROS me a pedido que os escriba y adjunte mi proyecto aqui.
No veo aqui mi pregunta principal, a si que os la dire de nuevo.

No se crear el archivo .HEX desde el codigo .C para que funcione en Proteus.

Y no creo que sea un Bug del compilador. Con otros proyectos siempre responde.


----------



## TRILO-BYTE (Jul 10, 2015)

no se si bajaste eso de internet pues si esta tan elaborado el codigo he de suponer que sabes programar
si no es asi lo bajaste de internet

se da en el boton de compilar y debe salir el .hex

si no es asi abre el proyecto compila cierra vuelve a abrir el proyecto y compila de nuevo y se corrije el problema ese fallo lo tiene CCS 0.85


----------



## D@rkbytes (Jul 10, 2015)

En el código del programa "2_DISPLAY.C" AlberertO dijo:
			
		

> // NO SE COMO CREAR EL .HEX EN CCS
> // NO SE COMO CREAR EL .HEX EN CCS
> // NO SE COMO CREAR EL .HEX EN CCS


Al abrir ese programa con PIC C Compiler y presionar la tecla "F9", ya se debe compilar sin problemas.
El archivo "2DISPLAY.H" Es un archivo de cabecera y no se debe compilar directamente.
Ese archivo incluye la configuración del PIC y puede contener otras partes que se pueden usar en el programa principal "2_DISPLAY.C"

Al incluir la configuración del PIC en el achivo "2_DISPLAY.C", ya no es necesario el archivo "2_DISPLAY.H"

El archivo "2_DISPLAY.C" contiene la siguiente información de configuración:

```
#include <16f877a.h>
#FUSES HS              // High speed Osc (> 4mhz for PCM/PCH) (>10mhz
                       // for PCD)
//#FUSES MCLR            // Master Clear pin enabled
#FUSES NOBROWNOUT      // No brownout reset
#FUSES NOLVP           // No low voltage prgming, B3(PIC16) or B5
                       // (PIC18)used for I/O
#FUSES NOCPD           // No EE protection
#FUSES NOPUT           // No Power Up Timer
#FUSES NOPROTECT       // Code not protected from reading
#FUSES NOWDT           // No Watch Dog Timer
#USE delay(clock=4m)
```
Y el archivo "2_DISPLAY.H" contiene lo siguiente:

```
#include <16F877A.h>
#device ADC=16

#FUSES NOWDT                     //No Watch Dog Timer
#FUSES NOBROWNOUT                //No brownout reset
#FUSES NOLVP                     //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(crystal=4MHz)
```
Este último archivo se crea al utilizar el "Project Wizard"

Entonces, o incluyes éste archivo *.H (Header) así como ya está incluido en el archivo principal y omites la palabra de configuración, o escribes la palabra de configuración en el programa principal y ya no incluyes el archivo *.H "2_DISPLAY.H"


----------



## Berto75 (Jul 15, 2015)

Hola. Hoy me e pasado toda la tarde con my jandica. E tenido que empezar desde el principio no lo tengo todo, pero my primer programa hace ya lo que queria. El problema es que no se porque los display parpadean cuando yo nunca les cierro la salida. Este es el codigo :

#include <16f877.h>

#fuses  XT,NOWDT,NOPROTECT,PUT,NOBROWNOUT,NOLVP  // TODAVIA NO QUIERO METERME EN ESTO 


#USE delay(clock=4m)

void main(){
//    Input_x (valor);   Esta directiva nos devuelve el valor en el que se encuentra el "Puerto x".
//    Output_x (valor);  envía lo que valga valor al Puerto correspondiente. 
int valor;
 int unit=0, dec=0; 
 int unidaz=0;
 int BCD7seg[10]={0b0000,0b0001,0b0010,0b0011,0b0100,
                   0b0101,0b0110,0b0111,0b1000,0b1001};  

   while(TRUE)
   {///wil

   valor=input_b();


if (valor<100){
//output_c(valor);     NO INPORTA Q ANULASE ESTO PORQUE output_c(BCD7seg[unidaz]);  Y  output_c(BCD7seg[dec]); AFECTAN AL PORTC
dec=0;   unidaz=0; valor++;// valor++ LO E PUESTO A CIEGAS (porque si valor era 15 solo contaba hasta 14)
for (unit=0;valor>unit;unit++){///for

   if (unidaz>=10){ dec++;  unidaz=0;}///0b1001  MAS DE 9. DECENAS
   output_high(PIN_d1);   
   output_c(BCD7seg[dec]); delay_ms(50);



  output_high(PIN_d0);    
  output_c(BCD7seg[unidaz]); delay_ms(20); 
  // AUNQUE YO NO UTILE output_low(PIN_d0); NI output_low(PIN_d1); NO ENTIENDO PORQUE EL PIN 0 y 1 PASAN A VALER 0
   unidaz++; 



}///for*/
}
else{
 output_high(PIN_d0);  output_high(PIN_d1);
output_c(0b0000); delay_ms(5); //¿ SI VALOR>99 COMO AGO PARA MANDAR EL HEXADECIMAL " FF "
}
}///wil

   }
//E TENIDO QUE UTILIZAR PIN 0 y 1 DE PORTD SON NECESARIOS PARA ENVIAR SEÑAL DE ENCENDIDO A LOS DISPLAYS
// SI YO COMO CONTADOR SOLO NECESITO HASTA EL 63 (binario 0011 111) ME GUSTARIA MUCHO TENER LIBRE PIN6 y PIN7 DE PORTD PARA LOS DISPLAYS Y ASI AORRAR PUERTOS QUE
// ME PUEDEN SERVIR PARA OTRA COSA
// PROBLEMA CUANDO APLICO  "  output_c(BCD7seg[unidaz]);  " Esto afecta tambien al pin 6 y 7 (aunque solo cuente hasta 63) me los pone a cero y no puedo utilizar
//a estos 2 para controlar el display ¿como podria hacer que "  output_c(BCD7seg[unidaz]);  " No afectase a los pin 6 y 7 (solo a los demas de 0 a 5)

POS Dejo archivos sobre este proyecto por si sirve para aclararme algo mas. Gracias a cualquier curioso que se moleste en mirarlo buscando fallos.


----------



## TRILO-BYTE (Jul 15, 2015)

tu problema son los delays
todo eso es tu problema


----------



## D@rkbytes (Jul 15, 2015)

AlberertO dijo:


> Dejo archivos sobre este proyecto por si sirve para aclararme algo más.
> Gracias a cualquier curioso que se moleste en mirarlo buscando fallos.


Mira este sencillo código:

```
#include <16f877.h>
#use     delay(crystal = 4MHz)


void main (void)
{
   int8 unidades,decenas,puerto;
   
   while (true)
   {

      puerto = input_b();
      
      if(puerto > 99){puerto = 99;}    // No permitir que "puerto" sea mayor a 99
      
      decenas = (puerto / 10);         // Obtener las decenas.
      puerto -= (decenas * 10);        // puerto = puerto - (Decenas * 10)
      unidades = puerto;               // para obtener las unidades.
      
      // Multiplexar los displays.
      output_c(unidades + 32);         // Mostrar unidades, activar display 2 y desactivar Display 1
      delay_ms(2);                     // Retardo para mostrar las unidades.
      output_c(decenas + 16);          // Mostrar decenas, activar display 1 y desactivar display 2
      delay_ms(2);                     // Retardo para mostrar las decenas.
   }
}
```
Hace lo mismo que quieres hacer, pero de una forma más sencilla.

Utiliza éste esquema por si lo quieres realizar físicamente.


----------



## Berto75 (Jul 16, 2015)

Aclararme una cosa que diferencia hay en dejar un mensaje en RESPONDER y ponerlo EN RESPUESTA RAPIDA e enviado un mensaje en responder y no lo estoy viendo.



Me parece que a partir de ahora utilizare -respuesta rapida-, D@erbyte dame un toke si no as recibido mi mensaje porfa.


----------



## D@rkbytes (Jul 16, 2015)

Los nuevos mensajes en los temas que estás suscrito, también los puedes ver si entras aquí:
https://www.forosdeelectronica.com/usercp.php


----------



## Berto75 (Jul 17, 2015)

Sorry. Cada ve*z* q*ue* sigo tus pasos acabo siempre aqui.
Lo q*ue* te queria decir es que tu codigo aunque solo muestre el numero es muy BUENO para m*i* D@rkbytes *, h*e observado q*ue* 32 afecta al pin 6 y el 16 al PIN 4. ME GUSTA pero no entiendo como puede pasar de 15 utilizando solo 4 bits del PORTB te agradeceria mucho q*ue* me detallases esto D@rkbytes.


----------



## D@rkbytes (Jul 17, 2015)

AlberertO dijo:


> *H*e observado q*ue* 32 afecta al pin 6 y el 16 al PIN 4. ME GUSTA


Esa es una forma de realizar una máscara en un número.
Por ejemplo, quiero retener el número 7 y la vez mantener en 1 el bit 5:
Si el puerto es de 8 bits, entonces...

Obtenemos en binario el valor en 1 del bit 5.
0b00100000 = 32
Ahora sumamos 7 + 32 = 0b00100111

Al aplicar la máscara tenemos como resultado el número 7 (LSB) y también en 1 el bit 5


AlberertO dijo:


> No entiendo como puede pasar de 15 utilizando solo 4 bits del PORTB.
> Te agradecería mucho q*ue* me detallases ésto, D@rkbytes.


Porque no se están usando únicamente 4 bits del puerto B.
Pasa a binario el número 99 y ve cuantos bits tiene.


----------



## Berto75 (Jul 17, 2015)

Si vale D@rk.
 99 = 0110 0011 y esto no me aclara.
Yo crei q utilizabas la suma de 32 y 16 solo para activar distintos display 
y con 37 =  0010 0101 este binario afecta a los "pin 4=false y 5=true" esto me desconcierta,deberian estar libres.
SI. Tu utilizas todos los pin de portb para leer
Pero para escribir en portc solo utilizas 4 sigo sin entender como puede pasar de 15 =1111.
Y no me mires asi.


----------



## D@rkbytes (Jul 17, 2015)

No tiene gran ciencia.
Como el sistema es multiplex, se manda la cifra en números separados y se va activando el display correspondiente.
Para eso, se tiene que descomponer la cifra en decenas y unidades.
El decodificador 7447 trabaja 4 bits, por eso sólo se usan sólo 4 bits de salida.

Cuando ya se tienen los números de las decenas y las unidades separadas, se pueden mandar en cualquier orden.
Pero siempre activando el display del lugar al que corresponde cada número y enseguida se hace un retardo para mostrarse.
Como todo este proceso se lleva a cabo a una alta velocidad para nuestra vista, no notamos que mientras es mostrado un dígito, los demás permanecen apagados.

El proceso se lleva a cabo de ésta manera.
Por ejemplo, para mostrar el número 10:

Se manda el número 1 (Decenas), se activa el pin del primer display (MSB) y se hace un retardo.
Se manda el número 0 (Unidades), se activa el pin del segundo display (LSB) y se hace un retardo.

Pero mientras se activa un display, los demás deben desactivarse.
En el programa que subí, ésto se hace con el método de máscara, pero también se puede usar otro puerto para el control de los displays, y por código se van activando y desactivando.
Lo último lleva más código aunque es más sencilla su comprensión.



AlberertO dijo:


> 99 = 0110 0011 y esto no me aclara.


Creo que con la explicación que te di, ya lo podrás comprender ahora.
No se manda el 99, se manda la decena (9) y después la unidad (9), cada una de 4 bits.
Pero como ya tenemos los números separados y el sistema es multiplexado, no importa el orden en que sean enviados los números, porque no lo vamos a notar aunque sean más de 2 displays.
Por lo tanto, se pueden enviar los datos de MSB a LSB o de LSB a MSB, e incluso revueltos.
Lo que si es importante, es que cada número debe colocarse en el lugar indicado.
Y esto se logra activando el display que a ese número le corresponde.


----------



## Berto75 (Jul 21, 2015)

*D*ecenas = (puerto / 10);         // 9.8=98/10  Obtener las decenas=9.  (esto me confundia la logica me e*X*igía multiplicar)
      puerto -= (decenas * 10);        // puerto = puerto - (Decenas * 10)
      (¿¿¿¿PERO QUE HACE AHORA CON UN unidades=-98 ???)
*U*nidades = puerto;               // para obtener las unidades.

Lo ultimo q*UE* dices q*UE* lleva mas compresion si creo entenderlo. 

Otra cosa yo solo modifique el proyecto proteus para q*UE* funcionase *B*ajo tu codigo, 

Quizas sea por eso pero mis displays se encendian por separado nunca al unisono, no utilice tu doble*-*display ni el BCR ese
(acabo de formatear y estoy instalando todo).

*G*racias por todo D@rkibites


----------



## Berto75 (Jul 22, 2015)

Hola D@rkbytes. Se que tu programa tambien funciona, pero esto es mas simple de entender.

dec=valor/10;         //Como dec es un entero, se va a guardar unicamente el entero
unidaz= valor%10;      //El resto de la division de 10

El unico problema es que no se me ocurrio a mi.

Saludos.


----------



## ciberick (Ene 31, 2016)

Estimado
muy buen programa entiendo la Multiplexación, pero vuelvo a tener una duda con respecto a tus programas, son buenos pero quedo con la misma duda; este es uno de tus programas es similar al tema puntual......

///////////////////////////////////////////////////////////////////////////
#include <16f877a.h>
#use delay (crystal = 20MHz)
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,bits=8)

int8 valor=0;

#int_rda
void rda_isr(void){
   valor = getc();
}

 void main(void){
 int8 unidades,decenas;
 enable_interrupts(INT_RDA);
 enable_interrupts(GLOBAL);

 while (true){
   unidades = (valor % 10);         // Se extraen las unidades.
      decenas  = (valor % 100)/10;  // Se extraen las decenas.

         output_b(unidades+16);     // Se convierte el número a BCD y se activa primer dígito.
         delay_ms(2);               // Retardo para mostrar las unidades.
      output_b(decenas+32);         // Se convierte el número a BCD y se activa segundo dígito.
   delay_ms(2);                     // Retardo para mostrar las decenas.
   }
}

///////////////////////////////////////////////////////////////////////////////

estimado, tengo las siguientes consultas ojala me ayudes a entender por favor

1: quiero pasar este mismo programa a un pic16f628a
2: el pic16f628a tienes los pines de comunicación en el puerto B, se podrá configurar para usarlo en el puerto a
3: en el programa que muestro, en que parte configuras la activación para que se encienda y se apague un display de 7 segmentos
4: en el foro hablas de que se puede hacer de otra formay que trae mas programa, cual seria ea forma

por favor master , ayudeme con las dudas, creo que a todos los servira


----------



## D@rkbytes (Ene 31, 2016)

OK. Saludos.

El programa que muestras proviene de éste post: *Interrupción RS232 en CCS*

Si se puede usar ese programa en un PIC16F628A con el contador en los primeros 4 bits del puerto A, pero cambiando la máscara para obtener el control de los displays por los bits RA6 y RA7.
También se puede usar RA4 pero es Open Drain y se necesita una resistencia Pull-Up externa.
RA5 es sólo de entrada, así que queda descartado.

Y como se van a usar los pines RA6 y RA7 correspondientes al oscilador externo, se debe usar el oscilador interno y usar éstos pines como salidas.



ciberick dijo:


> 3: en el programa que muestro, en que parte configuras la activación para que se encienda y se apague un display de 7 segmentos.


Eso está explicado en este mismo tema.


ciberick dijo:


> 4: en el foro hablas de que se puede hacer de otra formay que trae mas programa, cual seria ea forma


De la forma clásica; usando un arreglo para obtener los bits de los segmentos y separar las decenas y unidades de la cifra a mostrar.


----------



## ciberick (Ene 31, 2016)

output_c(unidades + 32);         
delay_ms(2);                     
output_c(decenas + 16);

output_c(unidades + 32); // voy descomponer para que se entienda

port c = ob00000000  = 8BITS

Si se quiere mostrar el numero 34, con multiplexacion el programa hara lo siguiente
1: mostrar decena = 3
2: mostrar unidad =  4

tabla de 4 BIT
0000 = 0
0001 = 1
0010 = 2
0011 = 3
0100 = 4

FORMAREMOS  EL NUMERO 3

PORTC = 0B00000011 = 3 ; tenemos n°3 , los bit de color rojo indican el numero que formaremos
PORTC = 0B00010000 = 3 ; tenemos + 16 , los bits de color rojo sirven para activar los display
PORTC = 0B00010011= AHI JUNTAMOS TODO
CON EL +16 = Decimos que con RC4 ACTIVAREMOS EL DISPLAY

SALUDOS



D@rkbytes

en el programa ocupas los primeros 4 bit del puerto para formar el numero , como se podría hacer para ocupar los últimos 4 bits del puerto

RB0-RB1-RB2-RB3  REEMPLAZARLOS POR RB4-RB5-RB6-RB7, COMO SE PUEDE HACER

SALUDOS


----------



## D@rkbytes (Ene 31, 2016)

Es sencillo.
Los primeros 4 bits es el número a mostrar y la máscara será el byte del bit de activación.

Por ejemplo: número = 5 y el bit del primer display = RA7
5 en binario = 101
Bit 7 en 1 (RA7) en binario = 10000000
5 + 128 en binario = 10000101

Ahí tienes que el bit 7 estará en 1 y el número 5 en los primeros 4 bits (LSB)


----------



## elvi (May 19, 2020)

Buenas noches, estoy trabajando con arreglos y quiero definir la longitud del arreglo como una variable global de la siguiente manera:


```
int n=7;

void main (){
while(TRUE)
   {
    int arreglo [n] ;
   }
}
```

El error dice: Expression must evaluate to a constant . Cómo puedo  hacer que el  arreglo acepte mi variable global?


----------



## Dr. Zoidberg (May 19, 2020)

elvi dijo:


> Cómo puedo hacer que el arreglo acepte mi variable global?


Estudiando los arreglos en el lenguaje C.
El error te dice claramente cual es tu error, pero mejor estudiá arreglos en C para que lo entiendas.


----------



## cosmefulanito04 (May 19, 2020)

En C no está permitido declarar una variable en mitad de una función, solo se puede hacer al principio:


```
//... librerías necesarias
int n=7;

void main (){
int arreglo [n];
while(TRUE)
   {
    //... Se hace algo...
   }
}
```

No es muy útil utilizar una variable para definir el tamaño de un array si este será de un tamaño fijo (lo que normalmente sucede en un entorno embebido). Te recomiendo usar un define:


```
//... librerías necesarias
#define TAMANIO_ARRAY (unsigned int)(7)

void main (){
int arreglo [TAMANIO_ARRAY];
while(TRUE)
   {
    //... Se hace algo...
   }
}
```


----------



## Dr. Zoidberg (May 19, 2020)

cosmefulanito04 dijo:


> No es muy útil utilizar una variable para definir el tamaño de un array si este será de un tamaño fijo


Eso solo se puede hacer si el compilador soporta los VLA del ANSI C99 que no es el caso de los sistemas embebidos.


----------



## Dr. Zoidberg (May 19, 2020)

cosmefulanito04 dijo:


> No es muy útil utilizar una variable para definir el tamaño de un array si este será de un tamaño fijo


Eso solo se puede hacer si el compilador soporta los VLA del ANSI C99 que no es el caso de los sistemas embebidos y de casi ningún compilador mas o menos estándard. EL GCC lo soporta de forma sui-generis y los compiladores que lo admiten generalmente arman un despelote con el stack.


----------



## cosmefulanito04 (May 19, 2020)

En C++ se que se puede.

De todas formas, declarar infinitamente una variable dentro del while .


----------



## D@rkbytes (May 19, 2020)

Esto es lo más sencillo:
const int n = 7;


----------



## Dr. Zoidberg (May 19, 2020)

cosmefulanito04 dijo:


> En C++ se que se puede.


en C++ se hace

```
int n = 7; /* o lo que se te ocurra */
int *arreglo = new int[n];
```
para que vaya al heap, por que en los PIC que casi no tienen stack la otra declaración seguro te fuerza un stack-overflow ya que la asignación la mete en el stack.



cosmefulanito04 dijo:


> De todas formas, declarar infinitamente una variable dentro del while


Naaa...normalmente el compilador optimiza el comportamiento y el "scope" de esa declaración, pero como bien decís, no está permitida en el ANSI C, y es algo como hacer:

```
for( int i=0; i < 10; i++ ) {
/* bla bla bla */
}
```


----------



## cosmefulanito04 (May 20, 2020)

D@rkbytes dijo:


> Esto es lo más sencillo:
> const int n = 7;



En ese caso deberías asegurarte que el compilador lo guarde en memoria flash, sino sería un desperdicio.


----------



## Miembro eliminado 356005 (May 20, 2020)

elvi dijo:


> El error dice: Expression must evaluate to a constant . Cómo puedo  hacer que el  arreglo acepte mi variable global?


Primero deberíamos saber qué compilador estás usando. Como te han dicho antes, si es un compilador moderno se debería poder activar las compatibilidades C99 o C11 que permiten la declaración de *Arrays de longitud variable*, que te permitirían declarar un array de esa manera, pero mucho cuidado con hacerlo dentro del bucle while(), ya que podría ocurrir un agotamiento de la memoria.

Si tu compilador no tiene soporte de esa nueva característica, pues supongo que no te queda más remedio que *reservar memoria con malloc() y liberarla más tarde con free()*.


----------



## mautron (May 2, 2022)

Les adjunto la imagen donde est*á* el c*ó*digo con el cual intento enviar los n*ú*meros del 0 al 9 por comunicaci*ó*n serial USART, pero el virtual terminal no est*á* mostrando dichos n*ú*meros. *¿Dó*nde est*á* el error??

*E*l PIC usado es el 16F876

*E*n la *segun*da imagen se muestran los comentarios de la simulaci*ó*n de proteus.


```
/***************************************************************/
#include<16F876.h>
#fuses XT,NOWDT,NOLVP
#use delay (crystal=4MHz)

#byte SPBRG = 0x99
#byte RCSTA = 0x18
#byte TXREG = 0x19
#byte TXSTA = 0x98
#byte PIE1 = 0x8C
#byte PIR1 = 0x0C //bandera txif bit 4
#byte INTCON = 0x0B

int8 i;

void main(){
   TXSTA &= ~(1<<2); //baud rate baja vel.

   SPBRG = 5; //para baud rate de 9600 (en baja vel)

   TXSTA &= ~(1<<4); //modo asincrono

   RCSTA = 0x80; //habilita puerto tx como serial

   PIE1 |= (1<<4); //HAB. INT. POR TX

   TXSTA |= (1<<5); //habilita transmision

   INTCON = 0xC0; //int. globales y peri.

   while(1){
      for(i=0; i<=9; i++){
         if(PIR1 & (1<<4)){ //si txif =1
            TXREG = i;
            delay_ms(500);
         }
      }
   } //while
} //main

/***************************************************************/
```

Gracias.


----------



## D@rkbytes (May 2, 2022)

Si estás usando PIC C Compiler de CCS toda esa configuración de registros es innecesaria. (Hasta parece para ATmega o XC8)
Tan solo se requiere declarar lo siguiente:
#use RS232 (UART1, BAUD = XXXXX)
Eso establece usar USART por hardware, donde XXXXX son los baudios.
Esa declaración acepta más parámetros que puedes encontrar en la ayuda del programa.
Y como quieres usar RS-232 por hardware, también te recomiendo usar la interrupción por recepción "RDA" y olvidarte del polling.



mautron dijo:


> *E*n la *segun*da imagen se muestran los comentarios de la simulaci*ó*n de proteus.


Eso no sirve de nada, si acaso, errores del compilador.


----------



## mautron (May 2, 2022)

*G*racias por la respuesta rapida D@rkbytes, interesante dato lo del #use RS232 (UART1, BAUD = XXXXX) para programaci*ó*n por hardware.
*S*i, tienes raz*ó*n, lo de lo innecesario que parece toda esa configuraci*ó*n de registros pero lo hago as*í* a prop*ó*sito para familiarizarme con la hoja de datos de los pics ya que apenas estoy empezando el estudio de los microcontroladores.

*Y *a pesar que ya me mostraste como hacer la configuraci*ó*n usando la directiva #use rs232... aun me queda la duda de por qué si segui todos los pasos que muestra la hoja de datos no me funciona.

*E*stuve buscando lo de la interrupci*ó*n por recepci*ó*n RDA en toda la hoja de datos y no me aparece.

*Y* si no es mucho pedir...¿*Q*ue es eso del polling?


----------



## D@rkbytes (May 2, 2022)

mautron dijo:


> si, tienes razon, lo de lo innecesario que parece toda esa configuración de registros pero lo hago así a propósito para familiarizarme con la hoja de datos de los pics, ya que apenas estoy empezando el estudio de los microcontroladores.


Usando lenguaje ensamblador, seguro que te familiarizas con los registros.


mautron dijo:


> a pesar que ya me mostraste como hacer la configuración usando la directiva #use rs232... aún me queda la duda de por qué si seguí todos los pasos que muestra la hoja de datos, no me funciona.


¿Qué baudrate se supone que quieres usar?
Con 4 MHz 19200 Bps ya van justos.


mautron dijo:


> estuve buscando lo de la interrupción por recepción RDA en toda la hoja de datos y no me aparece.


Eso no viene en la hoja de datos porque es una directiva del compilador.
Esa información se encuentra en la documentación del compilador. (La tecla F1 hace magia)



mautron dijo:


> Y si no es mucho pedir... ¿Qué es eso del polling?


*Polling* (Wikipedia)


----------



## mautron (May 2, 2022)

*E*l baud rate que quiero usar es de 9600, para configurar ese baud rate usé la formula : baudios = Fosc/64*(SPBRG + 1)
despejando SPBRG me dio 5.51 , por lo que cargue el registro SPBRG con 5.


----------



## D@rkbytes (May 2, 2022)

mautron dijo:


> El baud rate que quiero usar es de 9600


    // Configuración USART: (9600 Bps @ 4 MHz. 9615 Bps Reales 0.16% de error.)
    SPBRG =    0x19
    TXSTA =    0x24
    RCSTA =    0x90


----------



## AleSergi (May 2, 2022)

Hola Mautron , no sé exactamente si el pic css compiler deja que configures todo manejando los registro, lo supe intentar pero no me funcionó, y no le dí importancia porque en realidad era un código de los AVR, que pretendía hacerlo portable entre los dos micros.

Lo que sí me funcionó y a la perfección  es el manejo totalmente manual de las entradas y salidas digitales, empleando el bitmask y no las funciones del CCS.

Lo primero que deberías hacer es indicarle al compilador que manejaras manualmente las entradas/salidas digitales, también mira los .h que corresponden al micro en cuestión, porque suelen tener las direcciones de los registros y sus nombres, de esa forma no requerís darle la dirección a mano.

Busca bien que hace "set env" del ccs, para estas cuestiones. Siempre podes mirar el archivo de salida que genera el compilador, en assembler, para saber exactamente lo que tradujo.

Y es como haces, mirando la hoja de dato y ayudándote de un código, por ejemplo del sdcc compiler o el compilador nativo del Microchip.









						pic-examples/main.c at master · miguelgarcia/pic-examples
					

PIC Microcontroller example programs. Contribute to miguelgarcia/pic-examples development by creating an account on GitHub.




					github.com


----------

