Quiero hacer un dispositivo electrónico que mida la velocidad del viento en Beaufort. La definición de la escala de Beaufort requiere el cálculo de un promedio en un período de 10 minutos. Elegimos hacer esto usando el siguiente principio (promedio con olvido): filtre-passe-bas2.gif
Por razones económicas y de espacio, elegimos realizar el filtro RC mediante simulación numérica en el microcontrolador.
Fuente de alimentación: tensión de salida analógica de 3V proporcional a la escala de Beaufort con 0 correspondiente a 0V Beaufort, 3V correspondiente a 9 Beaufort (no mostrará valores superiores a 9 Beaufort) Interfaz para el módulo LCD: SPI (SPIdatas y SPI clk) Velocidad del viento codificada en 8 bits
Creo que
Puedo tomar lecturas una vez por segundo (la velocidad del viento es relativamente lenta para cambiar, por lo que no es necesario hacerlo más rápido).
Agregue la lectura a la anterior y reduzca a la mitad el resultado para obtener un promedio de ejecución.
Cada 10 segundos envía la velocidad escalada de 0 a 9 a la pantalla LCD.
¡Es posible almacenar y promediar varias lecturas pero con solo 16 bytes de RAM y algunas de las necesarias para el software SPI! Para mí es difícil de codificar. El código está altamente optimizado. Por eso vengo a pedirle su ayuda: fs: y conocimientos. Cualquier idea es bienvenida!
Empiezo a codificar, pero tengo dificultades para almacenar y promediar varias lecturas con solo 16 bytes de RAM y algunas de las necesarias para el software SPI ¿Alguien puede ayudarme por favor?
movlw b'00001001' ;sets GP1 and GP2 as Outputs
TRIS GPIO
movlw 0x41
movwf ADCON0
movlw 0xC7
option
;****************************************************************************
;***** VARIABLE DEFINITIONS**************************************************
;****************************************************************************
cblock 0x09
Delay ;variable for the delay ,to make delays
Counter ;variable to count how many measurements
LCD_data ;hold the data to be sent to the LCD
Counter_data ; hold the counter for the bits as they are sent to the LCD
endc
;**********************************************************************
;******************* coding begins*************************************
;**********************************************************************
ORG 0x000 ; coding begins here
movwf OSCCAL ; update register with factory cal value
start
clrf LCD_data
clrf Counter_data
clrf Counter
clrf Delay
;***********************************************************************
; remaining code goes here
;***********************************************************************
Wait
movlw .15 ;reload 'Delay' again
movwf Delay
movlw 1 ;give TMR0 a start value
movwf TMR0
Wait1
movf TMR0,f ;set Z in STATUS if TMR0 = 0
btfss STATUS,Z ;bit test the Z bit, skip if set (= Zero)
goto Wait1 ;not zero yet so keep checking
decfsz Delay,f ;subtract 1 from Delay and see if zero
goto Wait1 ;not reached zero yet so keep checking
return
;********************************************************************
; read the voltage on the analog input pin, return result in W
;********************************************************************
ReadADC
bsf ADCON0,GO_NOT_DONE ;start measuring the voltage
ADC_Wait
btfsc ADCON0,GO_NOT_DONE ;skip next instruction if GO/-DONE is zero
goto ADC_Wait ;not finished yet!
movf ADRES,W ;copy the result to W
return