Definir val1, val2, val3
Rand movf val1,w ;get the 1st
addwf val2,w ;add the 2nd
movwf val2 ;store the 2nd
addwf val3,w ;add the 3rd & store
movwf val3 ;back in 3rd
addwf val1 ;add back to 1st
swapf val1 ;swap nibbles
movf val1,w ;return one byte
return
Hay otra forma si el pic tiene modulo analogico, se puede configurar un solo pin como entrada analogica y deshabilitar los pull-up y todas las configuraciones de ese pin ADC.
Lo que se hace es leer el valor de esa entrada ej. ADRESH y movelo a una de las variables de la rutina Rand entonces al dejar el pin configurado como ADC en el aire sin conecciones, este mismo lee valores erraticos aleatoriamente por ende se genera un random fisico y se procesa ese valor en la rutina.
Prueba del microcontrolador PIC16F627A
Los Fuentes estan en el siguiente LINK
;**********************************************************************************
; Prueba del microcontrolador PIC16F627A
;
; Destello de un led en la salida RB0, usando oscilador interno.
;
; PIN(6) RB0 - Con una R de 470(ohm) a GND
; PIN(4) MCLR - Con una R de 10K a +B(5V) y un pulsador NA a GND
; PIN(5) Vss - A GND
; PIN(14) Vdd - A +B(5V) con un C de 100nF a GND;;
;**********************************************************************************
list p=16f627a
#include
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_ON & _LVP_OFF
CBLOCK 0x33 ;Definicion de variables en el Block de C
K ;Variable K
J ;Variable J
ENDC ;Fin de definicion de variables
#define OUT PORTB,0 ;Macro Pin RB0
org 0x0000 ;Origen de la memoria Cero
goto Inicio ;Salto a la etiqueta Inicio
nop ;Consume 1 Cilco de procesador
nop ;Consume 1 Cilco de procesador
nop ;Consume 1 Cilco de procesador
nop ;Consume 1 Cilco de procesador
org 0x0005 ;Vector de Reset
Inicio movlw 0x07 ;moviendo 0x07 al registro CMCON
movwf CMCON ;apagamos las entradas analogicas (sacado del datacheet)
clrf PORTA ;Limpiamos Puerto A
clrf PORTB ;Limpiamos Puerto B
bsf STATUS,RP0 ;Acceso a banco 1 de registro
clrf TRISA ;Puerto A como salida
clrf TRISB ;Puerto B como salida
bcf STATUS,RP0 ;Salimos del banco 1
main bsf OUT ;Setea OUT - "1" en el pin RB0
call Delay ;Llama a la demora
bcf OUT ;Clear OUT - "0" en el pin RB0
call Delay ;Llama a la demora
goto main ;Salto a la etiquta "main" [Loop]
Delay ;Subrutina de demora
movlw .200 ;Mueve el numero 200 a W, W=200
movwf J ;Mueve W a J, J=200
LoopG
movlw .200 ;Mueve el numero 200 a W, W=200
movwf K ;Mueve W a K, K=200
LoopF decfsz K ;Decrementa el valor de K hasta que sea Cero
goto LoopF ;Salta a la etiqueta "LoopF" [Loop]
decfsz J ;Decrementa el valor de J hasta que sea Cero
goto LoopG ;Salta a la etiqueta "LoopG" [Loop]
return ;Una vez que "LoopG" esta en Cero, Retorna
end ;Fin del programa
Teniendo en cuenta que no se permiten las tabulaciones en este post, hay que agegaselas donde hay espacio.
;**********************************************************************************
; Prueba del microcontrolador PIC16F627A
;
; Destello de un led en la salida RB0, usando oscilador interno.
;
; PIN(6) RB0 - Con una R de 470(ohm) a GND
; PIN(4) MCLR - Con una R de 10K a +B(5V) y un pulsador NA a GND
; PIN(5) Vss - A GND
; PIN(14) Vdd - A +B(5V) con un C de 100nF a GND;;
;**********************************************************************************
list p=16f627a
#include
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_ON & _LVP_OFF
CBLOCK 0x33 ;Definicion de variables en el Block de C
K ;Variable K
J ;Variable J
ENDC ;Fin de definicion de variables
#define OUT PORTB,0 ;Macro Pin RB0
org 0x0000 ;Origen de la memoria Cero
goto Inicio ;Salto a la etiqueta Inicio
nop ;Consume 1 Cilco de procesador
nop ;Consume 1 Cilco de procesador
nop ;Consume 1 Cilco de procesador
nop ;Consume 1 Cilco de procesador
org 0x0005 ;Vector de Reset
Inicio movlw 0x07 ;moviendo 0x07 al registro CMCON
movwf CMCON ;apagamos las entradas analogicas (sacado del datacheet)
clrf PORTA ;Limpiamos Puerto A
clrf PORTB ;Limpiamos Puerto B
bsf STATUS,RP0 ;Acceso a banco 1 de registro
clrf TRISA ;Puerto A como salida
clrf TRISB ;Puerto B como salida
bcf STATUS,RP0 ;Salimos del banco 1
main bsf OUT ;Setea OUT - "1" en el pin RB0
call Delay ;Llama a la demora
bcf OUT ;Clear OUT - "0" en el pin RB0
call Delay ;Llama a la demora
goto main ;Salto a la etiquta "main" [Loop]
Delay ;Subrutina de demora
movlw .200 ;Mueve el numero 200 a W, W=200
movwf J ;Mueve W a J, J=200
LoopG
movlw .200 ;Mueve el numero 200 a W, W=200
movwf K ;Mueve W a K, K=200
LoopF decfsz K ;Decrementa el valor de K hasta que sea Cero
goto LoopF ;Salta a la etiqueta "LoopF" [Loop]
decfsz J ;Decrementa el valor de J hasta que sea Cero
goto LoopG ;Salta a la etiqueta "LoopG" [Loop]
return ;Una vez que "LoopG" esta en Cero, Retorna
end ;Fin del programa
Teniendo en cuenta que no se permiten las tabulaciones en este post, hay que agegaselas donde hay espacio.
16F877A como ADC
Como leer un canal Analogico con un microcontrolador Microchip.
inc>
- list p=16f877A
- include
.
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _LVP_OFF &
_PWRTE_ON & _XT_OSC
;
org 0x000
;
bcf STATUS,RP0
bcf STATUS,RP1
movlw b'01000001'
movwf ADCON0
bsf STATUS,RP0
bcf STATUS,RP1
clrf TRISA
clrf TRISB
clrf TRISC
clrf TRISD
clrf TRISE
movlw b'00000111'
movwf OPTION_REG
movlw b'00001110'
movwf ADCON1
bsf TRISA,0
bcf STATUS,RP0
bcf STATUS,RP1
clrf PORTC
;
bucle btfss INTCON,T0IF
goto bucle
bcf INTCON,T0IF
bsf ADCON0,GO
;
espera btfsc ADCON0,GO
goto espera
movf ADRESH,W
movwf PORTC
goto bucle
;
end
Suscribirse a:
Entradas (Atom)