PicManía by RedRaven
 

Búsqueda personalizada

 

EL RINCÓN DEL ENSAMBLADOR

 
 


Ideas, Rutinas y algo más

 
 


Juego de Instrucciones ASM para PICS
 

 
  Hay solo 10 tipos de personas, las que entienden el código binario, y las que no. (Roc364 en Foro Microcontroladores Todopic)
 

 

Índice de Rutinas:
 
  • Rutina de DELAY para hacer que nuestro micro espere exactamente lo que deseamos.
  • Bin2BCD para enviar nuestros bytes a los Displays de 7 segmentos.
 
 
 
 
 
 
 

 


DELAY
 
  • Para hacer que nuestro micro espere exactamente lo que deseamos. Podemos llamar directamente a cada uno de los retardos predefinidos como Del10 para esperar 10 milisegundos o cargar w y llamar a la rutina DELAY general.
     
  • Todos los tiempos en milisegundos para un cristal de 4 Mhz.
Como podéis ver es fácil hacer los cálculos para comprobar cuanto tiempo se emplea en cada bucle y poder así crear los múltiplos o submúltiplos que necesitéis.
 

 

  1ª parte: en la RAM hacen falta tres variables tal como sigue:  
 

       cblock 0x20     ;Comienzo de los registros de propósito general
;RAM en el Bank0                      count1        ;Usado en la rutina Delay
          counta        ;idem
          countb        ;idem
      endc
      ...
 
 
 

 

 
  2ª parte: La rutina DELAY tal como queda:  
 
 
Del0    retlw 0x00      ;delay 0mS 
      - vuelve inmediatamente
Del1    movlw d'1'      ;delay 1mS
        goto Delay
Del5    movlw d'5'      ;delay 5mS
        goto Delay
Del10   movlw d'10'     ;delay 10mS
        goto Delay
Del20   movlw d'20'     ;delay 20mS
        goto Delay
Del50   movlw d'50'     ;delay 50mS
        goto Delay
Del100  movlw d'100'    ;delay 100mS
        goto Delay
Del250  movlw d'250'    ;delay 250 ms
Delay   movwf count1

d1      movlw 0xC7      ;delay 1mS
        movwf counta
        movlw 0x01
        movwf countb
Delay_0
        decfsz counta, f
        goto $+2
        decfsz countb, f
        goto Delay_0
        decfsz count1 ,f
        goto d1
        retlw 0x00
 
 

 

 

 

 


SELECCIONAR un BYTE mediante su OFFSET
 
  • El objetivo de esta rutina consiste en poder cargar el registro W (el acumulador) con un valor determinado extraído de una tabla ordenada pasándole únicamente el offset o índice del valor que deseamos. (Como ejemplo muy clarificador os propongo el que se muestra en el Experimento 7 Segmentos donde debemos seleccionar la configuración de bits a enviar para dibujar cada número de 0 a F en un Display de 7 segmentos)
     

  • Este método aprovecha que la instrucción addwf PCL,f  incrementa el registro PCL, el Byte Low del Program Counter, con el valor cargado previamente en W y de este modo la ejecución del programa salta tantas posiciones como hayan sido sumadas. Este es el salto relativo que provoca el retorno de la rutina mediante la instrucción retlw seleccionada que además sirve para cargar W con el valor definido en cada una de ellas.
     
  • Elegante, hermoso, rápido y sencillo. Me gusta.
 
     
  ...

   movlw 0x5            ;Cargo en W Offset o Índice del Byte a cargar
                        ;(por ejemplo el nº5)
   Call Selecciona 
                        ;A partir de aquí el contenido de W es b'01101101'

...


Selecciona
   addwf PCL,f           ;Sumo el Offset cargado al Program Counter (Low byte)
                         ;para saltar al retorno que me interesa
   retlw b'00111111'     ;índice = 0
   retlw b'00000110'     ;índice = 1
   retlw b'01011011'     ;índice = 2
   retlw b'01001111'     ;índice = 3
   retlw b'01100110'     ;índice = 4
   retlw b'01101101'     ;índice = 5
   retlw b'01111101'     ;índice = 6
   retlw b'00000111'     ;índice = 7
   retlw b'01111111'     ;índice = 8
   retlw b'01100111'     ;índice = 9
   retlw b'01110111'     ;índice = A
   retlw b'01111100'     ;índice = B
   retlw b'00111001'     ;índice = C
   retlw b'01011110'     ;índice = D
   retlw b'01111001'     ;índice = E
   retlw b'01110001'     ;índice = F
 

 
 

 

 

 

 


Bin2BCD
 
   Cuando queremos utilizar uno de esos drivers para Displays de 7 segmentos que solo aceptan datos en BCD se impone una rutina que nos convierta nuestro byte en tan estrambótico Binary Code Decimal.
 
   Ahí os dejo un par de ellas:
 
 
Bin2BCD (1):
 
 
 
  cblock 0x20 ;RAM en el Bank0
    l_digit
    h_digit
    valor
  endc


B2BCD
  CLRF h_digit
  MOVF valor,W
  SUBLW 09
  BTFSC 03.0
  GOTO B2BCD2
B2BCD1
  MOVLW 0A
  SUBWF valor,F
  INCF h_digit,F
  MOVF valor,W
  SUBLW 09
  BTFSS 03.0
  GOTO B2BCD1
B2BCD2
  MOVF valor,W
  MOVWF l_digit
  RETLW 00
 
 
 

 

 

 

 
Bin2BCD (2):
 
 
 
  cblock 0x20 ;RAM en el Bank0
    CENT
    MSD
    LSD
  endc



BIN2BCD
  CLRF CENT ;CENTENAS
  clrf MSD ;DECENAS
  movwf LSD ;UNIDADES
  gtenth movlw .10
  subwf LSD,W
  BTFSS STATUS,C
  goto OVERHAUL
  movwf LSD
  incf MSD, F
  goto gtenth
OVERHAUL
  MOVLW .10
  SUBWF MSD,W
  BTFSS STATUS,C
  GOTO OVER
  MOVWF MSD
  INCF CENT,F
  GOTO OVERHAUL
OVER
  RETLW 0
 
 
 

 

 

 

 

 

 

Esta página se modificó el 27/12/2008


Esta página usa la letra Ñ

Nota pública importante sobre las consultas al Webmaster de PicManía.


Sugerencias a Picmanía... (que serán leídas pero seguramente no podrán ser contestadas)

Esta página pertenece al grupo de páginas de Diego RedRaven

 

 



Nota: Esta página Web esta repleta de imágenes, textos, logotipos y demás material extraídos de los mas variados medios de los que no soy ni autor ni depositario de los correspondientes derechos de autor, uso y/o reproducción. Si Ud. es depositario de dichos derechos y desea que el material correspondiente sea eliminado de esta Web no dude en ponerse en contacto conmigo mediante e-mail y será inmediatamente retirado. Gracias.
 
Visitas
Totales : 29370 Hoy: 1 Activas: 1 Vistas: 29370

Esta página fue modificada el 07-08-2010 22:42:20

           
 DmSoft WAMP Escribir Unreal