Mensajes recientes

Páginas: 1 2 3 4 [5] 6 7 8 9 10
41
Almacén del Assembler / Errores al Compilar Programa de Luces Secuenciales con Pic 10F200
« Último mensaje por pic_877a en 17 de Enero de 2020, 01:44:09 »


amigos del foro un cordial saludo y un feliz año nuevo 2020 para todos y todas.

he estado realizando el siguiente programa que es un secuencial de luces con Pic 10F200.

ERRORLEVEL -302         
   LIST    P = 10F200, r=DEC, n=66
    INCLUDE         "P10F200.INC"

;-----------------------------------------------------------------------------------------------------------
; Pin del circuito
; ===============================
;-----------------------------------------------------------------------------------------------------------

#define      p_rojo   GPIO,0         ; pin del canal rojo
#define      p_verde   GPIO,1         ; pin del canal verde
#define      p_azul   GPIO,2         ; pin del canal azul

#define    IOMap   B'111000'      ; mapa de los pin del micro: los tres primeros como salidas

;-----------------------------------------------------------------------------------------------------------
; Otras constantes
; ===============================
;-----------------------------------------------------------------------------------------------------------
#define      tiempo_rojo  30         ; tiempos distintos de los canales
#define      tiempo_verde 37         ; para obtener todas
#define      tiempo_azul  45         ; las combinaciones posibles

#define      tiempo_general 100      ; velocidad de variación general
                  ; (bajar el valor para obtener mas velocidad)

;-----------------------------------------------------------------------------------------------------------
; Registros en RAM
; ================
;-----------------------------------------------------------------------------------------------------------
   
   cblock     20H     ; Dummy Origin

      intensidad_verde            ; registro intensidad canal verde      
      intensidad_rojo                ; registro intensidad canal rojo      
      intensidad_azul               ; registro intensidad canal azul      

      divisor_verde               ; divisor canal verde
      divisor_rojo               ; divisor canal rojo
      divisor_azul               ; divisor canal azul

      divisor_general               ; divisor general

      RegPwm                     ; registro PWM para regular la intensidad de los tres canales
         
      RegFlags                  ; registro de uso general
   endc


#define   aumenta_verde   RegFlags,0      ; flag que indica si el canal verde está aumentando su intensidad
#define   aumenta_rojo   RegFlags,1      ; flag que indica si el canal rojo está aumentando su intensidad
#define   aumenta_azul   RegFlags,2      ; flag que indica si el canal azul está aumentando su intensidad

;-----------------------------------------------------------------------------------------------------------
; MACRO cambio pagina de la RAM
; ================================
;-----------------------------------------------------------------------------------------------------------

PAG_RAM0   MACRO
         bcf   STATUS,RP0
         ENDM

PAG_RAM1   MACRO
         bsf   STATUS,RP0
         ENDM

;-----------------------------------------------------------------------------------------------------------
;               Vector de arranque del micro
;-----------------------------------------------------------------------------------------------------------

             ORG     0
         PAG_RAM1
         call    3FFh          ; Ajusta el oscilador a 4MHz
         movwf    OSCCAL          ; usando el valor que se encuentra en 3FFh
         PAG_RAM0
         goto   main

;-----------------------------------------------------------------------------------------------------------
;               SUBRUTINAS
;-----------------------------------------------------------------------------------------------------------

         ORG   10h               ; beginning of program Eprom

;-----------------------------------------------------------------------------------------------------------
;               Aumenta o disminuye la intensidad del canal verde
;-----------------------------------------------------------------------------------------------------------

OnOffVerde
         decfsz   divisor_verde,f      ; divisor para disminuir la velocidad de cambio      
         retlw   0         ; Vuelve al ciclo principal

         movlw   tiempo_verde      ; el divisor se actualiza
         movwf   divisor_verde      ; con la constante tiempo_verde

         btfss   aumenta_verde      ; canal en fase di aumento de la intensidad?
         goto   DisminuyeVerde      ; No, entonces salta a disminuye         
         incfsz   intensidad_verde,f   ; Si, entonces aumenta la intensidad
         retlw   0               ; Vuelve al ciclo principal
         bcf   aumenta_verde      ; La intensidad llegó al máximo, entonces
         decf   intensidad_verde,f   ; cambia al modo de disminución
         retlw   0         ; Vuelve al ciclo principal

DisminuyeVerde   
         movf   intensidad_verde,f   ; Modo de disminución
         btfsc   STATUS,Z      ; Controla si no llegó al mínimo
         goto   DisminuyeVerdeCambia   ; Si es si, salta para cambiar el modo
         decf   intensidad_verde,f   ; Disminuye la intensidad
         retlw   0         ; Vuelve al ciclo principal
DisminuyeVerdeCambia
         bsf   aumenta_verde      ; Cambia al modo de aumento
         retlw   0         ; Vuelve al ciclo principal


;-----------------------------------------------------------------------------------------------------------
;               Aumenta o disminuye la intensidad del canal rojo
;-----------------------------------------------------------------------------------------------------------

