Estoy tratando de escribir mi primer programa en ensamblador para PIC16F886. El programa debe hacer lo siguiente:
- Lee el valor de ADC en el canal AN0
- Si el valor es menor que 128, apague el LED
- De lo contrario, encienda el LED
El esquema es bastante simple:
Yaquíestámicódigodeensamblaje.
list p=16f886 ; list directive to define processor
#include <p16f886.inc> ; processor specific variable definitions
__CONFIG _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__CONFIG _CONFIG2, _WRT_OFF & _BOR21V
org 00 ;start at 0x00
VALUE EQU 0x80 ;value to compare adc results
cblock 0x20
RESULTLO ;ADC 8-bit result
endc
port_config
movlw b'11111110' ;set RB0 on PORTB to output
movwf TRISB
start
bsf PORTB, 0 ;turn LED on
adc_config
BANKSEL ADCON1
movlw 0x00 ;left justify
MOVWF ADCON1 ;Vdd and Vss as Vref
BANKSEL TRISA ;
BSF TRISA,0 ;Set RA0 to input
BANKSEL ANSEL ;
BSF ANSEL,0 ;Set RA0 to analog
adc_sample
BANKSEL ADCON0;
MOVLW b'11000001' ;ADC Frc clock,
MOVWF ADCON0 ;AN0, On
BSF ADCON0,GO ;Start conversion
BTFSC ADCON0,GO ;Is conversion done?
GOTO $-1 ;No, test again
BANKSEL ADRESH
MOVF ADRESH,W ;Read lower 8 bits
MOVWF RESULTLO ;Store in GPR space
; if RESULT <= VALUE
movf RESULTLO,w
addlw 255 - VALUE
skpnc
goto led_off
; if RESULT > VALUE
movf VALUE,w
addlw 255 - RESULTLO + 1
skpnc
goto led_on
;loop
goto adc_sample
led_on
bsf PORTB, 0
goto adc_sample
led_off
bcf PORTB, 0
goto adc_sample
end
Espero que el led se encienda / apague cuando cambio la resistencia de la olla, pero en cambio el led permanece encendido.
Actualización: sospecho que tiene algo que ver con la forma en que comparo RESULT
y VALUE
desde que recibí la siguiente advertencia durante la compilación: Argument out of range. Least significant bits used.
Actualización: Como mencioné en los comentarios, el esquema se toma directamente de Proteus. En el dispositivo real, el controlador se alimenta desde una fuente de 5 V, debe tener una resistencia limitadora en serie con un led (a menos que conduzca el mcu desde un voltaje más pequeño) y nMCLR está conectado a + 5V a través de un Resistencia 5k.