En aquest exemple es combinen coses dels exemples RL i EA.
Com en l'exemple anterior, en aquest cas llegirem el potenciòmetre utilitzant una entrada analògica. Ara el que farem serà utilitzar els 8 bits superiors del valor llegit per variar la velocitat. A l'Exemple RL definíem la velocitat de rotació dels LED amb dos bucles, un dins un altre, que es repetien 256 vegades. Ara variarem, en funció del potenciòmetre, el nombre de cops que es repeteix el bucle exterior.
A l'Exemple RL el bucle començava amb la variable a zero i s'anava restant (255, 254, 253, etc.) fins arribar altre cop a zero. Ara el valor llegit al potenciòmetre estarà entre 0 i 255. Si recordem que el bucle intern és de 771 μs, les durades que correspondrien a cada valor de la lectura del potenciòmetre serien:
| Valor | Cicles | Durada |
| 0 | 256 | 256 * 771 μs = 197,4 ms |
| 1 | 1 | 1 * 771 μs = 0,7 ms |
| 2 | 2 | 2 * 771 μs = 1,5 ms |
| ... | ... | ... |
| 254 | 254 | 254 * 771 μs = 195,8 ms |
| 255 | 255 | 255 * 771 μs = 196,6 ms |
I ens trobem que a l'extrem hi ha un valor que no encaixa i ens donaria un efecte visual estrany. Per evitar aquest problema, a la lectura del conversor li sumem 1. També ens trobem que el cicle mínim és de 0,7 ms que és molt poc. Per això, després dels cicles variables, farem un cicle fix de 10 ms (13 iteracions del bucle llarg).
El programa serà el següent:
PROCESSOR 16F690 #include <xc.inc> config FOSC = INTRCIO, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF config CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF
Retard1 EQU 0x20 ; Definim dues variables de comptatge Retard2 EQU 0x21 Visualit EQU 0x22 ; I una variable on guardem el que mostraran els LED
PSECT code, class=CODE, delta=2, abs ; A l'inici de la memòria
main:
bsf RP0 ; Tria el banc 1
movlw 0xFF ; Posa l'acumulador a FFh (tot uns)
movwf TRISA ; Posa tots els bits del port A com a entrada
clrf TRISC ; Posa tots els bits del port C com a sortida
movlw 00010000B
movwf ADCON1 ; Posa el conversor a 1/8 de la freqüència
bcf RP0
bsf RP1 ; Tria el banc 2
movlw 00000001B
movwf ANSEL ; Posa AN0 com entrada analògica
bcf RP0
bcf RP1 ; Tria el banc 0
movlw 00000001B ; activa el conversor A/D connectat a AN0
movwf ADCON0 ; amb el resultat justificat per l'esquerra
movlw 00001000B ; Activa el bit 3
movwf Visualit ; Ho copia sobre la variable Visualit
Bucle:
movf Visualit,w ; Copia la variable Visualit a l'acumulador
movwf PORTC ; Copia el resultat sobre els LED
nop ; espera un microsegon
nop ; espera un microsegon
nop ; espera un microsegon
nop ; espera un microsegon
nop ; espera un microsegon
bsf GO_DONE ; Inicia la conversió
btfsc GO_DONE ; Quan el bit sigui 0 la conversió haurà acabat
goto $-1 ; repetim la línia fins que deixi de ser 0
movf ADRESH,w ; Copia els bits superiors a l'acumulador
addlw 1 ; Li suma 1 i tenim la durada variable del cicle
movwf Retard2 ; Ho copia a la variable Retard2
RetVar:
decfsz Retard1,f ; Decrementa la variable 1
; si dona zero, no es fa la instrucció següent
goto RetVar ; Salta, excepte si el resultat ha estat zero
decfsz Retard2,f ; Decrementa la variable 2
goto RetVar ; Salta, excepte si el resultat ha estat zero
movlw 13 ; El punt indica que es un valor decimal
movwf Retard2 ; Comença un altre cicle de durada fixa (10 ms)
Ret10ms:
decfsz Retard1,f
goto Ret10ms
decfsz Retard2,f
goto Ret10ms
Rotar:
bcf CARRY ; posa a zero el bit d'arrossegament
rrf Visualit,f ; Fa rodar els bits cap a la dreta
; el bit d'arrossegament entra per l'esquerra
; i el bit de la dreta passa a l'arrossegament
btfsc CARRY ; Comprova si s'ha activat l'arrossegament
; Si no s'ha activat, salta una instrucció
bsf Visualit,3 ; Si s'ha activat, torna a posar un 1 (0000 1000)
goto Bucle ; Repetim-ho...
END main

Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.