Mostrando entradas con la etiqueta lenguje asm. Mostrar todas las entradas
Mostrando entradas con la etiqueta lenguje asm. Mostrar todas las entradas
viernes, 24 de agosto de 2012

MATERIAL:

1-LCD 16x2.

LCD (pantalla de cristal líquido) es un módulo de visualización electrónica para una amplia gama de aplicaciones.Una pantalla LCD de 16x2 significa que puede mostrar 16 caracteres por línea y hay 2 líneas de este tipo. En esta pantalla cada carácter se muestra en la matriz de píxeles 5x7. Esta pantalla LCD tiene dos registros, a saber, el mando y datos.
El registro de comando almacena las instrucciones dadas al mando LCD. Un comando es una instrucción dada a LCD para realizar una tarea predefinida como inicializarla, despejando su pantalla, ajuste la posición del cursor, el control de la pantalla, etc El registro de datos almacena los datos que se muestran en la pantalla LCD. Los datos son el valor ASCII del carácter a visualizar en la pantalla LCD.

lcd 16x2

 Pin No
 Function
 Name
1
Ground (0V)
Ground
2
Supply voltage; 5V (4.7V – 5.3V)
 Vcc
3
Contrast adjustment; through a variable resistor
 VEE
4
Selects command register when low; and data register when high
Register Select
5
Low to write to the register; High to read from the register
Read/write
6
Sends data to data pins when a high to low pulse is given
Enable
7
8-bit data pins
DB0
8
DB1
9
DB2
10
DB3
11
DB4
12
DB5
13
DB6
14
DB7
15
Backlight VCC (5V)
Led+
16
Backlight Ground (0V)
Led-

1-PIC 16f84A.
1-Cristal 4MHz.
2-Capacitores cerámicos 22pF.

Circuito en proteus:


Se programo el PIC en .asm con MPLAB IDE.

PROGRAMA ASM:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 LIST        p=16F84A
        __CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC
        INCLUDE    <P16F84A.INC>
        STATUS           EQU    0X03
        PORTA            EQU    0X05
        PORTB            EQU    0X06
        TRISA            EQU    0X85
        TRISB            EQU    0X86
        LCD_LINEA1     EQU    80  
        LCD_LINEA2     EQU    0C0  
        LCD_CLR         EQU    01   
        LCD_CASA     EQU    02   
        LCD_INC         EQU    06   
        LCD_DEC         EQU    04   
        LCD_ON         EQU    0C   
        LCD_OFF         EQU    08   
        CURSOR_ON     EQU    0E   
        CURSOR_OFF     EQU    0C   
        CURSOR_PARP     EQU    0F
        LCD_IZDA     EQU    18   
        LCD_DECHA     EQU    1C   
        CURSOR_IZDA     EQU    10   
        CURSOR_DECHA     EQU    14   
        LCD_FUNCIÓN     EQU    38   
        LCD_CGRAM     EQU    40   
        CBLOCK 0x0D
        ENDC
        ORG    00                       
INICIO   
                bsf         STATUS,RP0
                   movlw        b'00011000'   
        movwf        TRISA       
        clrf        TRISB       
        bcf             STATUS,RP0               
        clrf        PORTA       
        clrf        PORTB
        movlw        LCD_FUNCIÓN   
        call        LCD_COMANDO   
        call        PAUSA_5ms   
        movlw        LCD_FUNCIÓN   
        call        LCD_COMANDO   
        call        PAUSA_5ms   
        movlw        LCD_FUNCIÓN   
        call        LCD_COMANDO   
        call        PAUSA_5ms   
        movlw        LCD_CLR       
        call        LCD_COMANDO   
        movlw        LCD_INC       
        call        LCD_COMANDO   
        movlw        LCD_ON       
        call        LCD_COMANDO   
        movlw        80       
        call        LCD_COMANDO   
