TODOPIC

Otros Microcontroladores / Dispositivos programables => Microcontroladores 8 bits => Mensaje iniciado por: YF-21 en 22 de Octubre de 2004, 14:15:00

Título: Curso Básico AVR AT90S1200 Ensamblador
Publicado por: YF-21 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 ??
Título: RE: Curso Básico AVR AT90S1200 Ensamblador
Publicado por: YF-21 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 ??
Título: RE: Curso Básico AVR AT90S1200 Ensamblador
Publicado por: migsantiago 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.
Título: RE: Curso Básico AVR AT90S1200 Ensamblador
Publicado por: migsantiago 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


Título: RE: Curso Básico AVR AT90S1200 Ensamblador
Publicado por: FirmSoft 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
Título: RE: Curso Básico AVR AT90S1200 Ensamblador
Publicado por: migsantiago 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
Título: RE: Curso Básico AVR AT90S1200 Ensamblador
Publicado por: PWRINVITRO 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!!
               
Título: RE: Curso Básico AVR AT90S1200 Ensamblador
Publicado por: migsantiago 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
Título: RE: Curso Básico AVR AT90S1200 Ensamblador
Publicado por: FirmSoft 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
Título: RE: Curso Básico AVR AT90S1200 Ensamblador
Publicado por: PWRINVITRO 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
Título: RE: Curso Básico AVR AT90S1200 Ensamblador
Publicado por: migsantiago 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
Título: RE: Curso Básico AVR AT90S1200 Ensamblador
Publicado por: migsantiago 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
Título: RE: Curso Básico AVR AT90S1200 Ensamblador
Publicado por: chale-reiko 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????
Título: RE: Curso Básico AVR AT90S1200 Ensamblador
Publicado por: migsantiago 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
Título: RE: Curso Básico AVR AT90S1200 Ensamblador
Publicado por: migsantiago 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
Título: RE: Curso Básico AVR AT90S1200 Ensamblador
Publicado por: migsantiago en 26 de Noviembre de 2004, 14:11:00
Hey!!!

No sé quién lo haya hecho, pero ya me subieron a moderador. ¡¡Gracias!!

Espero poder seguir ayudando con lo poco que sé de los AVRs Rebotado Sonrisa Gigante Vacilando Sonrisa Sonrojado
Título: RE: Curso Básico AVR AT90S1200 Ensamblador
Publicado por: hjauregui en 02 de Diciembre de 2004, 11:27:00
Amigo, de antemano gracias por la información, pero la verdad es que soy un neófito del tema, y la verdad es que llama mucho la atención los micros de AVR, primordialmente por el costo, en comparación con los PIC.

No tienes de casualidad, material explicito de cómo programarlos, tal como como declaro los puertos de entrada y salida, programas básicos explicados paso a paso.

Gracias por tu atención, si me mandas algo de información  a este correo harry_Jauregui@hotmail.com  te lo agradezco en el alma
Título: RE: Curso Básico AVR AT90S1200 Ensamblador
Publicado por: migsantiago en 02 de Diciembre de 2004, 12:48:00
Pues material explícito sobre la programación básica no tengo. Tal vez si lees un poquito más el tercer mensaje de este tema puedas entenderle a las entradas/salidas. Lo que he aprendido de AVR lo tengo en mis apuntes de la escuela y pues transcribirlos es medio pesado.

Si lo lees y todavía no le entiendes, puedes preguntar aquí, con gusto te ayudamos. Si necesitas un programa básico y sencillo, lo podemos resolver paso a paso para que le entiendas. Muchas risas
Título: RE: Curso Básico AVR AT90S1200 Ensamblador
Publicado por: pikman en 06 de Diciembre de 2004, 20:18:00
Hola, migsantiago, una consulta, instale el AVR STUDIO 4.0 y no hay forma de simular el tyn12l, en la version 3.5 si es posible, que version estas usando, muy interesante los AVR, es mas como comente en un post me parecen una buena alternativa para quienes usamos PIC.

