Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

06/04/2015 #1


¿Cómo mejorar este dado electrónico? (MC9S08SE8, Ensamblador)
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:

Código 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.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.