ver
                               
        movlw    80
        call    LCD_COMANDO
            movlw    'B'
        call    LCD_CARACTER       
        movlw    'L'           
        call    LCD_CARACTER       
        movlw    'O'                        
        call    LCD_CARACTER       
        movlw    'G'                    
        calL    LCD_CARACTER
        movlw    ' '                    
        calL    LCD_CARACTER               
        movlw    'R'
        call    LCD_CARACTER       
        movlw    'O'           
        call    LCD_CARACTER       
        movlw    'B'                        
        call    LCD_CARACTER       
        movlw    'O'                    
        calL    LCD_CARACTER       
        movlw    'T'           
        call    LCD_CARACTER
        movlw    ' '           
        call    LCD_CARACTER
        movlw    'R'           
        call    LCD_CARACTER       
        movlw    'H'           
        call    LCD_CARACTER               
        movlw    0C0
        call    LCD_COMANDO
             movlw    'E'
        call    LCD_CARACTER       
        movlw    'L'           
        call    LCD_CARACTER       
        movlw    'E'                        
        call    LCD_CARACTER       
        movlw    'C'                    
        calL    LCD_CARACTER
        movlw    'T'                    
        calL    LCD_CARACTER               
        movlw    'R'
        call    LCD_CARACTER
        movlw    'O'                        
        call    LCD_CARACTER       
        movlw    'N'                    
        calL    LCD_CARACTER
        movlw    'I'                    
        calL    LCD_CARACTER               
        movlw    'C'
        call    LCD_CARACTER
                movlw    'A'
        call    LCD_CARACTER
        sleep   
subrutinas      
          CBLOCK
        CONTA1
        CONTA2
        GUARDA_CARÁCTER
        ENDC
PAUSA_5ms   
                movlw        7
        movwf        CONTA2       
        clrf        CONTA1       
RETRASO1   
                decfsz        CONTA1,1   
        goto        RETRASO1   
        decfsz        CONTA2,1   
        goto        RETRASO1   
        return               
LCD_COMANDO   
                clrf        PORTA       
        movwf        PORTB       
        call        LCD_CHEQUEA
        goto        LCD_HABILITA
LCD_CARACTER
        clrf    PORTA           
        call    LCD_CARÁCTER_ESPECIAL
        movwf    PORTB           
        call    LCD_CHEQUEA       
        bsf     PORTA,0               
        goto    LCD_HABILITA       
LCD_CARÁCTER_ESPECIAL
        movwf    GUARDA_CARÁCTER       
        sublw    'ñ'            
        btfss    STATUS,Z       
        goto    LCD_EÑE_MAYÚSCULA   
        movlw    b'11101110'       
        movwf    GUARDA_CARÁCTER   
        goto    LCD_FIN_CARACTER_ESP   

LCD_EÑE_MAYÚSCULA
        movfw    GUARDA_CARÁCTER       
        sublw     'Ñ'            
        btfss       STATUS,Z       
        goto       LCD_GRADO       
        movlw    b'11101110'       
        movwf    GUARDA_CARÁCTER       
        goto       LCD_FIN_CARACTER_ESP   
LCD_GRADO
        movfw    GUARDA_CARÁCTER       
        sublw      'º'           
        btfss      STATUS,Z           
        goto       LCD_FIN_CARACTER_ESP   
        movlw    b'11011111'       
        movwf    GUARDA_CARÁCTER       

LCD_FIN_CARACTER_ESP
        movfw    GUARDA_CARÁCTER   
        return           
LCD_CHEQUEA           
        bsf         STATUS,RP0               
        movlw        0FF       
        movwf        TRISB       
        bcf         STATUS,RP0           
        bcf         PORTA,0           
        bsf         PORTA,1           
BUCLE       
        bsf         PORTA,2               
        movf        PORTB,0       
        bcf         PORTA,2               
        addlw        84   
        btfsc        STATUS,C        
        goto        BUCLE       
        bsf         STATUS,RP0               
        clrf        TRISB       
        bcf         STATUS,RP0               
        bcf         PORTA,1       
        return       
LCD_HABILITA   
        bsf         PORTA,2               
        nop               
        bcf         PORTA,2               
        return
        END   
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SIMULACION EN PROTEUS:



PCB:

Vista real del PCB.

DESCARGA SIMULACION, PCB, HEX:






domingo, 15 de julio de 2012

MATERIAL:

1-L293D. 
driver para cambio de giro

1- Motor Bipolar 24v.