He realizado algunos trabajos en ASM, que en algunos aspectos es mas sencillo que el de los PIC, y muy familiar para los que estan acostumbrados a los INTEL, pero he bajado la version de ICCAVR de imagecraft de compilador de C y creo que es una alternativa al ASM de programacion avanzada de estos hermosos microcontroladores, mi idea es justamente manejar un display LCD.

un saludo
PIKMAN
Título: RE: Curso Básico AVR AT90S1200 Ensamblador
Publicado por: pikman en 07 de Diciembre de 2004, 11:25:00
OK, el tiny12L es uno de los menores de la familia, pero por lo que veo el 1200 es muy parecido, claro en el AVR 4.0 no esta el tiny12L, asi que voy a bajar la nueva version, aunque el 3.5 no esta mal. con respecto al C yo he probado el codevision pero me parece mas practico el de imagecraft el ICCAVR, tambien hay uno libre pero de ICCAVR inclusive tiene muchas librerias y drivers ya hechos, como somos muchos los que empezamos con estos micros seria bueno adoptar un compilador solamente como es el CCS en los PIC, se me ocurre no como para poder habalr el mismo idioma, es buena la idea de crear un maletin para ATMEL, espero poder armar una placa para experimantar,

un saludo

PIKMAN.
Título: RE: Curso Básico AVR AT90S1200 Ensamblador
Publicado por: migsantiago en 15 de Diciembre de 2004, 12:14:00
Bueno, ya que están medio familiarizados con las interrupciones les dejo un programa que genera una salida binaria cada segundo usando interrupciones:


;Programa que incrementa conteo binario
;en PtoB cada segundo usando interrupción
;por timer
;migsantiago@tutopia.com

;CK/64 tiempo mínimo=16us
;4ms/16us=250 conteos
;256-250=6 -> TCNT0
;4ms x 250conteos= 1s

.include "1200def.inc"
            rjmp main
            nop
            rjmp timer
main:         clr r17         ;pone a cero salida a ptoB
            clr r25         ;pone a cero contador 4ms
            ser r16
            out ddrb,r16   ;ptoB de salida
            out timsk,r16   ;habilita int. por timer
            ldi r16,6
            out tcnt0,r16   ;manda el 6 a timer
            sei            ;habilita I en SREG
            ldi r16,$03
            out tccr0,r16   ;011 en escala: CK/64
ciclo:         nop            ;pasa el tiempo
            rjmp ciclo

timer:         inc r25         ;inc. conteo de 4ms
            cpi r25,$fa      ;250d = fah
            breq increm      ;se va a inc. ptoB
pon_conteo:      ldi r16,$06
            out tcnt0,r16   ;comienza tiempo 4ms otra vez
            reti         ;regresa de interrupción
                        ;habilitando I en SREG

increm:         inc r17         ;inc conteo en ptoB
            out portb,r17   ;saca conteo
            clr r25         ;borra conteo de 4ms
            rjmp pon_conteo





Les explico los registros del TIMER:

TIMSK - Habilita la interrupción por sobreflujo del contador TCNT0
TIFR - Es la bandera que dice si hubo sobreflujo del TCNT0
TCCR0 - Aquí uno da las escalas de división de TCNT0
TCNT0 - Aquí se lleva la cuenta

En TCCR0 Se tiene CS02, CS01 y CS00 los cuales indican la escala y el funcionamiento del Timer, los datos que llevan son CS02, CS01 y CS00 respectivamente:

*Cristal de 4MHz
000 - stop, no cuenta
001 - CK, la escala es igual al cristal que uno le ponga (0.25us por conteo y 4MHz)
010 - CK/8 (2us)
011 - CK/64 (16us)
100 - CK/256 (64us)
101 - CK/1024 (256us)
110 - Flanco derecho en patita T0 PD4
111 - Flanco izquierdo en T0

R25 va a contar 250 veces el desbordamiento del timer. El timer se va a desbordar cada 4ms ya que se usó CK/64. R16 lleva un 6 para que el conteo se haga 250 veces.

