Autor Tema: Curso Básico AVR AT90S1200 Ensamblador  (Leído 43030 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado YF-21

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 185
Curso Básico AVR AT90S1200 Ensamblador
« en: 22 de Octubre de 2004, 14:15:00 »
Lo primero que hay que hacer es conocer a los mas pobres micros de atmel (como el 16f84 de microchip), asi que les recomiendo que se bajen el manual del AT90S1200 que es con el que estamos empezando en mi escuela y van a encontrar el pdf aqui:

AVR´s

En documentacion y luego datasheets y como verán aparecen las versiones completa y resumida (si quieren profundizar bajen la completa)

Ahora veamos un poco de lo mas sobresaliente de este modelo

32 registros
96 instrucciones
15 lineas programables E/S
Watchdog
Comparador A/D
Timer/Counter
Interrupcion externa
1Kbyte de memoria flash

(En fin, en el datasheet vienen todas mas detalladas)

Ahora, tambien les recomendaria que bajen el avrstudio (compilador-simulador para micros atmel), ahora que si solo quieren compilar y probar en proteus, es mas ligero de bajar el avr asembler (los encuentran en la pagina de atmel)

Si ya se aburrieron vayan a prepararse un chanwich y regresan porque ya vamos a empezar !!!

Bien, bien mis queridos pupilos vamos a configurar puertos como entradas y salidas (WAU QUE MARAVILLA NO??)

ahi les va el codigo:

Codigo:
.org $0000                          ;por ahora no nos importan las interrupciones
   .include "1200def.inc"   ;definicion de registros internos PORTB, etc

   ser r16                          ;pone a 0xFF el registro 16 (en ptos 1=salida)
   out ddrb, r16                ;r16 es enviado a ddrb (configura pto.b salidas)
                clr r16                           ;limpiamos el reg 16
                out ddrd, r16                ;configuramos pto.d como entradas


inicio:   in r17, pind                           ;la entrada del pto.d se va al registro 17
      andi r17, $03        ;aislamos los 2 primeros bits
   
      cpi r17, $01           ;compara el reg.17 con 01h (entrada1=1?)
      breq arran             ;si, salta a arran
   
      cpi r17, $02           ;compara el reg.17 con 01h (entrada2=1?)
      breq paro              ;si, salta a paro

      rjmp inicio              ;creo que si se entiende esto (salto incond)

arran:   ldi r18, $0F                            ;cargamos 0fh en el reg 18
      out portb, r18       ;prenden los cuatro leds de menos peso
      rjmp inicio              ;conectados en el puertob y salta a inicio

paro:   ldi r18, $00                            ;cargamos 00h en el reg 18
      out portb, r18        ;y lo sacamos por el puertob (leds off)
      rjmp inicio               ;y se va a inicio



Es importante que revisen la lista de instrucciones que viene en el pdf (completo o resumido del modelo AT90S1200) para entenderle mejor al programa.

Como ven es muy similar al ensamblador del pic (excepto por los cambios de banco).

AVER MIGSANTIAGO, EXPLICATE LOS REGISTROS INDIRECTOS Y LAS INTERRUPCIONES PORFA Sonrisa

DUDAS, PREGUNTAS ??

Desconectado YF-21

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 185
RE: Curso Básico AVR AT90S1200 Ensamblador
« Respuesta #1 en: 22 de Octubre de 2004, 14:33:00 »
Por cierto, me costó trabajo encontrar el subforo. La unica manera de verlo fue entrando a busqueda RollEyes

Miarroba ataca de nuevo ??

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: Curso Básico AVR AT90S1200 Ensamblador
« Respuesta #2 en: 22 de Octubre de 2004, 19:27:00 »
Pues creo que te fuiste muy rápido YF-21.

Antes que nada... pueden encontrar este curso completo de AVR AT90S1200 aquí:

http://migsantiago.x10hosting.com/index.php?option=com_content&view=article&id=1&Itemid=5

Paso 1
¿Qué significa AVR?

Pues según ATMEL, sólo es un nombre que se sacaron de la manga. Algunos dicen que significa Advanced Virtual Risc. Otros dicen que lleva las iniciales de los inventores de los AVR: Alf Egil Bogen and Vegard Wollan... AlfVegardRisk. Ya saben Reduced Instruction Set Computer es lo de RISC.

Les queda de tarea que investiguen que significa PIC Muchas risas

Paso 2
Bajen el compilador de AVR, el AVR Studio, que es algo así como MPLAB.

http://www.atmel.com/dyn/products/tools.asp?family_id=607

Si el link cambia sólo busquen el AVR Studio más reciente en la página de ATMEL.

Paso 3
Para que sepan de que estamos hablando, bajen la hoja de características del AT90S1200.

http://www.atmel.com/dyn/resources/prod_documents/DOC0838.PDF

Sería bueno que imprimieran las páginas del set de instrucciones, del espacio de I/O y del sumario de bits de registros.

Paso 4
Bajense un generador de subrutinas de tiempo para AVR Sonrisa

http://www.home.unix-ag.org/tjabo/avr/AVRdelayloop.html

Por ahora sólo daremos YF-21 y yo una explicación básica del 1200, luego les investigamos sitios para que construyan su programador si es que les gustan los AVRs.

Agrego una comparación de integrados que hice en otro mensaje. Compararé al ATMEL AT90S1200, que es un AVR muy popular y al MICROCHIP PIC16F84... se puede decir que son los ejemplos básicos de comparación, y los microcontroladores estrella de cada compañía.

No. de instrucciones
AVR: 89 PIC: 35

Registros
AVR: 32 registros PIC: 68 RAM

Velocidad
AVR: 12MIPS (12MHz) PIC: 20MHz en donde c/inst. toma 4 ciclos de reloj en promedio

Memoria de programa
AVR: 1kByte FLASH (512 líneas de programa, 16bits por inst.) PIC:1kx14

EEPROM
AVR: 64B PIC: 64B

Salidas
AVR: 15 salidas PIC: 13 salidas

TIMER
AVR: 1 de 8bit (preescala desde CK hasta CK/1024) PIC: 1 de 8 bit (preescala desde 1:2 hasta 1:256)

Comparador analógico (NO convertidor analógico)
AVR: 1 PIC: NO

Watchdog
Ambos

Oscilador interno
Ambos, en el AVR sólo habilitable con programación paralela

Niveles de pila (STACK)
AVR: 3 PIC: 8

Interrupciones
AVR: reset, int. externa, timer y por comparador analógico PIC: sólo me acuerdo de que son 5 jeje


Me parece que el programa que YF-21 les puso está un poco avanzado como para empezar... pongamos uno más digerible Muchas risas

Antes de empezar les explico algo básico... en los AVR se tienen 3 registros para cada puerto de salida:

DDRB - Sirve para decir que patitas son de entrada o salida, 0 es entrada, 1 es salida, es inverso a los pics
PINB - Registro que sirve para entradas nadamás
PORTB - Registro que sirve de salidas nadamás

Es decir si leen, vayanse con PINB; si escriben vayanse a PORTB.

El PortB tiene 8 bits de datos, a diferencia del PORTD que tiene sólo 7. El bit 7 del PORTD no sirve Enfurruñado; PORTD también consta de 3 registros: DDRD, PORTD y PIND.

Ahora el programa sólo será un ejemplo de cómo declarar salidas en puerto B, cada segundo se incrementa un conteo binario en portb.

    Codigo:
    .include "1200def.inc"         ;librería de definiciones de registros y demás cosas

    ser r16                                ;SER pone a uno todos los bits del Registro 16
    out ddrb,r16                       ;saca R16 a DDRB, los 1 son salidas, los 0 son entradas
                                               ; que es contrario a los PIC, todo B es salida

    clr r16                                 ;pone a ceros todo r16
    ciclo:     inc r16                    ; r16 ++
                out portb,r16          ;pone r16 en portb, es decir en patitas del avr
                rcall retardo            ;llama subrutina de 1 segundo
                rjmp ciclo                ;salto incondicional a ciclo


    ; =============================
    ;    delay loop generator
    ;     4000000 cycles: es decir 1 segundo con xtal de 4MHz
    ; -----------------------------
    ; delaying 3999996 cycles:
    retardo:      ldi  R17, $24
    WGLOOP0:  ldi  R18, $BC
    WGLOOP1:  ldi  R19, $C4
    WGLOOP2:  dec  R19
              brne WGLOOP2
              dec  R18
              brne WGLOOP1
              dec  R17
              brne WGLOOP0
    ; -----------------------------
    ; delaying 3 cycles:
              ldi  R17, $01
    WGLOOP3:  dec  R17
              brne WGLOOP3
    ; -----------------------------
    ; delaying 1 cycle:
              ret
    ; =============================

Si lo quieren emular en PROTEUS, van a necesitar un xtal de 4MHz, capacitores iguales a los del 16f84 de 27uf y poner a reset a 5V.

Por ahora hasta aquí se queda la clase básica, les doy chance de que bajen todo lo que les puse arriba y le echen una leída.
« Última modificación: 28 de Febrero de 2009, 13:16:31 por migsantiago »

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: Curso Básico AVR AT90S1200 Ensamblador
« Respuesta #3 en: 27 de Octubre de 2004, 17:53:00 »
Bueno, espero que hayan analizado el programa anterior.

Ahora les dejo un programa màs avanzado, en el que se hace uso de una LCD 16x2 y en ella se muestra un conteo de 0 a 9 usando el AVR.

Antes de seguir les hago una recomendaciòn, siempre trabajen registros desde el nùmero 16 hasta el 31, ya que estos pueden ser trabajados con direccionamiento inmediato. Luego les dirè que onda con los otros del 0 al 15. :p

En el programa se ven instrucciones nuevas:

LDI R16,$38
Esta instrucciòn carga de modo inmediato el valor hexa 38 en el registro 16. Si quisieran cargar el dato decimal 10, sòlo pongan:

LDI R16,10

MOV R16,R20
Aquì el valor del R20 pasa al R16.

CPI R20,$3a
Hace una comparaciòn inmediata mediante una resta: R20 - 3A. Esto levanta banderas en el registro STATUS.

BRNE loop
Branch if Not Equal. Brinca si no es igual, es decir, si Z=0; en ese caso se va a loop.

CBI PORTD,0
Clear Bit, pone a cero un bit de algùn registro de entrada/salida. En este caso pone a cero el bit cero.

Es importante que CBI y SBI sòlo se usen en registros de entrada/salida que estèn en el rango de 00 a 1F, ya que en los demàs no funcionan. Para modificar el contenido de los demàs, serìa conveniente usar un LDI a algùn registro y luego un OUT hacia el registro e/s.

Bueno, pues les dejo el còdigo:

;MigSantiago
;Contador de 0-9 en LCD de 16x2
;RB0-RB7 son DB0-DB7
;RD0 es RS
;RD1 es E
;R20 conteo ASCII
;R17,18,19 Subrutinas tiempo

         .org 0000
         .include "1200def.inc"

;Establece E/S
         SER R16
         OUT DDRB,R16      ;portb salida
         OUT DDRD,R16      ;portd salida
         RCALL unseg         ;espera inicio de LCD 1seg

;Configura LCD
         LDI R16,$38
         RCALL instru      ;8-bit,2 líneas, 5x7
         LDI R16,$0e
         RCALL instru      ;D=1,C=1,B=0
         LDI R16,$06
         RCALL instru      ;incremento, no desplaza texto
         LDI R16,$01
         RCALL instru      ;limpia LCD

;Escritura de 0-9
cero:      LDI R20,$30         ;cero en ASCII
loop:      MOV R16,R20         ;prepara conteo ASCII a mandar
         RCALL dato         ;manda ASCII a LCD
         RCALL unseg         ;espera 1 seg
         LDI R16,$80         ;va a home
         RCALL instru      
         INC R20
         CPI R20,$3a         ;si es 3a se va a cero
         BRNE loop
         RJMP cero

;Subrutina: instrucción a LCD
instru:      CBI PORTD,0         ;RS=0
         RJMP envio
;Subrutina: dato a LCD
dato:      SBI PORTD,0         ;RS=1
         RJMP envio
;Subrutina: envía dato o inst a LCD
envio:      SBI PORTD,1         ;E=1
         OUT PORTB,R16      ;Saca R16 por B
         RCALL dosms         ;espera 2ms escritura
         CBI PORTD,1         ;E=0
         RCALL dosms         ;espera proceso
         RET

;Subrutina de 2ms
;     8000 cycles:
; -----------------------------
; delaying 7998 cycles:
dosms:     ldi  R17, $1f
WGLOOP0:  ldi  R18, $55
WGLOOP1:  dec  R18
          brne WGLOOP1
          dec  R17
          brne WGLOOP0
; -----------------------------
; delaying 2 cycles:
          nop
          ret
; =============================

;Subrutina de 1seg
;     4000000 cycles:
; -----------------------------
; delaying 3999996 cycles:
unseg:    ldi  R17, $24
WGLOOP3:  ldi  R18, $BC
WGLOOP4:  ldi  R19, $C4
WGLOOP5:  dec  R19
          brne WGLOOP5
          dec  R18
          brne WGLOOP4
          dec  R17
          brne WGLOOP3
; -----------------------------
; delaying 3 cycles:
          ldi  R17, $01
WGLOOP6:  dec  R17
          brne WGLOOP6
; -----------------------------
; delaying 1 cycle:
          ret
; =============================


Los archivos de PROTEUS para que lo emulen estàn en:

http://miarroba.com/foros/ver.php?foroid=348538&temaid=2468801



Desconectado FirmSoft

  • PIC16
  • ***
  • Mensajes: 118
RE: Curso Básico AVR AT90S1200 Ensamblador
« Respuesta #4 en: 29 de Octubre de 2004, 18:18:00 »
   Chicos, mil gracias por esto que hacen... estoy trabajando y dando mis promeros pasos con un AT90S8515 y un programador (APOLO) que encontre en internet... les agradesco infinitamente, ya que gracias a ustedes estoy entrado en el fascinante mundo de ATMEL. GRACIASSSSS!!!! PayasoFlashRebotado

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: Curso Básico AVR AT90S1200 Ensamblador
« Respuesta #5 en: 29 de Octubre de 2004, 20:13:00 »
Hey, no hay de que.

Al parecer son pocos los interesados en esto del 1200, pero tal vez después le agarren gusto a estos micros. Muchas risas

Ya luego subo el programa que hice del teclado 4x4 para explicar cómo leer datos desde el puerto B Giño

Desconectado PWRINVITRO

  • PIC12
  • **
  • Mensajes: 78
RE: Curso Básico AVR AT90S1200 Ensamblador
« Respuesta #6 en: 30 de Octubre de 2004, 23:02:00 »
En realiedad no es bueno comenzar con la serie AVR... mi intencion al querer que se abriera este subforo fue precisamente comenzar por lo basico!!!! lo basico seria conocer un poco de la historia de los micros ATMEL... es bueno saber q una de las primeras series q salio fue la serie AT8XX5X... estos microcontroladores son desendientes directos de los micros INTEL 8080 8051 etc... atmel les hizo unas pekeñas mejoras (mas memoria, mas rapidos) y los lanzo al mercado como una buena opcion economica y poderosa!!! el set de instrucciones es el mismo de los microcontroladores INTEL diseñado por INTEL y son micros CISC... set de instrucciones completo... el cual lo hace mas ventajoso aun!!! esta seri hoy en dia sigue siendo muy poderosa y nuy economica y me gustaria q inviertieramos un poco de tiempo en ella!!! una de las caracteristicas mas notables de estos micros es su capacidad para ser microconroladores y microprocesadores... y siendo tan antiguos trabajan hasta 24 mhz poseen un registro de 16 bits llamado DPTR q es super util, 3 modulos temporizadores contadores con varios modos de funcionamiento entre ellos contador temporizador de 16 bits, en modo microprocesador puede direccionar hasta 64k de memoria de programa y 64k de memoria de datos... se puede utilizar la tecnica llamada mapeo para conectar muchisimos perifericos en un bus de datos compartido, en modo microcontrolador tiene 4k de memoria de programa en una sola pagina, 4 bancos de memoria ram, os puertos de entrada salida son dinamicos, es decir no hay q configurarlos, si los lees son entrada, si los escribes son salidas, podemos asignar  un nombre a cada bit de cada registro direccionable bit a bit contamos con otra porcion mas de memoria de datos direccionable solo indirectamente... en in tiene una cantidad de virtudes q de verdad valen la pena!!! aqui les dejo un ejemplo de como configurar los puertos como entradas y como salidas y como nombrar los bits de registros, manejo de lcd y otras cosas mas!!!



$MOD51

                RS            BIT     P0.0;RENOMBRA EL BIT 0 DEL PUERTO 0
                EN            BIT      P0.1;RENOMBRA EL BIT 1 DEL PUERTO 0
                BOTON     BIT      P0.2

                ORG     0000H
                JMP      INICIO



INICIO:    MOV     SP,#2FH;COLOCA EL STACK POINTER EN EL SCRACH PAD
                LCALL   ILCD;LLAMA INICIALIZAR LCD
                MOV      DPTR,#SALUDO;CARGO EL DPTR CON LA DIRECCION SALUDO
                LCALL   VISUAL;RUTINA DE MOSTRAR MENSAJE EN LA LCD
                JNB       BOTON,INICIO;BRINCA SI BOTON ES 0 A INICIO
                JMP       $-1;SI BOTON ES UNO VUELVE A CHEQUEARLO

;RUTINA CONFIGURACION LCD

ILCD:       MOV      A,#38H;CARGA EN EL ACUMULADOR INSTRUCCION LCD
                LCALL   CTROL;ENVIA INSTRUCCION A LA LCD
                MOV      A,#06H
                LCALL   CTROL
                MOV      A,#0CH
                LCALL   CTROL
                MOV      A,#01H
                LCALL   CTROL
                RET

;RUTINA CONTOL Y DATO DE LCD

DATO:      SETB      RS;COLOCA A 1 EL PIN RS YA CONFIGURO ESE PIN COMO SALIDA
                JMP        SIGO
CTROL:    CLR        RS;COLOCA A O EL PIN RS
SIGO:      SETB      EN;COLOCA EL PIN ENABLE EN 1
               MOV       P1,A;MUEVE AL PUERTO1 DONDE ESTA LA LCD EL VALOR DE A
               LCALL     RETARDO;RETARDO PARA Q LA LCD LEA
               CLR         EN;DESHABILITA LA LCD
                RET

;RUTINA VISUAL LCD

VISUAL:   CLR       A;LIMPIA ACUMULADOR
                MOVC   A,@A+DPTR;CARGA EN A EL VALOR AL Q APUNTA DPTR
                CJNE    A,#00H,CONT;COMPARA ACUMULADOR CON 0 SI NO ES 0 SIGO
                 RET; RETORNA DE RUTINA
CONT:      MOV     P1,A;CARGA EN PUERTO 1 LO Q TIENE A
                LCALL   DATO;ENVIA EL DATO A LA LCD
                INC      DPTR;INCREMETA DPTR
                JMP      VISUAL;BRINCA DE NUEVO A VISUAL


;MENSAJES

SALUDO: DB "HOLA A TODOS",00H
           

EL DPTR ES UN REGISTRO DE 16 BITS Y ES EL APUNTADOR DE DATOS DEL MICRO SE USA PARA DIRECCIONAR INDIRECTAMENTE LA MEMORIA DE PROGRAMA DEL MICRO Y SP O EL STACK POINTER ES EL APNTADOR DE PILA A DIFERENCIA DE LOS PIC SERIE 16 LA PILA DEL 51 TAMBIEN ES DINAMICA Y PROGRAMABLE OSEA SE PUEDE PONER DE LA PROFUNDIDAD QUE UNO KIERA Y NO ES FIJA DE PROFUNDIDAD  COMO EN DICHOS PICS, EL MICRO TAMBIEN TIENE 8 FUENTES DE INTERRUPCION CADA UNA CON SU PROPIO VECTOR Y ORGANIZADAS POR PRIORIDADES!!!.... ESPERO LES GUSTE LA APLICACIONSITA Y ESTOY ABIERTO A ACLARAR TODAS LAS DUDAS Q TENGAN Y ESPERO NOS ENCAMINEMOS PRIMERO POR AKI!!!! LUEGO VENDRA LO DEMAS!! SALUDOS!!
               

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: Curso Básico AVR AT90S1200 Ensamblador
« Respuesta #7 en: 01 de Noviembre de 2004, 19:35:00 »
Todavía no me queda claro qué es el AT8XX5X...¿microprocesador o microcontrolador?

Sería bueno que dieras características breves del AT8XX5X, porque la verdad el programa que pusiste está muy confuso Enfurruñado

Por ahora yo seguiré subiendo y medio explicando mis programas, porque la programación del AVR es muy parecida a la del PIC y como en el foro son fanáticos de los pic pues le entienden más rápido. Muchas risas

Desconectado FirmSoft

  • PIC16
  • ***
  • Mensajes: 118
RE: Curso Básico AVR AT90S1200 Ensamblador
« Respuesta #8 en: 02 de Noviembre de 2004, 05:49:00 »
   Hola, queria comentarles, que para comenzar con esto de los Atmel, he comprado un AT89C51 y un AT90S8515... asi podre seguir los mensajes de PWRINVITRO y los de migsantiago ... me gustaria saber, si es necesario comenzar tambien por el AT89C51, ya que lo veo mas dificil en varios puntos de vista.. y veo que la nueva tecnologia son los AVR"s ... para programar mi AT89C51 necesito un programador dificil de hacer :S ... en cambio para el AT90S8515 solo un par de resistencias y unos dioditos. En fin!, espero sus opiniones. Gracias y Saludos! Flash

Desconectado PWRINVITRO

  • PIC12
  • **
  • Mensajes: 78
RE: Curso Básico AVR AT90S1200 Ensamblador
« Respuesta #9 en: 02 de Noviembre de 2004, 12:09:00 »
Saludos.. bueno si no programas en ensamblador la verdad se te va a hacer dificil entender ese codigo!!!... las instrucciones cambian un poco pero si bajas el pdf del micro en www.atmel.com podras entenderlas mejor ya q en el pdf estan bien explicadas!!!!... y el 51 tiene la capacidad de trabajor tanto como microprocesaor como microcontrolador!!! si pones el pin EA/VPP en tierra trabaja en modo microprocesador y si lo colocas a 5v trabaja en modo microcontrolador!!!Sonrisa GiganteIdeaIdea

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: Curso Básico AVR AT90S1200 Ensamblador
« Respuesta #10 en: 02 de Noviembre de 2004, 20:27:00 »
Pues quiero aclarar que mi conocimiento de AVRs es muy básico, sólo he usado y programado el AT90S1200. Se casi todo de este micro, sólo me falta aprender cómo usar el comparador analógico y la lectura/escritura de la EEPROM.

El programador lo compré ya hecho y en la página de atmel viene cómo hacerlo, según me han dicho.

Es bueno empezar con lo básico; aquí en el foro empiezan con el PIC16F84A, yo recomiendo empezar con el AT90S1200. Es muy fácil y el lenguaje ensamblador de este microcontrolador es muy cómodo, sobre todo en comparaciones de datos.

Luego que tenga un poquito más de tiempo en línea subo otros programas, incluyendo el del teclado 4x4 que ya les había dicho.

Hace rato que estaba capturando un programa para PIC me di cuenta de lo cómodo que es el AVR Studio respecto a MPLAB, quise simular entradas de bits en PORTB, pero me acordé que en MPLAB hay que usar el Stimulus y la verdad me dio flojera seguir debugueando mi programa Muchas risas

Ya lo probaré conectándolo en proto, a ver si sale Sonrisa

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: Curso Básico AVR AT90S1200 Ensamblador
« Respuesta #11 en: 11 de Noviembre de 2004, 19:56:00 »
Bueno, pues estoy de vuelta.

Ahora les va un programa que lee la presión de una tecla en un teclado 4x4.

Les pongo un poco de teoría respecto al teclado y cómo está conectado.

Una buena manera de ahorrar líneas de entrada al micro es, en lugar de dedicar una línea exclusiva por cada tecla utilizada, emplear un teclado matricial. El teclado matricial se caracteriza por estar cada una de las teclas conectada a dos líneas (una columna y una fila) que la identifican. De este modo el número de teclas que pueden conectarse es el producto de filas por el de columnas.



La técnica de programación requiere tanto de entradas como de salidas. Las filas están conectadas a las patillas de salida y las columnas a las de entrada.

Se comienza el testeo colocando a ‘0’ la primera fila, y a ‘1’ las restantes. Si la tecla pulsada estuviese en la columna ‘0’, ésta colocaría en su línea un ‘0’ lógico. Bastará con hacer un muestreo de las columnas, buscando el 0, para saber la tecla exacta que fue pulsada en la matriz.

Si no es pulsada ninguna tecla en una fila, las entradas se encuentran en estado flotante, razón por la que son necesarias las resistencias de polarización internas, que mantienen las entradas a nivel alto.

En nuestro caso, yo conecté las resistencias a tierra. Por lo tanto, lo que se busca es un UNO en las lìneas de entrada.

Las instrucciones nuevas que este programa tiene son:

sbic pinb,5
Brinca la siguiente instrucción si el bit 5 del puerto B está en CERO.

SI fuera sbis, brinca la sig. inst. si el bit 5 del port b está en UNO.

Es importante decirles que los AVR at90s1200 tienen sólo 3 saltos a subrutina. Este programa que escribí no tiene ni un sólo salto a subrutina, así que si lo van a implementar en otro programa qen dónde hagan uso de un teclado pues sólo llamarían a la lectura del teclado y gastarían un nivel de pila.

El programa es:

---------------------
;programa teclado 4x4 rapid switch

;pb0, pb1, pb2, pb3 Salidas matriz
;pb4, pb5, pb6, pb7 Entradas matriz
;pd0, pd1, pd2, pd3 Salidas LEDS
;pd4 salida estado tecla presionada (E)

Codigo:

;         pb4   pb5   pb6   pb7
;         |   |   |   |
;pb0   ->   0   1   2   3
;pb1   ->   4   5   6   7
;pb2   ->   8   9   a   b
;pb3   ->   c   d   e   f



.include "1200def.inc"

               SER R16         ;FF
               OUT DDRD,R16   ;PtoD Salida
               LDI R16,$0F      ;00001111
               OUT DDRB,R16   ;PtoB 4sal 4ent

               clr r16

               out PORTD,r16   ;borra PtoD
               OUT PORTB,r16   ;borra PtoB

inicio:            clr r16
               clr r17         ;Registro mandado a ptoD
               clr r18         ;registro del contador de barrido
               clr r19         ;indicador de línea actual de barrido
linea1:            ldi r16,$01      
               out portb,r16   ;rb0=1 línea 1 activa
               rjmp barrido   ;va a checar presión de tecla
linea2:            inc r19
               inc r18         ;en subrutina barrido, la primer línea
                           ;no hace incremento, por eso se
                           ;incrementa aquí
               ldi r16,$02
               out portb,r16   ;rb1=1 línea 2 activa
               rjmp barrido
linea3:            inc r19         ;incrementa indicador de línea
               inc r18         
               ldi r16,$04
               out portb,r16   ;rb2=1 línea 3 activa
               rjmp barrido
linea4:            inc r19         ;incrementa indicador de línea
               inc r18         
               ldi r16,$08
               out portb,r16   ;rb3=1 línea 4 activa
               rjmp barrido
nopresion:         clr r16         ;pon E y LEDS a cero
               out portd,r16   ;no hubo presión
               rjmp inicio

barrido:         sbic pinb,4      ;si rb4=0 no hay presión
               rjmp presion
               inc r18         ;siguiente tecla
               sbic pinb,5
               rjmp presion
               inc r18         ;siguiente tecla
               sbic pinb,6
               rjmp presion
               inc r18         ;siguiente tecla
               sbic pinb,7
               rjmp presion
               rjmp quelinea   ;no hubo presión en X línea

presion:         mov r17,r18      ;r17=r18
               out portd,r17   ;saca tecla y E por portd
               sbi portd,4      ;pd4=1 es decir E=1
               rjmp inicio      ;que ya no haga barrido

quelinea:         cpi r19,$00      ;determina en que línea de barrido va
               breq linea2      ;va a línea 2
               cpi r19,$01
               breq linea3
               cpi r19,$02
               breq linea4
               cpi r19,$03
               breq nopresion   ;se va a limpiar ptod

-----------------------------


Al final lo que hace el programa es determinar si se presionó una tecla. Si se presionó, enciende la salida E (pd4) y saca la tecla por pd0, pd1, pd2, pd3. Si se presionara el CERO sólo encendería E y pd0, pd1, pd2, pd3 estarían apagadas. Si se presionara la tecla F encendería E y todas las demás: 1111 = 15 = F.

Espero que le entiendan. Giño

Desconectado chale-reiko

  • PIC10
  • *
  • Mensajes: 1
RE: Curso Básico AVR AT90S1200 Ensamblador
« Respuesta #12 en: 22 de Noviembre de 2004, 03:18:00 »
Me parece o en ninguno de los ejemplos dice como se declaran variables?
¿es asì .EQU NombreVariable????

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: Curso Básico AVR AT90S1200 Ensamblador
« Respuesta #13 en: 22 de Noviembre de 2004, 18:10:00 »
No uso la declaración de variables para los registros del AVR, pero te explico unas directivas para usarlas:

Si quieres definir pines:

.equ RxD =0; En este caso el pin 0 se llama RxD
.equ TxD =1; En este caso el pin 1 se llama TxD

Si quieres renombrar registros:

.def contbit =R16
.def temporal =R17

Y se usan normalmente:

cbi PORTD,TxD; el pin 1 se pone a cero

ldi contbit,$aa; Carga el R16 con AA

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: Curso Básico AVR AT90S1200 Ensamblador
« Respuesta #14 en: 26 de Noviembre de 2004, 10:19:00 »
Ahora entremos con las interrupciones. Les presento un programa que hice muy básico sobre la interrupción externa.

La aplicación que le di fue generar un número aleatorio (random) para obtener la lectura de un dado, es decir, un número que fuera 1, 2, 3, 4, 5 ó 6 al momento en que uno aprieta un botón.

Hay registros que habilitan las interrupciones:

GIMSK - Tiene el bit INT0, el cuál al estar en 0 deshabilita la interrupción externa. Si está en 1 pues la habilita.

MCUCR - Sólo interesan los bits ISC00 y ISC01. Sirve para decir que flanco es el que dispara la int. ext. Los otros pónganlos a cero.

ISC01 ISC00
0         0              LOW 0
0         1              reservado
1         0              flanco derecho
1         1              flanco izquierdo

STATUS - La bandera I habilita el llamado a interrupción en general. La instrucción SEI habilita el bit I de status.

Ahora les pongo una imagen de cómo conectar los 7 leds en un arreglo que simule los puntos de un dado real:



A diferencia de los PICs, los AVR tienen un vector de interrupción único para cada interrupción:

0x00 RESET
0x01 Interrupción externa (GIMSK)
0x02 TIMER, OVF0 (TIMSK)
0x03 ANA_COMP

Para cada interrupción el contador de programa va a caer en un vector en específico.

El avr va a estar incrementando R17 hasta que llegue la presión del botón, sale del loop infinito y adecua el estado de R17 para convertirlo a una salida de 1 a 6 en el dado.

Para regresar de una interrupción hay que usar RETI para que regrese al programa normal y rehabilite I en status.

;dado electrónico hecho con interrupción externa
;   B0   B1   B2   B3   B4   B5   B6   B7
;   1   2   3   4   5   6   7   NC
;      
;MigSantiago
;    _______
;   1|O 4 O|5
;   2|O O O|6
;   3|O   O|7
;    -------
;PD2 Push Button a tierra con r pull-up

.include "1200def.inc"

            rjmp inicio
            rjmp int_ext
            nop
            nop
inicio:         ser r16
            out ddrb,r16   ;ptob salida
            out gimsk,r16   ;habilita int. externa
            ldi r16,$03
            out mcucr,r16   ;flanco izquierdo activa interrupción
            sei            ;activa interrupciones
random:         inc r17         ;inc. random r17
            rjmp random

int_ext:      rcall rebote   ;espera rebote de push button
            andi r17,$07   ;filtra 5 primeros bits a cero
            cpi r17,$00      ;si hubo cero saca 1
            breq sacauno
            cpi r17,$01      ;si hubo 1 saca 1
            breq sacauno
            cpi r17,$02      ;si hubo 2 saca 2
            breq sacados
            cpi r17,$03
            breq sacatres
            cpi r17,$04
            breq sacacuatro
            cpi r17,$05
            breq sacacinco
            cpi r17,$06
            breq sacaseis
            cpi r17,$07      ;si hubo 7 saca seis
            breq sacaseis

sacauno:      ldi r16,$08      ;prende 4
sacadado:      out portb,r16
            reti
sacados:      ldi r16,$41      ;prende 1 y 7
            rjmp sacadado
sacatres:      ldi r16,$49      ;prende 1, 4 y 7
            rjmp sacadado
sacacuatro:      ldi r16,$55      ;prende 1,3,5,7
            rjmp sacadado
sacacinco:      ldi r16,$5d      ;prende 1,3,4,5,7
            rjmp sacadado
sacaseis:      ldi r16,$77      ;prende 1,2,3,5,6,7
            rjmp sacadado

;    delay loop generator
;     800000 cycles:
; -----------------------------
; delaying 799995 cycles:
rebote:   ldi  R20, $5F
WGLOOP0:  ldi  R18, $17
WGLOOP1:  ldi  R19, $79
WGLOOP2:  dec  R19
          brne WGLOOP2
          dec  R18
          brne WGLOOP1
          dec  R20
          brne WGLOOP0
; -----------------------------
; delaying 3 cycles:
          ldi  R20, $01
WGLOOP3:  dec  R20
          brne WGLOOP3
; -----------------------------
; delaying 2 cycles:
        ret
; =============================

Es importante que acomoden bien los LEDs para que le encuentren forma a las salidas del dado.
Muchas risas


 

anything