Reandom

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.

16F877A como ADC

Como leer un canal Analogico con un microcontrolador Microchip.

  1.         list    p=16f877A
  2.         include .
inc>
  • __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