16us x 250 (r16) = 4ms
4ms x 250 (r25) = 1000ms

Ahora para los fans de los PICs, les dejo un programa idéntico pero hecho con el 16f84a. Compárenlos. :]



;Int. por timer 1 segundo en PIC16f84a
;saca conteo binario cada segundo por portb
LIST P=16f84
include "p16f84a.inc"

;Registros
contador4ms   equ   0x0c

org 0x00
   goto inicio

org 0x04
   goto timer      ;Vector de interrupción

org 0x05
inicio         bsf STATUS,RP0      ;banco 1
            clrf TRISB         ;todo B salida
            movlw 0x03         ;00000011
            movwf OPTION_REG   ;1:16 escala
            bcf STATUS,RP0      ;banco 0
            clrf PORTB
            clrf contador4ms   ;borra conteo de 4ms
            movlw 0x06         ;256-250=6
            movwf TMR0
            movlw 0xa0         ;10100000
            movwf INTCON      ;habilita GIE y T0IE

ciclo         nop
            goto ciclo

timer         btfss INTCON,T0IF   ;por si hubo otra interrupción
            retfie
            incf contador4ms,F
            movf contador4ms,W   ;pasa contador4ms a w
            sublw 0xfa         ;compara con 250
            btfss STATUS,Z      ;brinca si Z=1
            goto pon_conteo
            clrf contador4ms
            incf PORTB,F
pon_conteo      movlw 0x06         ;regresa conteo
            movwf TMR0
            bcf INTCON,T0IF      ;borra bandera int. tmr
            bsf INTCON,T0IE      ;rehabilita int. por timer
            retfie

end

Título: RE: Curso Básico AVR AT90S1200 Ensamblador
Publicado por: FirmSoft en 03 de Marzo de 2005, 15:41:00
Quisiera hacerte una pregunta, estoy estudiando a full todo esto y ya comprendo cada una de las instrucciones... la duda es.. los registros de proposito general, creo que son 32.. son como el registro W (Work) de los pics ??? ... hay instrucciones que no trabajansobre esos registros? o lei mal?. Gracias y perdon por una pregunta tan tonta. Suerte!
Título: RE: Curso Básico AVR AT90S1200 Ensamblador
Publicado por: migsantiago en 05 de Marzo de 2005, 18:30:00
Salu2

Antes de explicarte, por favor baja este archivo de Atmel:

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

Este archivo trae las explicaciones de cada código de operación de la familia de 8bit de AVRs. Trae instrucciones que los AT90S1200 no incluyen, pero a esas no les hagas caso, sólo estudia las que trabaja el 1200.

Ya que tengas el archivo checa la página 16 por ejemplo. Ahí viene explicada bien la instrucción ADC (Suma con acarreo) por ejemplo. Abajo dice que los registros que maneja esta instrucción son 0 < d < 31, 0 < r < 31 (menor o igual)

Ahora checa la página 20. Ahí se explica la operación ANDI (AND inmediata). Los registros que ella trabaja son 16 < d < 31, 0 < K < 255 (K es el número a poner en la AND)

¿Porqué? No te puedo dar una respuesta exacta, pero tiene que ver con el modo de direccionamiento del AVR. Cada instrucción tiene límites de trabajo con los registros, siempre hay que checarlas. Avergonzado

Te recomiendo que leas las instrucciones en las que estés interesado, porque a mi a veces me confundía que el maestro siempre trabajaba del registro 16 en adelante.
Título: RE: Curso Básico AVR AT90S1200 Ensamblador
Publicado por: migsantiago en 16 de Junio de 2005, 14:44:00
Hola,

Para comodidad de ustedes, subí este curso básico a mi página de internet.

Ahí viene todo el curso y le agregué unas imágenes para explicar la conexión de algunos de los programas que aquí les puse.

