¿Cómo mejorar este dado electrónico? (MC9S08SE8, Ensamblador)

#1
Mi nombre es Gerardo Martínez, soy alumno de FIME de la UANL (1400769)
El siguiente programa es de mi total autoría, no es copy paste de ningún sitio o persona.
Si tomas el programa para usarlo en mi facultad, ten en cuenta que reclamaré la autoría del mismo mediante la fecha de este post.

El dado debe de cumplir las siguientes características

  1. Cuando se presione un interruptor el dado elegirá un número al azar del 1 al 6 y lo mostrará en un display de 7 segmentos
  2. (Modo de espera) Mientras el interruptor no esté accionado, todos los segmentos del display se iluminaran de uno por vez, (excepto el segmento g)

Hasta el momento he hecho lo siguiente:

PHP:
LDHX   #RAMEnd+1        ; initialize the stack pointer
            TXS
            CLI                              ; enable interrupts
            MOV #$FF,PTCDD          ;Todo puerto C como salida
            BCLR 5,PTBDD               ;Bit 5 puerto B como entrada
            LDA #1
            STA PTBPE                  ;Habilito resistencia Pull-up del puerto B      

mainLoop:
SW≈≈BRSET 5,PTBD,UNO ≈≈aqui checo si la entrada 5 es 0 o 1, si es 0 salta a la 
              MOV $83,PTCD≈≈≈≈≈etiqueta uno, cuando detecte un uno continuara al 
              BRSET 0,PTBD,SW≈≈≈siguiente renglon de programa. el tercer renglon, vuelve a                         
≈≈≈≈≈≈≈≈≈≈≈≈≈≈checar el estado de la entrada, para continuar con el modo 
≈≈≈≈≈≈≈≈≈≈≈≈≈≈modo de espera                  
UNO≈≈JSR TRES
               BRA SW                    
            
TRES≈≈MOV #$05,PTCD≈≈este es el modo de espera, #$05 enciende el segmento a y los   
              JSR TIME≈≈≈≈≈≈demás apagados, #$06 enciende el segmento b y así  
              JSR DOS≈≈≈≈≈≈≈sucesivamente. la subrutina time es el retardo de tiempo,
              MOV #$06,PTCD≈≈antes de encender el siguiente segmento, la etiqueta dos
              JSR TIME≈≈≈≈≈≈es la subrutina para encender los segmentos del 1 al 6 en el
              JSR DOS≈≈≈≈≈≈display.
              MOV #$0C,PTCD
              JSR TIME
              JSR DOS
              MOV #$14,PTCD
              JSR TIME
              JSR DOS
              MOV #$24,PTCD
              JSR TIME
              JSR DOS
              MOV #$44,PTCD
              JSR TIME
              JSR DOS
              RTS 
           
DOS ≈≈MOV #$0A,$83≈≈≈#$0A enciende los segmentos b y c para formar el 1, el 
              BRSET 5,PTBD,SW≈#$B3 enciende los segmentos para formar y el y asi
              MOV #$B3,$83≈≈≈sucesivamente.
              BRSET 5,PTBD,SW≈≈entre cada valor para encender el numero 1 al 6, hay un 
              MOV #$9B,$83≈≈≈≈chequeo para ver el estado de la entrada del push button
              BRSET 5,PTBD,SW≈≈y saltar a la etiqueta sw, y mover del registro 83 el valor que
              MOV #$CA,$83≈≈≈≈en ese momento se encuentre a la salida del puerto C
              BRSET 5,PTBD,SW
              MOV #$D9,$83
              BRSET 5,PTBD,SW
              MOV #$F8,$83
              BRSET 5,PTBD,SW
              RTS
            
                      
TIME ≈≈MOV #$EF,$81
L2 ≈≈MOV #$EF,$82
L1≈≈≈DBNZ $82,L1
              DNZ $81,L2
              RTS
Así tal cual está el programa, no me responde como yo explico, pues pareciera que hay alguna interferencia o rebote, pues aveces si hace todo el ciclo de encender todos los LEDs, a veces no, y siempre me muestra el numero 6.
Otra manera en la cual lo tenía, era un JSR DOS inmediatamente después del JSR TRES, (sin los 6 JSR DOS que están en toda la subrutina TRES) y de este no presenta ese rebote o interferencia en el display, pero igualmente sólo me muestra el numero 6.

No sé si estoy aplicando bien el pulso del pulsador, pues hace un par de días pensé en usar el VDD para de ahí meter el valor alto al pin 11 (es el pin 5 del puerto B según la hoja de datos) y quemé el microprocesador.
Hoy el interruptor lo pongo del pin 11 a VSS, de este modo es como estoy deteniendo el dado y no parece calentarse el microcontrolador.

Otra cosa que noté, pareciera un error esta parte o tal vez si lo sea:
Código:
SW          BRSET 5,PTBD,UNO
            MOV $83,PTCD
            BRSET 0,PTBD,SW
Pero si aquí escribo el 5, el dado no se detiene.

Agradeceré con gusto todos sus aportes, sugerencias, correcciones o mejoras.

Dicho ésto, no sé si hay un mejor modo de hacer este programa, pues apenas llevo 2 meses involucrado en la programación de este microcontrolador, del uso de CodeWarrior y del lenguaje ensamblador.
 

Adjuntos

Última edición por un moderador:
Arriba