Motor bipolar 24v
1- PIC 16f84a.
1- Crystal 4Mhz.
2- Capacitores cerámicos de 22pf.
2- Resistores de 10k.
2- Push button.

Un motor paso a paso gira en función de una  secuencia de pulsos aplicados a sus devanados. El eje del motor gira un determinado ángulo por cada impulso de entrada. Los incrementos de rotación o pasos se miden en grados.

Motor Bipolar
De este motor salen cuatro hilos conectados al circuito del control, que realiza la función de cuatro interruptores electrónicos dobles, se pueden obtener las secuencias para que el motor gire de un lado o del otro.

L293D 
Vccs2 es el voltaje del motor, EN 1,2,3,4 poner a 1.

Circuito simulado en proteus:


Giro a la derecha 
Half step
Modo medio paso, el rotor avanza medio paso por cada pulso de exitacion. presenta como principal ventaja una mayor resolucion de paso.

control de un motor bipolar

Al presionar los dos pushbutton se activa este modo.

Giro a la izquierda 
Modo paso completo, avanza un paso por cada pulso de exitacion.


Al presionar el primer pushbutton se activa este modo.

Video de la simulación Proteus:


 


Programa en asm.

__CONFIG _CP_OFF&_WDT_OFF&_PWRTE_ON&_XT_OSC

        LIST P=16F84A

        INCLUDE<P16F84A.INC>

cblock

endc

status  equ  0x03

porta   equ  0x05

portb   equ  0x06

trisa   equ  0x85

trisb   equ  0x86

org 0

inicio

     bsf   status,5

     bsf   porta,0

     bsf   porta,1

     clrf  portb

     bcf   status,5

  

activar

     btfss porta,0

     goto  giro

     clrf  portb

     goto  fin

giro

     btfsc porta,1   

     goto  izq_z

     call  der

     goto  fin

izq_z

     call  izq

fin

     goto  activar

izq

     movlw b'00000101'

     movwf portb

     call  Retardo_20ms

     movlw b'00000110'

     movwf portb

     call  Retardo_20ms

     movlw b'00001010'

     movwf portb

     call  Retardo_20ms


     movlw b'00001001'

     movwf portb

     call  Retardo_20ms

     return

   

der

     movlw b'00001001'

     movwf portb

     call  Retardo_20ms

     movlw b'00001000'

     movwf portb

     call  Retardo_20ms

     movlw b'00001010'

     movwf portb

     call  Retardo_20ms

     movlw b'00000010'

     movwf portb

     call  Retardo_20ms

     movlw b'00000110'

     movwf portb

     call  Retardo_20ms

     movlw b'00000100'

     movwf portb

     call  Retardo_20ms

     movlw b'00000101'

     movwf portb

     call  Retardo_20ms

     movlw b'00000001'

     movwf portb

     call  Retardo_20ms

     return

     INCLUDE <retardos.inc>

    end

Para aumentar o disminuir el tiempo del disparo utilizar los tiempos de la librería de retardos.

DESCARGAR SIMULACION,  ASM Y HEX:



REFERENCIAS:  

  • Microcontrolador 16f84 desarrollo de proyectos, pag.  481-504
 
sábado, 16 de junio de 2012

SUBRUTINA

Es un conjunto de instrucciones al que se tiene acceso desde cualquier tipo del programa principal. es decir una subrutina es un subprograma que se ejecuta cada vez que el programa principal lo necesite.

call    xxxx  // llamado de la subrutina xxxx.

xxxxx
.......
........
........
return       // se sale de la subrutina y retorna al programa principal.

LIBRERÍAS CON SUBRUTINA DE RETARDO

En la mayoría de los proyectos es necesario controlar el tiempo es por  eso que los retardos son probablemente las subrutinas mas utilizadas dentro los programas.

Para calcular el tiempo checar pag. 170 del libro microcontrolador 16f84a.

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
realice la librería del mismo libro:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CBLOCK
     R_ContA
     R_ContB
     R_ContC
     ENDC
Retardo_10micros
          nop
          nop
          nop
          nop
          nop
Retardo_5micros
          nop
Retardo_4micros
          return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;RETARDOS de 20 hasta 500 microsegundos
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;,;;;
Retardo_500micros
          nop
          movlw  d'164'
          goto   RetardoMicros