http://www.migsantiago.com/index.php?option=com_content&view=article&id=3&Itemid=4
Título: Re: Curso Básico AVR AT90S1200 Ensamblador
Publicado por: diego_castano01 en 22 de Agosto de 2006, 00:03:46
HOLA, estoy programando un AT89S52 y estoy realizando una rutina en la que muevo un motorreudctor por variaccion de pulso (velocidad PWM) y verifico su posicion mediante un poteciometro unido a un ADC, ahora me pasa este problema, cuando el motor está trabajando, yo analizo una serie de teclas de vale la redundancia, un teclado de 4x4, ahora cheque a A y C pero como este esta unido a un encoder 74C922 de fairchild este megenera una Interrupccion cada vez que pulso una tecla, ahora retomo, cuando el motor esta trabajando y yo pulso una tecla diferente a A o C el software me tomo esto como una interrupccion y de hecho deberia hacerlo, pero el detalle esta en que el motor pierde su configuracion de trabajo,

Ya que hablaron de aspectos sobre teclados de 4X4, alguien me podria ayudar en como abrca rle problema gracias, AAAhhhhh sin afectar a la interrupccion 
Título: Re: Curso Básico AVR AT90S1200 Ensamblador
Publicado por: migsantiago en 22 de Agosto de 2006, 10:49:48
Si subes tu programa talvez se te pueda ayudar. Es mejor que abras un nuevo tema para tu pregunta, en este se habla del at90s1200 =).
Título: Re: Curso Básico AVR AT90S1200 Ensamblador
Publicado por: Sispic en 28 de Septiembre de 2007, 06:46:14
Estoy implementando un desensamblador para WinPic800 y tengo algunas preguntillas para los maestros avr .

He bajado el AVR Studio  + 4.13.557  Service Pack 1

veo que para iniciar la eeprom es asi :

.ESEG
.db "Hello"

y al compilar crea un archivo .eep
Osea no va todo en un mismo archivo hex como en los pics .

No hay manera que  ponga el programa y eeprom todo junto ?
ö es que hay que abrir los dos HEX para programar cada vez ?

y los bits de config ? , no veo por donde se cofiguran y que salgan en el HEX .

un saludo
Título: Re: Curso Básico AVR AT90S1200 Ensamblador
Publicado por: migsantiago en 28 de Septiembre de 2007, 10:39:27
Hola Sispic

No tengo la respuesta a tu pregunta. Sería mejor que abras un tema nuevo para que más gente la vea.  :mrgreen:
Título: Re: Curso Básico AVR AT90S1200 Ensamblador
Publicado por: Belgitaes en 29 de Septiembre de 2007, 12:34:15
Código: [Seleccionar]
No hay manera que  ponga el programa y eeprom todo junto ?

Preuba Eso
1º abre tu programa con el AVRStudio
le das a Run y despues tica en DEBUG
abajo del todo veras UP/DOWNLOAD MEMORY
tica ahi y se te abrira un menu
en HEX FILES busca la ruta de tu fichero eeprom .hex
buscandolo a traves de un cuadrito con tres puntito donde
se te abrira otro menu y desde ahi ve en busca de la carpeta
donde tengas guardado ese fichero eeprom.hex
lo ticas y despues ticas en LOAD FROM FILE y luego cierralo a traves
de la X en el cuadrito rojo NO LE VAYAS A DAR A SAVE TO FILE
sino te sobrescribira tu fichero eeprom .hex a 0000000
ya que es el que tienes en este momento en el AVRStudio
ahora tica en VIEW en el menu de arriba y busca en EEprom
se tiene que ver reflejado en el tu eeprom y ya odras simular
tu programa en conjunto con la eeprom
eso lo tendras que hacer cada vez que vuelva a cerrar el AVRSTUDIO
 
Título: Re: Curso Básico AVR AT90S1200 Ensamblador
Publicado por: Sispic en 01 de Octubre de 2007, 04:09:15
Thankius , ya boy viendo como va eso .
Título: Re: Curso Básico AVR AT90S1200 Ensamblador
Publicado por: stk500 en 03 de Octubre de 2007, 02:54:40
 :mrgreen:
