Hola moonsakura!
También soy estudiante de teleco, en la UMH, y mi profesor Sistemas Electronicos Digitales me dijo una vez que si todos sus alumnos fuesen como yo, él se quedaría sin trabajo...jajaja
Antes que nada quiero decirte que te podemos ayudar, te podemos hacer todo el trabajo, pero supongo que en examen aparecerá un ejercicio similar, así que si quieres aprobar deberás coger soltura, y eso se coge escribiendo y depurando programas...Pero si no hay examen y quieres entregar el trabajo sin haberlo leído, por mi ningún problema...
Lo primero es definir correctamente el funcionamiento de la aplicación, seria interesante obtener un organigrama del programa a partir de las especificaciones que aparecen en el PDF. Ademas del funcionamiento, es importante saber como se van a recibir los datos del sensor y como se van a escribir en el display.
Después hay que hacer una primera implementacion general, sin centrarse en detalles, y para eso lo mas facil es hacerlo en C. Si queremos el programa en ensamblador lo podremos traducir a mano si tenemos cerca el juego de ¿35? instrucciones del PIC. Aunque vayas a trabajar en ensamblador, recomiendo que lo hagas primero en C, siempre que tengas una base mínima de C.
Y ya puedes entregar la practica!
Diagrama de flujo del programa
Código en de del programa
unsigned char leePuntuacion( ){ // Lee la puntuación de los 5 primeros bits del PORTA
TRISA |= 0x1F;
return PORTA & 0x1F;
}
void muestraContador( unsigned char v ){ // Muestra el contador en los 8 bits del PORTB
TRISB &= 0;
PORTB = v;
}
int main(){
unsigned char contador = 201;
unsigned char puntuacion = 0;
while( contador != 0 ){
puntuacion = leePuntuacion();
if( contador >= puntuacion )
contador -= puntuacio;
muestraContador( contador );
}
muestraContador( 255 );
while(1);
return 0;
}
Una vez tenemos el código en C, podemos compilarlo directamente con el PICC Lite que viene como el MPLAB o podemos ir "incrustando" el equivalente en ensamblador.
Código en ensamblador del programa
list p=16f84
#include <p16f84.inc>
CBLOCK 0x020
temp0
contador
puntuacion
ENDC
ORG 0x000
clrf PCLATH
goto MAIN
ORG 0x100
;unsigned char leePuntuacion( ){ // Lee la puntuación de los 5 primeros bits del PORTA
leePuntuacion:
; TRISA |= 0x1F;
bsf STATUS, RP0
movlw 0x1F
iorwf TRISA,f
bcf STATUS, RP0
; return PORTA & 0x1F;
movf PORTA, w
andlw 0x1F
return
;}
;void muestraContador( unsigned char v ){ // Muestra el contador en los 8 bits del PORTB
muestraContador:
movwf TEMP0;
; TRISB &= 0;
bsf STATUS, RP0
movlw 0
andwf TRISB,f
bcf STATUS, RP0
; PORTB = v;
movwf TEMP0, w
movwf PORTB
return
;}
;int main(){
MAIN:
; unsigned char contador = 201;
movlw D'201'
movwf contador
; unsigned char puntuacion = 0;
movlw 0x00
movwf puntuacion
; while( contador != 0 ){
CLINE1:
movf contador, w
btfs? STATUS, z
goto CLINE3
; puntuacion = leePuntuacion();
call leePuntuacion
movf puntuacion
; if( contador >= puntuacion )
movf contador, w
subwf puntuacion, w
btfs? STATUS, c
goto CLINE2
; contador -= puntuacio;
movf contador
subwf puntuacion, w
movwf contador
; muestraContador( contador );
CLINE2;
movf contador, w
call muestraContador
goto CLINE1
; }
; muestraContador( 255 );
CLINE3:
movf contador, w
call muestraContador
; while(1);
goto $-1;
; return 0;
nop
;}
END
Este código no funciona, pero solo es cuestión de introducirlo cacho a cacho en el MPLAB para corregirlo.
Si necesitas saber exactamente como comparar dos números en ensamblador, o necesitas una plantilla .ASM inicial, te recomiendo que descargues el Code Module Library de Microchip. Es un programa que muestra rutinas pre-escritas y listas para ser utilizadas en PIC.
Sobre como pintar un dato en el display de 7 segmentos... depende un poco de como quieras hacerlo. Si solo dispones de un display de 7 segmentos y quieres mostrar el numero 201, tendras que mostrarlo "secuencialmente", primero las centenas, decenas, unidades y pausa... Lo más fácil es que busques en la red varias rutinas para controlar un display de 7 segmentos e intentes copiar la más sencilla que veas. Puedes buscar por
http://www.microchipc.com/ o
http://www.piclist.com/ .
Sobre como leer el dato de la puntuación... ten en cuenta que este dato solo debe ser medido una vez por tirada. Para no restar dos veces la puntuación de una tirada es necesario esperar a que el dato se borre (PORTA==0) dentro de la función leePuntuacion.
y ya no se me ocurre más que decir.
Espero te sirva de mucha ayuda.
Saludos