Retardo_200micros
          nop
          movlw  d'64'
          goto   RetardoMicros
Retardo_100micros
          movlw  d'31'
          goto   RetardoMicros
Retardo_50micros
          nop
          movlw  d'14'
          goto   RetardoMicros
Retardo_20micros
          movlw  d'5'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RetardoMicros
          movwf  R_ContA
Rmicros_Bucle
          decfsz R_ContA,F
          goto   Rmicros_Bucle
          return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;RETARDOS de 1ms hasta 200ms
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Retardo_200ms
          movlw  d'200'
          goto   Retardos_ms
Retardo_100ms
          movlw  d'100'
          goto   Retardos_ms
Retardo_50ms
          movlw  d'50'
          goto   Retardos_ms
Retardo_20ms
          movlw  d'20'
          goto   Retardos_ms
Retardo_10ms
          movlw  d'10'
          goto   Retardos_ms
Retardo_5ms
          movlw  d'5'
          goto   Retardos_ms
Retardo_2ms
          movlw  d'2'
          goto   Retardos_ms
Retardo_1ms
          movlw  d'1'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Retardos_ms
          movwf  R_ContB
R1ms_BucleExterno
          movlw  d'249'
          movwf  R_ContA
R1ms_BucleInterno
          nop
          decfsz R_ContA,F
          goto   R1ms_BucleInterno
          decfsz R_ContB,F
          goto   R1ms_BucleExterno
          return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;RETARDOS de 0.5 hasta 20 segundos
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Retardo_20s
          movlw  d'200'
          goto   Retardo_1Decima
Retardo_10s
          movlw  d'100'
          goto   Retardo_1Decima
Retardo_5s
          movlw  d'50'
          goto   Retardo_1Decima
Retardo_2s
          movlw  d'20'
          goto   Retardo_1Decima
Retardo_1s
          movlw  d'10'
          goto   Retardo_1Decima
Retardo_500ms
          movlw  d'5'
Retardo_1Decima
          movwf  R_ContC
R1Decima_BucleExterno2
          movlw  d'100'
          movwf  R_ContB
R1Decima_BucleExterno
          movlw  d'249'
          movwf  R_ContA
R1Decima_BucleInterno
          nop
          decfsz R_ContA,F
          goto   R1Decima_BucleInterno
          decfsz R_ContB,F
          goto   R1Decima_BucleExterno
          decfsz R_ContC,F
          goto   R1Decima_BucleExterno2
          return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Lo guarde con la terminación .INC lo cual indica que es una librería.

TEMPORIZADOR 0-9 SEGUNDOS

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 __CONFIG _CP_OFF&_WDT_OFF&_PWRTE_ON&_XT_OSC
        LIST P=16F84A
        INCLUDE<P16F84A.INC>
        CBLOCK  0x0E
        ENDC
status  equ  0x03
porta   equ  0x05
portb   equ  0x06
trisa   equ  0x85
trisb   equ  0x86
        org  0
inicio
      bsf   status,5
      clrf  trisb
      movlw b'11111'
      movwf trisa
      bcf   status,5
      clrf  portb
ini
      movlw b'00111111'
      movwf portb
          
principal
      btfsc porta,0
      goto  principal
      call  Retardo_10micros
      btfsc porta,0
      goto  principal
      goto  activar
deje
      btfss porta,0
      goto  deje
      goto  principal
activar
      call  Retardo_1s           ; llamado de la subrutina del retardo 1 segundo la cual se encuentra en la librería.
      movlw    b'0000110'    ; 1  
      movwf portb
      call  Retardo_1s
      movlw    b'1011011'    ; 2  
      movwf portb
      call  Retardo_1s         
         movlw    b'1001111'    ; 3
      movwf portb
      call  Retardo_1s  
      movlw    b'1100110'    ; 4
      movwf portb
      call     Retardo_1s
      movlw    b'1101101'    ; 5  
      movwf portb
      call  Retardo_1s
      movlw    b'1111101'    ; 6  
      movwf portb
      call  Retardo_1s
      movlw    b'0000111'    ; 7
      movwf portb
      call  Retardo_1s  
      movlw    b'1111111'    ; 8  
      movwf portb
      call  Retardo_1s
      movlw    b'1101111'    ; 9
      movwf portb
      call  Retardo_1s
      goto  ini
      INCLUDE <retardos.inc>  ;  se incluye la librería de retardos en el programa principal.
      END

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 