Hola Mig!
Un gran saludo!
desde hace tiempo sigo tu Curso en Assembler del Atmel 1200, pero el diablo aqui ni lo encuentros porque como sabe es Obsoleto aunque me he leido la hoja de Atmel del Attiny2313 que son en pin compartible, y no puedo nas mas que simularlo con el Studio4.
Como te explicaba en mis proximo projecto de una mesa de luces de 64 canales, este lleva el Attiny2313 y estoy aprendiendo muchos con el y lo que no tengo claro todavia es la UART de 250000 Baudrate y hacer este protocolo, por eso te pedia ayuda y espero cuando o ponga, estoy en los preparativo haciendo las traducciones de todos el projecto en Cristiano(Español)   :D para que la gente lo tenga claro.

Un gran saludo Migsantiago y muchas gracias por tu apoyo que mi deseo es que este Foro seamos mas y asi aportar mas experiencia
 :mrgreen:
Título: Re: Curso Básico AVR AT90S1200 Ensamblador
Publicado por: migsantiago en 03 de Octubre de 2007, 22:46:41
Hola Stk

No soy experto en AVRs pero en lo que pueda te ayudaré.

Gracias  :mrgreen:
Título: Re: Curso Básico AVR AT90S1200 Ensamblador
Publicado por: Meta en 09 de Febrero de 2008, 23:08:50
Leyendo como es Atmel, la verdad parece mejor y más potente que los PIC de Microchip. La verdad de tanto oír a la gente que los Router nuestros para conectarnos a internet, usan AVR. Pues opino que AVR parece mejor que el PIC, eso si, el PIC al menos por ahora sigue siendo mi preferido. Por lo que veo, AVR parece más complicado para programar.

También he oído que Motorola es mucho mejor que los PIC al mismo tiempo es más DURO de programar de todos.

Por lo que veo, para gustos los colores. Funcionan y hacen de  todo.
Título: Re: Curso Básico AVR AT90S1200 Ensamblador
Publicado por: migsantiago en 10 de Febrero de 2008, 11:19:36
Cierto, pero una persona que viene de programar AVR's diría lo mismo de los PIC, que son complicados  :D

No solo se usan los AVR, sino todas las familias de Atmel en muchas aplicaciones.
Título: Re: Curso Básico AVR AT90S1200 Ensamblador
Publicado por: stk500 en 10 de Febrero de 2008, 12:06:25
Hola mi gente!
en mi opinion ni lo uno ni lo otro yo uso Atmel y Pic y encuentos los dos fabuloso ya que hay muchas aplicaciones en la Web, y muchas cosas compartible  :-) :-)
Título: Re: Curso Básico AVR AT90S1200 Ensamblador
Publicado por: Xavier25 en 14 de Julio de 2008, 16:16:13
Que tal, que bien, que bueno que hacen esto es muy util para comenzar principalmente en este lenguaje, recientemente tome un curso de avr pero en lenguaje c y quede fasinado, como dices es necesario conocer los micros mas "pobres" y que mejor que en asm, ya he estudiado los pics y casi los domino en asm recien estoy estudiandolos en c, estare estudiando, muchas gracias por compartir.

Título: Re: Curso Básico AVR AT90S1200 Ensamblador
Publicado por: pirate_x en 30 de Marzo de 2009, 00:37:02
Hola, me ha servido mucho tu ayuda, ya que necesito conocer un poco mas la estructura de estos micros y con assembler es mucho mas facil esa tarea( se puede hilar mas fino que en C).

Tengo una consulta, en C uno setea la frecuencia con que va a trabar (mas bien la frec del cristal que esta usando), mi duda es como se hace eso en assembler, o no es necesario???

saludos, y gracias
Título: Re: Curso Básico AVR AT90S1200 Ensamblador
Publicado por: migsantiago en 30 de Marzo de 2009, 13:07:58
Para el caso de ensamblador no es necesario declarar la velocidad del cristal ya que las rutinas de tiempo (ciclos anidados) y manejo de timers (desborde de timer e interrupción) son escritas por uno mismo. Uno controla el tiempo y ciclos conociendo previamente la velocidad del cristal.

