Mensajes recientes

Páginas: [1] 2 3 4 5 6 7 8 9 10
1
Arduino / Re:Voltimetro Arduino para leer su propio voltaje de alimentacion.
« Último mensaje por Picuino en Hoy a las 12:12:30 »
Por lo que yo conozco, no es necesario habilitar el BROWNOUTDETECTOR.
Solo necesitas habilitar el ADC y luego lo puedes volver a desabilitar.

Saludos.
2
Arduino / Re:Voltimetro Arduino para leer su propio voltaje de alimentacion.
« Último mensaje por Simon21 en Hoy a las 09:16:35 »
Otra opción sería poder deshabilitar ese FUSE con el programa corriendo, para usarlo cuando realmente necesite medir.

3
Algunos errores/warning son obvios:

Citar
Warning[219] F:\CCS\MPLABX\MPASM.X\MAIN.ASM 249 : Invalid RAM location specified.

Esto es porque el CBLOCK esta ubicado en 0x20, cuando la memoria del PIC10F200 va del 0x10 al 0x1F.

Citar
Error[113]   F:\CCS\MPLABX\MPASM.X\MAIN.ASM 65 : Symbol not previously defined (RP0)
Error[113]   F:\CCS\MPLABX\MPASM.X\MAIN.ASM 207 : Symbol not previously defined (TRISIO)
Error[113]   F:\CCS\MPLABX\MPASM.X\MAIN.ASM 210 : Symbol not previously defined (OPTION_REG)
Error[113]   F:\CCS\MPLABX\MPASM.X\MAIN.ASM 61 : Symbol not previously defined (RP0)
Error[113]   F:\CCS\MPLABX\MPASM.X\MAIN.ASM 215 : Symbol not previously defined (CMCON)
Error[113]   F:\CCS\MPLABX\MPASM.X\MAIN.ASM 217 : Symbol not previously defined (INTCON)
Error[113]   F:\CCS\MPLABX\MPASM.X\MAIN.ASM 217 : Symbol not previously defined (GIE)
Error[113]   F:\CCS\MPLABX\MPASM.X\MAIN.ASM 218 : Symbol not previously defined (INTCON)
Error[113]   F:\CCS\MPLABX\MPASM.X\MAIN.ASM 218 : Symbol not previously defined (PEIE)

Los demas tambien es un poco mas obvio...
No existe el registro TRISIO, sino existe una instruccion llamada TRIS para controlarlo. Tampoco existen todos los demas registros como le llamaste.
Concretamente tenes unicamente estos registros:

Código: [Seleccionar]
INDF             EQU  H'0000'
TMR0             EQU  H'0001'
PCL              EQU  H'0002'
STATUS           EQU  H'0003'
FSR              EQU  H'0004'
OSCCAL           EQU  H'0005'
GPIO             EQU  H'0006'

y ninguno mas. Claramente ese codigo que tenes es de otro PIC...
Esa version no posee comparador, asi que el CMCON no tiene sentido.

Citar
PAG_RAM0   MACRO
         bcf   STATUS,RP0
         ENDM

PAG_RAM1   MACRO
         bsf   STATUS,RP0
         ENDM

Tenes un solo banco, no tiene sentido este codigo, ni siqueira existen los bits.


Citar
         call    3FFh          ; Ajusta el oscilador a 4MHz
         movwf    OSCCAL          ; usando el valor que se encuentra en 3FFh

El lugar donde esta ubicado el valor es en 0xFF donde llega la memoria de ese PIC. y no es un RETLW sino un MOVLW ,
En el reset el PCL apunta directamente a 0xFF por lo tanto lo unico que tense que hacer es el MOVWF al OSCCAL

----------------------------------

Siempre que programes en ASM, si o si tenes que referenciarte al datasheet:
http://ww1.microchip.com/downloads/en/DeviceDoc/40001239F.pdf
4


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
5
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 ?

6
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.
7
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.
8
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 !

9
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
10
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.
Páginas: [1] 2 3 4 5 6 7 8 9 10
anything