OnOffRojo
         decfsz   divisor_rojo,f      ; La descripción de esta sub es igual
         retlw   0         ; a la del canal verde (OnOffVerde)

         movlw   tiempo_rojo
         movwf   divisor_rojo

         btfss   aumenta_rojo
         goto   DisminuyeRojo               
         incfsz   intensidad_rojo,f
         retlw   0
         bcf   aumenta_rojo
         decf   intensidad_rojo,f
         retlw   0

DisminuyeRojo   
         movf   intensidad_rojo,f
         btfsc   STATUS,Z
         goto   DisminuyeRojoCambia
         decf   intensidad_rojo,f
         retlw   0
DisminuyeRojoCambia
         bsf   aumenta_rojo
         retlw   0

;-----------------------------------------------------------------------------------------------------------
;               Aumenta o disminuye la intensidad del canal azul
;-----------------------------------------------------------------------------------------------------------

OnOffAzul
         decfsz   divisor_azul,f      ; La descripción de esta sub es igual      
         retlw   0         ; a la del canal verde (OnOffVerde)

         movlw   tiempo_azul
         movwf   divisor_azul

         btfss   aumenta_azul
         goto   DisminuyeAzul               
         incfsz   intensidad_azul,f
         retlw   0
         bcf   aumenta_azul
         decf   intensidad_azul,f
         retlw   0

DisminuyeAzul   
         movf   intensidad_azul,f
         btfsc   STATUS,Z
         goto   DisminuyeAzulCambia
         decf   intensidad_azul,f
         retlw   0
DisminuyeAzulCambia
         bsf   aumenta_azul
         retlw   0

;-----------------------------------------------------------------------------------------------------------
;               Actualiza intensidad de los 3 canales (rojo, verde y azul)
;               en base a los registros de intensidad
;-----------------------------------------------------------------------------------------------------------
PwmRefresh
         incf   RegPwm,f         ; actualiza la intensidad
         movf   intensidad_verde,W      ; del canal verde
         subwf   RegPwm,W
         btfss   STATUS,C
         bsf   p_verde
         btfsc   STATUS,C
         bcf   p_verde   

         movf   intensidad_rojo,W      ; actualiza la intensidad
         subwf   RegPwm,W         ; del canal rojo
         btfss   STATUS,C
         bsf   p_rojo
         btfsc   STATUS,C
         bcf   p_rojo   

         movf   intensidad_azul,W      ; actualiza la intensidad
         subwf   RegPwm,W         ; del canal azul
         btfss   STATUS,C
         bsf   p_azul
         btfsc   STATUS,C
         bcf   p_azul   
         retlw   0      

;-----------------------------------------------------------------------------------------------------------
;               MAIN
;-----------------------------------------------------------------------------------------------------------
main       
         PAG_RAM1
         movlw   IOMap          
         movwf   TRISIO            ; Set de los puertos como entradas o salidas

         movlw   B'11100011'         ; RB pull-up on. Prscaler %128 in Watch-Dog (max.time)
         movwf   OPTION_REG         ;
      
         PAG_RAM0

         movlw   B'00000111'         ; Set de los puertos como digitales
         movwf   CMCON

         bcf   INTCON,GIE         ; Ningun interrupt global activado
         bcf   INTCON,PEIE         ; Ningun interrupt periférico activado

         movlw   tiempo_verde         ; Carga todos los registros
         movwf   divisor_verde         ; con los datos necesarios
         movlw   tiempo_rojo         ; para el correcto funcionamiento
         movwf   divisor_rojo
         movlw   tiempo_azul
         movwf   divisor_azul
         movlw   tiempo_general
         movwf   divisor_general
         clrf   RegFlags
         clrf   divisor_general
         clrf   intensidad_azul
         clrf   intensidad_verde
         clrf   intensidad_rojo
         
;-----------------------------------------------------------------------------------------------------------
;            CICLO DE TRABAJO PRINCIPAL
;-----------------------------------------------------------------------------------------------------------
Ciclo
         clrwdt               ; Watchdog para evitar que el micro se pueda bloquear
CicloVerde
         call   PwmRefresh         ; Actualiza los canales (PWM)
         decfsz    divisor_general,f      ; Ciclo para disminuir la velocidad
         goto   CicloVerde         ; de la actualizaz
         call   OnOffVerde
         movlw   tiempo_general
         movwf   divisor_general         
         clrwdt
CicloRojo
         call   PwmRefresh
         decfsz    divisor_general,f
         goto   CicloRojo
         call   OnOffRojo
         movlw   tiempo_general
         movwf   divisor_general
         clrwdt
CicloAzul
         call   PwmRefresh
         decfsz    divisor_general,f
         goto   CicloAzul
         call   OnOffAzul
         movlw   tiempo_general
         movwf   divisor_general

         goto   Ciclo

;***********************************************************************************************
; Service Interrupt: SELECT
;***********************************************************************************************
service_int
      retfie
;***********************************************************************************************
      END
 