Para el caso de C sí es necesario indicarle al compilador la velocidad ya que él generará rutinas de acuerdo al cristal de forma automatizada.

Para casos en donde el manejo de tiempos es irrelevante es innecesario declarar la velocidad del cristal, en ambos lenguajes, ensamblador y C.
Título: Re:Curso Básico AVR AT90S1200 Ensamblador
Publicado por: Capitana_de_tu_cora en 22 de Abril de 2021, 14:51:20
Hola, soy nueva en esto y estoy buscando ayuda tengo que realizar un programa con dos contadores uno ascendente cuando el botón en el puerto PC0 y el otro descendente en el puerto PC1 y cuando  no  haya  nada presionado el contador debe mantenerse fijo. Por ahora tengo esto pero no sé cómo integrar los botones para que hagan esa función

.INCLUDE "M16DEF.INC"
.ORG 0


;PILA
LDI R16, HIGH(RAMEND)
OUT SPH, R16
LDI R16, LOW(RAMEND)
OUT SPL, R16

SER R16

OUT DDRB,R16; PUERTO B PARA LEDS

LDI R16, 0x00

CONTADORASCENDENTE:
   OUT PORTB, R16
   CALL DELAY25
   INC R16
   CALL DELAY
CONTADORDESCENDENTE:
   OUT PORTB, R16
   CALL DELAY25
   DEC R16
   CALL DELAY


DELAY:
   LDI R20, 104
   CICLO2:
      LDI R21, 255
   CICLO1:
      DEC R21
      BRNE CICLO1
      DEC R20
      BRNE CICLO2
      RET
DELAY250:
   LDI R22, 25
   CICLO3:
      CALL DELAY
      DEC R22
      BRNE CICLO3
      RET
Título: Re:Curso Básico AVR AT90S1200 Ensamblador
Publicado por: KILLERJC en 23 de Abril de 2021, 07:14:48
Primero que nada esta faltando un loop infinito...

Segundo el delay deberia ser cortito de unos 10ms aprox para que no se note tanto.

De alli solo queda, dentro del loop principal

Citar
Inicio del loop principal
Bit test del boton ascendente, hay dos opciones:
PRESIONADO -> CALL/RCALL CONTADORASCENDENTE
NO PRESIONADO -> Continuo, es decir no es necesario poner nada.
Bit test del boton descendente
PRESIONADO -> CALL CONTADORDESCENDENTE
NO PRESIONADO -> No hago nada.
Termine el test de los botones comienzo de nuevo.. Fin del Loop principal

Hasta aca bien, el problema esta en que es necesario proteger que entre muchas veces entonces dentro de CONTADORASCENDENTE y CONTADORDESCENDENTE vamos a hacer una pequeña comprobacion.

Citar
CONTADORASCENDENTE:
   CALL DELAY25     ; Este delay entre las lecturas del boton por si hay algun rebote 10ms como te comentaba
   
   ;test del boton nuevamente, pero ahora espero que se suelte el botón (ya que para entrar acá estaba presionado)
   ;SI NO SE SOLTO-> JMP/RJMP CONTADORASCENDENTE, es decir lo encierro aca esperando que se suelte
   ;SE SOLTO-> Continuo

   INC R16
   OUT PORTB, R16
   RETURN         ;Uso el RETURN porque en el loop principal lo llame con un CALL



Por lo que veo es un solo display, pero eso deberia ser suficiente. Si tuvieras dos o mas esto no funcionaria, ya que necesitas cambiar las salidas y bloqueamos el programa al hacer lo de los botones (para que no lo tome varias veces)
Título: Re:Curso Básico AVR AT90S1200 Ensamblador
Publicado por: Anabela.19 en 05 de Noviembre de 2021, 13:30:32
Hola! Tengo problemas con realizar una calculadora en bascom, son 4 operaciones(suma, resta, division y multiplicacion) y sus limites son de 0 a 999.