MATERIAL: 

1- Pushbutton.
1- Resistor de 10k.
1- Display 7 segmentos ánodo común.
1- Pic 16f84a.
1- Cristal de 4Mhz.
2- Capacitores cerámicos de 22pf.
7- Resistores de 220.

SIMULACIÓN:



  Se necesita apretar el push para que empiece el conteo.


VIDEO DE LA SIMULACION:


En el ejemplo nadamas se utilizo la subrutina de un segundo pero de la misma forma se pueden mandar a llamar cualquier subrutina de la librería o se pueden ir anidando.
Se puede incluir la librería al realizar un proyecto en mplab o copiar la librería en la misma carpeta en que vas a guardar tu programa principal(.asm).

DESCARGAR LIBRERÍA Y PROGRAMA SIMULADO EN PROTEUS:









jueves, 3 de mayo de 2012
Esta practica nos indica como utilizar una tabla en el pic 16f84a
Através de la combinacion del puerto b se realizan los números en un display de 7 segmentos(0-7).

Tabla de verdad.
 
A2
A1
A0
B7
B6
B5
B4
B3
B2
B1
B0
0
0
0
0
0
1
1
1
1
1
1
0
0
1
0
0
0
0
0
1
1
0
0
1
0
0
1
0
1
1
0
1
1
0
1
1
0
1
0
0
1
1
1
1
1
0
0
0
1
1
0
0
1
1
0
1
0
1
0
1
1
0
1
1
0
1
1
1
0
0
1
1
1
1
1
0
1
1
1
1
0
0
0
0
0
1
1
1

 Programa :
status equ    0x03
porta  equ    0x05
portb  equ    0x06
trisa  equ    0x85
trisb  equ    0x86
pcl    equ    0x02
       org    0
inicio
       bsf    status,5
       movlw  b'11111'
       movwf  trisa        //configura porta como entrada
       clrf   trisb           //configura portb como salida
       bcf    status,5
principal
       movf   porta,w
       andlw  b'00111'  //utilizan los tres bits menos significativos de porta , a0, a1, a2
       call   tabla          //llamado a la subrutina tabla
       movwf  portb    //se muestra el valor de la tabla por el puerto b
       goto   principal  //buncle infinito
tabla
       addwf  pcl,f              //salto indexado(se posiciona en el valor requerido)
       retlw  b'00111111'    // 0
       retlw  b'00000110'   // 1
       retlw  b'01011011'   // 2
       retlw  b'01001111'   // 3
       retlw  b'01100110'   //4
       retlw  b'01101101'  //5
       retlw  b'01111101'  //6
       retlw  b'00000111'  //7
       return                     //retorna a la rutina principal
       end

Si porta es 010 addwf se posiciona en la tercera linea (01011011) y rtlw extrae ese dato y se retorna al programa principal el cual muetra el dato seleccionado por el puerto b(movwf portb).

Se pueden realizar todos los números del display de 7 segmentos pero tendríamos que aumentar a 3 para tener mas combinaciones posibles es decir los cuatro bits mas significativos.
.
 Circuito en proteus.



 Combinacion en porta(00001) y se activa en portb(00000110).


Combinacion en porta(00101) y se activa en portb(01101101).



Para simular en proteus el pic, abrir la simulacion, dar doble clic en el símbolo del pic, en program file dar clic en la carpeta y seleccionar el .hex de la carpeta que bajaron y configurar en clock frequency 4MHz.

Video de la simulacion:

 

Material:
1- Pic 16f84a.

1-Display 7 segmentos cátodo común.


1-Dip switch 4

1-Cristal 4Mhz.
2-Capacitores electroliticos 22pf.
3-Resistencias de 10k.
2-Resistencias de 220 (van en los comunes del display).

DESCARGAR SIMULACION Y PROGRAMA:



SIGUEME EN FECEBOOK

MI TWITTER

Translate