luego al compilar dicho programa me sale muchos errores, en total son 12.
adjunto las siguientes imágenes  de los errores presentando en el programa que estoy realizando, mi objetivo es poder aprender a programar este pic de la familia 10F  y asi probar el programador de Pics y dspic  de Mikroelectronics.

espero y me puedan ayudar a corregir estos errores y asi poder aprender mas y por supuesto de ustedes amigos del foro.

gracias

Jose Luis
42
Arduino / Re:Voltimetro Arduino para leer su propio voltaje de alimentacion.
« Último mensaje por Simon21 en 16 de Enero de 2020, 18:36:26 »
Lo ideal seria eso, por ahora solo estoy probando con el divisor resistivo y enviando la tensión de salida del divisor a la entrada analógica.

La duda que tengo es que para poder medir la entrada analógica, debo habilitar el FUSE que modifica el BROWNOUTDETECTOR, y a partir de ese momento pasa a consumir muchisimo más corriente el micro. Como puedo evitar esto ? O hacer que consuma menos al habilitar el ADC ?

43
Arduino / Re:Voltimetro Arduino para leer su propio voltaje de alimentacion.
« Último mensaje por Picuino en 16 de Enero de 2020, 18:19:58 »
Prueba a utilizar un transistor mosfet con un divisor resistivo.
44
Arduino / Re:Voltimetro Arduino para leer su propio voltaje de alimentacion.
« Último mensaje por Picuino en 16 de Enero de 2020, 18:17:11 »
Ok.
Entonces tienes que utilizar algún circuito externo. El Brownout detector mide la tension Vdd, no te vale para lo que quieres.
45
Arduino / Re:Voltimetro Arduino para leer su propio voltaje de alimentacion.
« Último mensaje por Simon21 en 16 de Enero de 2020, 18:03:09 »
Claro, pero en mi caso eso no me sirve ya que necesito medir la tensión de la batería, no la de alimentación al PIC.

A continuación un esquema básico:

BATERIA --->---- REGULADOR DE TENSION --->---- ALIMENTACION PIC ...... ENTRADA ANALOGICA PIC
      |                                                                                                                           |   
      |                                                                                                                           |
      |                                                                                                                           |
       ------------------->--------------->-------------->-------------->----------------->--------       

Se entiende ?

Saludos !

46
Arduino / Re:Voltimetro Arduino para leer su propio voltaje de alimentacion.
« Último mensaje por Picuino en 16 de Enero de 2020, 17:42:13 »
Fórmula final para una tensión de referencia de 2 voltios =

     Vdd = 2 * 1023 / Valor ADC
47
Arduino / Re:Voltimetro Arduino para leer su propio voltaje de alimentacion.
« Último mensaje por Picuino en 16 de Enero de 2020, 17:39:53 »
Lo que mides es una tensión fija de 2 voltios, que te permite medir la tensión de alimentación  ;-)

La fórmula es la siguiente:

    Valor ADC = Tensión_Entrada * 1023 / VREF

Despejando:

     VREF = Tensión_Entrada * 1023 / Valor ADC


Y como VREF está conectado a la tensión de alimentación, ya tienes esa tensión calculada.

Un saludo.
48
Todo en microcontroladores PIC / Re:PIC Bajo Consumo para aplicaciones IOT
« Último mensaje por Simon21 en 16 de Enero de 2020, 16:38:19 »
49
Arduino / Re:Voltimetro Arduino para leer su propio voltaje de alimentacion.
« Último mensaje por Simon21 en 16 de Enero de 2020, 16:36:32 »
Creo que te estás complicando con el montaje externo.

Si mides la tensión interna de referencia (por ejemplo FVR=2.048V) mientras la tensión de referencia del ADC está conectada a la alimentación (Aref = Vdd), a partir de esa medida se puede calcular fácilmente la tensión de alimentación.

Posteriormente desconectas el módulo de tensión de referencia interno (FVR) y el módulo ADC para que no consuman corriente.

Así tienes todo incluido dentro del microcontrolador y con un consumo mínimo.

Un saludo.

Entiendo lo que me dices Picuino, pero en este caso estas midiendo la tensión en la entrada del micro. Mi pregunta apunta a medir la tensión de la batería, lo cual no es la misma que la tensión del micro ya que hay un regulador de tensión al medio  :? :?

Gracias por tu respuesta !
50
Arduino / Módulos rx y tx audio
« Último mensaje por Carolina en 16 de Enero de 2020, 16:32:54 »
Hola, me gustaría saber si es posible transmitir un archivo de audio con extensión .gmc desde una raspberry a un arduino con los módulos RF de 433Mhz o si hay alguna otra forma de hacer la comunicación inalámbrica sin tener que recurrir a bluetooth y de ser posible, podrían darme una pista de cómo puedo convertir el archivo para poder transmitirlo?
Igual estoy abierta a utilizar nRF24L01 pero no sé si también se puede enviar audio.
Páginas: 1 2 3 4 [5] 6 7 8 9 10