Octavo Electrónica 2009 – 2010

                               Universidad Técnica de Ambato


                                         Facultad de Ingeniería en

                                  Sistemas Electrónica e Industrial
FISEI




        Octavo Electrónica 2009 – 2010                FISEI - UTA
TABLA DE CONTENIDOS
        INSTALACIÓN

        Instalación de Bascom ……………………………………………………………... 1

        INTRODUCCIÓN A BASCOM

        Bascom ……………………………………………………………………………... 6

        AVR ………………………………………………………………………………… 7

        Qué es lo que usted necesita para empezar ……………………………………… 7

        Su Pc ………………………………………………………………………………... 7

        Construir (o comprar) un "programador" ……………………………………... 8

        EL SOFTWARE DE PROGRAMACIÓN

        Obtener TWinAVR. ………………………………………………………………. 9

        Obtener Userport …………………………………………………………………. 11

        Configurar TWinAVR Bascom …………………………………………………. 12

        Como usar Bascom ……………………………………………………………….. 13

        Programa básico para hacer parpadear un led con intervalos de 1 segundo .. 18

        Un semáforo de dos intersecciones ……………………………………………… 19

        Juego de luces para discoteca …………………………………………………… 21

        Ejercicio con la instrucción FOR NEXT ……………………………………….. 23

        LAS VARIABLES BIT, BYTE Y WORD ……………………………………… 23

        Luces del auto fantástico ………………………………………………………… 24

        Ejercicios con pulsadores ……………………………………………………….. 25

        La declaración IF… THEN …………………………………………………….. 25

        Contador binario con pulsador antirrebote …………………………………… 27

        Led intermitente de velocidad variable ………………………………………… 29
FISEI




        Manejo de un display de 7 segmentos con el ci.7447 ………………………….. 30



               Octavo Electrónica 2009 – 2010                 FISEI - UTA
Un contador decimal de un digito con el ci 7447 y un pulsador ……………. 30

        Manejo de un display de 7 segmentos sin el ci.7447 …………………………. 31

        Declaración LOOKUP ………………………………………………………… 32

        Manejo de 4 display de7 segmentos con el ci.7447 ………………………….. 33

        Contador decimal de 4 digitos con el CI.7447 ………………………………… 34

        Manejo de 4 displays de 7 segmentos sin el ci.7447 (rotulación) …………… 36

        Manejo de 4 displays con rotulo en movimiento …………………………….. 37

        Manejo de un modulo lcd ……………………………………………………… 38

        Defina sus propios personajes lcd …………………………………………….. 45

        Contador de pulsos con lcd ……………………………………………………. 47

        Generación de sonido …………………………………………………………. 49

        Una sirena policial …………………………………………………………….. 50

        Generación de un timbre de teléfono celular ……………………………….. 51

        Llamada telefónica DTMF …………………………………………………… 51

        La declaración DTMFOUT …………………………………………………... 52

        Lectura de un teclado de 16 pulsadores con display ded 7 segmentos ……. 54

        Cerradura electrónica con clave en memoria flash ……………………….. 57

        Cerradura electrónica con clave en memoria ram y cambio de clave …… 60

        Cerradura electrónica con clave en memoria eeprom y cambio de clave .. 62

        La declaración WRITEEEPROM y READEEPROM ……………………... 62

        MOTORES PASO A PASO

        Que es un motor Paso a paso ………………………………………………… 65

        Motores paso a paso bipolares ………………………………………………. 65
FISEI




        Motores paso a paso unipolares ……………………………………………… 67

        Secuencia del circuito de control …………………………………………….. 69


               Octavo Electrónica 2009 – 2010                 FISEI - UTA
Manejo de un motor paso a paso en secuencia wave drive ………….……. 70

        Manejo de un motor paso a paso en secuencia full step ……………..……. 71

        Manejo de un motor paso a paso en secuencia half step …….………….… 71

        COMUNICACIÓN

        Que es la comunicación serial? …………………………………………..… 72

        Modos de transmisión de datos ……………………………………... 73

        Comunicación serial avr a pc …………………………………………..….. 74

        Comunicación serial pc a avr …………………….……………………..…. 76

        Comunicación i²c ……………..………………………………………….….. 77

        Comunicación i²c con una memoria serial 24l04b …………………….…. 79

        Interrupciones ………………………………………………………….....…. 82

        SLEEP Y WAKE-UP, WATCH DOG …………………………….……….. 84

        Circuito programador de AVR ……………………………………….…… 86

        Datashteets ……………………………………………………………….. 89 - 123
FISEI




               Octavo Electrónica 2009 – 2010            FISEI - UTA
FISEI




        Octavo Electrónica 2009 – 2010   FISEI - UTA
FISEI




        Octavo Electrónica 2009 – 2010   FISEI - UTA
INSTALACIÓN
        INSTALACIÓN DE BASCOM

        Después de que usted ha descargado el archivo ZIP que usted necesita, debe ABRIR el
        archivo. En Windows XP, para la versión de la DEMOSTRACIÓN, corra los
        setupdemo.exe. (http://www.atmel.com : (http://www.ckuehnel.ch)




        Click en el botón Next para seguir la instalación.

        Aparecerá la ventana de información de la licencia.
FISEI




                Octavo Electrónica 2009 – 2010                  FISEI - UTA                   1
Leer las instrucciones, selecciones 'I accept the agreement' y presione el botón NEXT.

        La ventana siguiente se mostrará




        Lea la información adicional y presiones el botón NEXT

        Ahora la próxima pantalla aparecerá:




        Usted puede seleccionar la direccion y camino dónde le gusta que BASCOM sea
        instalado. Usted puede también acepte el valor predefinido que es

        C:Archivo de programasMCS ElectronicsBASCOM-AVR
FISEI




        Cuando tu termines click en botón NEXT para continuar



                Octavo Electrónica 2009 – 2010                    FISEI - UTA                    2
Cuando el directorio existe, porque usted instala una más nueva versión, usted
        conseguirá una advertencia.




        En caso de la advertencia, selecciones Yes.

        Tú observaras la siguiente ventana.




        Usted puede escoger crear en un nuevo Grupo del Programa llamdo 'BASCOM-AVR', o
        usted pueda modificar el nombre, o instale en un Grupo del Programa existente,
        presione el boton Next después de que usted ha hecho su opción

        Ahora el archivo esta siendo instalado.
FISEI




                                                                                          3
               Octavo Electrónica 2009 – 2010                FISEI - UTA
Después de que los archivos principales se instalan, algunos archivos
        adicionales se instalarán.




        Cuando la instalación está lista usted verá la última pantalla




        Usted tiene que reiniciar su computadora.
FISEI




                                                                                       4
                 Octavo Electrónica 2009 – 2010                          FISEI - UTA
La carpeta del programa BASCOM se crea:




        Usted puede ver los "Raed me" y archivos de la Licencia y usted puede
        empezar BASCOMAVR.
FISEI




                                                                                5
              Octavo Electrónica 2009 – 2010           FISEI - UTA
FISEI




        Octavo Electrónica 2009 – 2010   FISEI - UTA
INTRODUCCIÓN: BASCOM Y AVR
        BASCOM:
        Medios básicos del compilador Bascom.
        Bascom es desarrollado y vendido por MCS Electronics.
        Bascom viene en tres variantes
              Bascom-LT para microcontroladores Atmel AT89Cx051
              Bascom-8051 de 8051 microcontroladores.
              Bascom-AVR de microcontroladores Atmel AVR

        Bascom es una aplicación para PC que le permitirá:
              Escribir programas en Basic
              Traducir estos programas en el PC para código maquina (un formato que el
              controlador puede ejecutar AVR).
              Simular el código compilado
              El uso de programas externos de flash ("programa"), el código compilado en
              microcontrolador de un AVR Atmel.

        Lo bueno de Bascom es que se puede empezar con una versión libre Bascom, y
        descargar el Bascom-AVR Demo zip-file), cuyo único límite es la 4k tamaño del código
        generado (esto fue 2k hasta 2005 ). The obvious choice of AVR microcontroller would
        then be one of the (2k flash) ATTiny models or the much-used (but now obsolete)
        AT90S2313 which will let you get acquainted with Bascom and AVR microcontrollers.
        La elección obvia de microcontrolador AVR sería uno de los flash (2K) modelos
        ATTINY o el tan usado (pero ahora obsoleto) AT90S2313 que le permitirá
        familiarizarse con Bascom y microcontroladores AVR.

        Bascom permite crear rápidamente prototipos porque se ha incorporado soporte para
        casi todos los microcontroladores AVR características tales como:
                Contadores / temporizadores
                UART
                ADC
                PWM
                I2C

        Además de que soporta gran cantidad de periféricos, tales como:
               Botones
               LCD de alfanuméricos
               LCD Gráficos
               PS / 2 para teclado
FISEI




               Control remoto por infrarrojos
        Es sobre todo este apoyo que hace que el uso de Bascom atractivo en términos de
        tiempo ahorrado, mientras que el desarrollo de una aplicación.


                Octavo Electrónica 2009 – 2010                   FISEI - UTA                   6
AVR:

        AVR es una familia de microcontroladores de 8 bits con una amplia gama de variantes
        diferentes en:
                Tamaño del programa de la memoria (flash)
                Tamaño de la memoria EEPROM
                Número de pines I / O
                Número de servicios tales como características de los chips UART y ADC
                Paquete de formularios

        El más pequeño es el microcontrolador ATTINY11 con 1k flash y 6 pines I / O. The
        largest is the ATMEGA256x with 256k flash, 54 I/O pins and lots of on-chip features.
        La más grande es la ATMEGA256x con 256K flash, 54 pines I / O y muchas de las
        características del chip.
        Todos los controladores tienen el AVR RISC mismo como conjunto de instrucciones,
        que permite portar bastante fácil de los programas de Bascom entre los tipos de
        microcontroladores. Que ejecutar una instrucción por ciclo de reloj haciéndolas
        sensiblemente más rápido que el 8 bits comparables 4 ciclos de reloj por cada
        instrucción de los controladores de Microchip PIC.




        ¿QUÉ ES LO QUE USTED NECESITA PARA EMPEZAR?
        La siguiente lista es el mínimo que necesita para empezar con la primera solicitud:

               Un PC con un puerto paralelo con Windows (95 y más).
               Bascom instalado en su PC.
               Un "programador", un dispositivo que carga el código que se compila por
               Bascom en la memoria del programa del microcontrolador.
               Una configuración de prueba con un microcontrolador.




        SU PC
        Su PC debe ejecutar W95 o superior, consulte la página Bascom AVR para más
        detalles. Si usted quiere construir su propio programador sencillo, el PC debe tener un
        puerto paralelo o en serie. Si su PC funciona NT, 2000 o XP, acceso al puerto paralelo
        requiere un pequeño programa independiente. Detalles de seguir adelante.
FISEI




                Octavo Electrónica 2009 – 2010                      FISEI - UTA                   7
Instalar Bascom
        Comience con la descarga de la versión libre Bascom. Se limitará el tamaño de código
        que puede compilar (traducir de base a código de máquina AVR) de 2k, pero le ayudará
        a empezar con casi todos los aspectos importantes de Bascom y controladores AVR.

        Ir a la Electrónica MCS, sitio web a continuación, seleccione Descargas y, a
        continuación Bascom, a continuación, Bascom-AVR, y descargar el Bascom-AVR
        Demo archivo ZIP. Descomprimir en un directorio temporal. A continuación, inicie el
        programa de instalación ejecutable, que ahora debería estar en este directorio temporal.
        Instale Bascom, usted puede elegir el directorio de instalación.

        Cree un directorio Bascom de trabajo, por ejemplo: C:  Yourname  Bascom 

        Construir (o comprar) un "programador"

        Aquí, un programador es un dispositivo para obtener el código Bascom compilado en la
        memoria flash del microcontrolador AVR. La forma más fácil sería comprar un
        programador. i elige la STK500 Atmel, se obtiene un programmerboard con un
        controlador de AVR y algunos periféricos, tales como LED's. Esto le permite ponerse
        en marcha inmediatamente. Sin embargo, la construcción de su propio programador es
        fácil y barato.
        Un programador muy básico es el basado en el SP12 trabajado por Roland Walter. Su
        hardware del programador es controlado a través del puerto paralelo del PC con un
        pequeño programa llamado TWinAVR. Usted debe descargarlo también. Descomprimir
        TWinAVR a una ubicación conveniente en su PC. No se necesita configuración, puede
        ejecutar TWinAVR.exe directamente desde el directorio de descarga
        La versión de Roland es un programador en el que tienes que poner el microcontrolador
        AVR en un zócalo, el programa, quite el microcontrolador y colocarlo en la
        configuración del circuito. Lo hice un par de veces y consideró que sería posible
        modificar su hardware de programación para que en la Programación del Sistema (ISP).
        Para ello ISP, usted simplemente puede reservarse el microcontrolador pines que se
        trate con la programación para este fin. Sin embargo, mientras esté conectado el
        programador, estos pines no se puede utilizar para cualquier otro fin, puesto que podría
        producirse un conflicto entre el programador, el microcontrolador y cualquier otra cosa
        adjunta a estos pines. Esto no sería tanto un problema con microcontroladores grandes
        con gran cantidad de pines I / O, pero en el AVR pequeños, sacrificando esos pines para
        la programación externa a menudo no es posible. La solución es modificar el
        programador de tal manera que las clavijas de programación sólo se conecta al
        microcontrolador mientras que la programación está lugar. Para un buffer, he intentado
        un 74HCT244 y 74HCT541. Los resultados de estos búferes pueden ser tri-dijo, lo que
        significa que sus resultados se puede dejar aislados o "flotantes", evitando así problemas
        con el hardware conectado a los pines de programación.
FISEI




        Este programador simple puede ser construido sobre un trozo de Vakelita..



                                                                                                     8
                Octavo Electrónica 2009 – 2010                       FISEI - UTA
El software de programación
        Obtener TWinAVR.

        Este es el software que se comunica a través del hardware de programación se realizó
        con el controlador de AVR. Les recomendamos que usen el TWinAVR hecho por
        Ronald Walter. Ir a su página web, en la columna de la izquierda, seleccione
        microcontrolador, seleccione Programador, lea el texto (que usted aprenderá algunas
        TWinAVR alemán!) Y descargar.

        TWinAVR de instalación

        TWinAVR tiene que ser configurado para usar el Vcc generados por algunos pines del
        puerto paralelo para cambiar el buffer.
FISEI




                Octavo Electrónica 2009 – 2010                   FISEI - UTA                   9
Iniciar TWinAVR, haga clic en el logo de TWinAVR en la esquina superior izquierda,
        haga clic en el Ajuste.




        Se aparecerá la siguiente ventana, para configurar el software.




        En esta ventana desactive la casilla Vcc. Esto significa que sólo se genera Vcc
        TWinAVR mientras está activo. Si a continuación, utilizar esta Vcc para cambiar el
        buffer 74HCT244, el bufferports será aislado TWinAVR cuando no está activo, dando
        lugar a "En la programación del sistema. Aproveche esta oportunidad para comprobar la
        configuración en paralelo: si el puerto no está en el estándar de la dirección "y 378",
        (comprobarlo en la BIOS del PC si es necesario) cambiar la configuración LPT en
        consecuencia.
FISEI




                Octavo Electrónica 2009 – 2010                       FISEI - UTA                  10
Obtener Userport si es necesario

        Si está utilizando Windows NT, 2000 o XP, TWinAVR no tendrán acceso directo al
        puerto paralelo. Una solución es usar un programa piloto especial que proporciona
        acceso directo. Uno de ellos es un programa de Userport. Debe ser instalado y la
        configuración antes de utilizar TWinAVR. En primer lugar, Userport descarga.
        Descomprima en un directorio, y Userport.sys copia de este directorio C:  Windows 
        System32  Drivers. Leer Userport.pdf. Userport.exe de inicio.




        La ventana principal muestra la configuración predeterminada. Asumiendo que su
        puerto paralelo está en "y 378", sólo es necesario la primera entrada en la ventana de la
        izquierda para permanecer. En la ventana izquierda, seleccione 3BC-3BF y 3E8-3FF y
        haga clic en Eliminar. Repita este paso para todas las entradas en la ventana derecha.
FISEI




                Octavo Electrónica 2009 – 2010                      FISEI - UTA                     11
Lo que queda es 200-37F en la ventana izquierda. Click on Start. Haga clic en Iniciar.
        Userport ahora activa la dirección seleccionada gama para usted y lo harán cada vez que
        enciendes tu PC. Si necesita utilizar el puerto paralelo para otros fines, por ejemplo una
        impresora, debe iniciar el programa de Userport y haga clic en Detener. El conductor
        será cancelada.

        Configurar TWinAVR Bascom

        Bascom compila código básico en un "Bin'-archivo. Esta caja-archivo contiene las
        instrucciones de AVR en el llamado código de máquina, lo que el controlador de AVR
        puede ejecutar directamente. Usted puede utilizar un programador externo para escribir
        esta caja de archivo en la memoria flash del AVR. El programador externo, a su vez, es
        controlado a través de un programa separado como TWinAvr. TWinAvr le permite
        seleccionar el archivo HEX que debe enviar al AVR. Sin embargo, es mucho más fácil
        si Bascom directamente TWinAvr podría comenzar después de la compilación está
        terminada y decirle que TWinAvr hex-archivo para su uso.
        Esto se puede hacer en Bascom como sigue:

        Inicio Bascom, seleccione Opciones / Programador




               Externo Seleccione 'programador' de la lista de los programadores
               Seleccione la pestaña "Otros"
               Entrar en el "programa" campo de la localización de su software de
               programación, TWinAvr.exe en nuestro caso. Utilice el.
FISEI




               Introduzca en el campo "Parámetro ': (archivo)




                Octavo Electrónica 2009 – 2010                       FISEI - UTA                     12
Esto le dice a Bascom para iniciar TWinAvr con el nombre de la bandeja de archivo, se
        produce después de que la compilación fue exitosa:




        A continuación, haga clic en Aceptar.




            PROGRAMACIÓN BÁSICA PARA HACER PARPADEAR LEDs CON
           INTERVALOS DE 1 SEGUNDO POR MEDIO DE TODO EL PUERTO B.

        Este es el programa con el cual iniciaremos nuestro primeros pasos en el mundo de los
        AVR, este programa te enseñara a configura los puertos de nuestro microcontrolador.

        En primer lugar, configurar Bascom para iniciar TWinAvr con el nombre correcto de la
        bandeja de archivo se produce después de una compilación exitosa.
        A continuación, proceder como sigue

               Inicio Bascom
               Seleccione Archivo / Nuevo
FISEI




                Octavo Electrónica 2009 – 2010                    FISEI - UTA                   13
En el textwindow que aparece, entrar en el programa de bases siguientes:




        “El atmega8 posee 8kb de memoria flash, 512 bytes eçde EEPOM, y 1KB de
        SRAM, posee 2 timers, 2 de 8 bits y uno de 16 bits…Posee un reloj de tiempo real
        (RTC) con oscilador externo.. y 6 canales de ADC… y por supuesto comunicación
        serial…”

        (A medida que escribe Bascom va a cambiar el texto del programa de color de acuerdo a
        las palabras clave que reconoce).
        En este simple de los programas, PORTB del AVR ATMEGA8 por primera vez
        configurado para funcionar como una salida. PORTB Entonces se establece en el valor
        decimal 255. Los ocho bits de PORTB se establece ahora en valor binario "uno". Tenga
        en cuenta que sólo la parte inferior de siete bits están disponibles en el exterior como
        alfileres PB0 hasta PB6. Si se conecta cualquiera de estos pines a un LED con un
FISEI




        resistor limitador de corriente a tierra, la corriente fluirá desde el AVR a los LED. El
        LED está encendido. Después de esperar durante 1000 milisegundos, PORTB se


                                                                                                   14
                Octavo Electrónica 2009 – 2010                      FISEI - UTA
establece en el valor decimal 0. Ahora, todos los pines se establecen en el valor binario
        de "cero" y no pasará corriente del AVR a los LED. El LED está apagado. Después de
        esperar otros 1000 milisegundos, se repite el ciclo. El resultado es que el LED
        encenderse y apagarse.
        Después de introducir el texto del programa, seleccione Archivo / Guardar como y
        seleccione una ubicación y un nombre para el archivo. Supongamos que usted
        seleccione 'ledflasher.bas' como un nombre de archivo. Como Bascom genera gran
        cantidad de archivos después de una compilación, es una buena idea crear directorios
        separados para cada proyecto Bascom que trabajar.
        Bascom ahora se puede contar acerca de su configuración del controlador de AVR.
        Seleccione Opciones / Compiler / Chip




        El chip está predeterminado a ATMEGA 8:
FISEI




                Octavo Electrónica 2009 – 2010                      FISEI - UTA                     15
Ahora, seleccione la pestaña de Comunicación:




        Por defecto, la velocidad de reloj es de 4MHz, pero como usamos un cristal de 1MHz,
        seleccione 1000000 de la lista de «frecuencia»




        Después se guarda el archivo, seleccione Program / Compile (F7).
FISEI




                Octavo Electrónica 2009 – 2010                    FISEI - UTA                 16
A continuación les dejo el circuito simulado, con el cual pueden ver funcionamiento de
        nuestro primer programa creado.
        Para simular necesitamos cualquier software dedicado a la electrónica que posea las
        librerías de AVR, yo use el software Proteus, lo puedes bajar de www.4shared.com.




        Ahora vamos a aprender como configurar cada bit de los diferentes puertos como salida
        o entrada, para ello vamos a realizar el siguiente ejemplo.
FISEI




                Octavo Electrónica 2009 – 2010                    FISEI - UTA                    17
FISEI




        Octavo Electrónica 2009 – 2010   FISEI - UTA
PROGRAMA BÁSICO PARA HACER PARPADEAR UN
              LED CON INTERVALOS DE 1 SEGUNDO.
        Este proyecto es muy parecido al que lo vimos anteriormente, si usted no ha leído todo
        el folleto, hágalo.


        ' Indico al compilador que micro voy a usar
        $regfile = "m8def.dat"
        ' Cristal interno de 1MHz
        $crystal = 1000000
        '*******************************************************************
        '*ENE STE EJEMPLO VAMOS A REALIZAR EL PARPADEO DE LOS LEDS... PERO VAMOS
        '*VAMOS A VER COMO SE PUEDE CONFIGURAR BIT A BIT EL I/O DE UN PUERTO....
        '*PARA ESTO VAMOS A USAR EL COMANDO DDR.... EL CUAL DEBE IR ACOMPAÑADO
        DEL
        '*COMANDO PORT......
        '*ACA UNA BREVE DESCRIPCION DE ESTOS COMANDOS..

        '*** DDBn PORTBn E/S Pull up     Comment
        '*** 0   0 Entrada No   Tercer estado (Alta impedancia)
        '*** 0   1 Entrada Yes  PBn
        '*** 1   0 Salida  No  Push-Pull Salida en Cero
        '*** 1   1 Salida  No  Push-Pull Salida en Uno

        '* DECIR BREVEMENTO QUE DEPENDIENDO DE LOS VALORES QUE DEMOS A ESTOS
        PARAMETROS
        '* OBTENDREMOS SALIDAS O ENTRADAS EN UN PUERTO...
        '* PARA ESTE EJEMPLO VAMOS A CONFIGURAR BIT A BIT EL PORTB PARA QUE SEAN
        SALIDAS EN 0             '* LOGICO
        '* POR LO QUE LOS VALORES DEBEN SER DDRn 1 Y PORTn 0..
        '* Configuro todo el puerto B.0 como salida
        Ddrb.0 = 1
        Portb.0 = 0
        ' Nombre de subrutina
        Parpadear:
           ' Activar el puerto B.0
           Portb.0 = 1
           ' Espero 1 segundo
           Wait 1
           ' Apagar el puerto B.0
           Portb.0 = 0
           ' Espero 1 segundo
           Wait 1
        ' ir a la subrutina parpadear
        Goto Parpadear
        End
FISEI




                Octavo Electrónica 2009 – 2010                    FISEI - UTA                    18
Una vez escrito el programa compilamos y grabamos el AVR, si no sabe como hacerlo
        recordamos leer las páginas anteriores, no olvide dejar conectado como ilustra la figura
        siguiente:




        Una vez realizado este proyecto siga intentando con diferentes tiempos de Wait,
        recuerde que son en segundos, pruebe Wait 3 verá que el parpadeo es mas lento, así
        mismo ponga diferentes valores entre los 2 Wait, vera diferentes efectos. Si desea
        tiempos mas pequeños debe usar Waitms, este se mide en milisegundos.

                  UN SEMAFORO DE DOS INTERSECCIONES.
        Este es el ejemplo ideal para entender como asignar nombres a los diferentes bits de los
        puertos, para ello usaremos un grupo de leds y manejaremos todo el puerto, existe otra
        forma de realizar este proyecto, es controlando el puerto como un todo, para que
        entiendan lo que digo, voy a realizar de las dos formas el programa.


         ' Indico al compilador que micro voy a usar
         $regfile = "m8def.dat"
         ' Cristal interno de 1MHz
         $crystal = 1000000
         ' Configuro todo el puerto B.0 como salida
         Config Portb = Output

         ' Nombre de subrutina
         Semaforo:
           Portb = 33
           Wait 9
           Portb = 34
           Wait 3
           Portb = 12
           Wait 9
FISEI




           Portb = 20
           Wait 3
         Goto Semaforo
         End



                 Octavo Electrónica 2009 – 2010                     FISEI - UTA                    19
Bien es momento de escribir el programa, empecemos de la forma que se maneja el
        puerto completo, para esto debemos entender como trabaja los semáforos. Primero
        nunca se encienden las luces del mismo color, es decir no puede estar en el un semáforo
        verde y en el otro verde también existe un cambio de verde a amarillo mientras en el
        otro semáforo sigue en rojo, en el momento que se pone en rojo el primer semáforo el
        segundo salta de rojo a verde.
        Por considerar que esta es una practica, pondremos tiempos estimados de cambio de
        color, de verde a amarillo durante 9 segundos, de amarillo a rojo solo 3 segundos.

         ' Indico al compilador que micro voy a usar
         $regfile = "m8def.dat"
         ' Cristal interno de 1MHz
         $crystal = 1000000
         ' Configuro todo el puerto B.0 como salida
         Config Portb = Output
         ' asigno nombres a los bit del puertoB
         Verde2 Alias Pinb.0
         Amarillo2 Alias Pinb.1
         Rojo2 Alias Pinb.2
         Verde1 Alias Pinb.3
         Amarillo1 Alias Pinb.4
         Rojo1 Alias Pinb.5
         ' Nombre de subrutina
         Semaforo:
            Rojo1 = 1 : Verde2 = 1
            Wait 9
            Verde2 = 0 : Amarillo2 = 1
            Wait 3
            Amarillo2 = 0
            Rojo1 = 0
            Verde1 = 1
            Rojo2 = 1
            Wait 9
            Verde1 = 0 : Amarillo1 = 1
FISEI




            Wait 3
         Goto Semaforo
         End



                 Octavo Electrónica 2009 – 2010                    FISEI - UTA                    20
Es esta otra manera de escribir el programa, noten que es más largo que el primer
        programa, y además colocamos Alias a los diferentes bits del puerto B.

        Rojo1 = 1
        Verde1 = 1
        Podemos escribirlo asi:
        Rojo1 = 1 : Verde1 = 1

                      JUEGO DE LUCES PARA DISCOTECA
        Este proyecto propone familiarizar aún más con el manejo de los puertos, esta vez
        vamos a utilizar las 8 salidas del puerto B, se trata de una secuencia de luces que deben
        encender de izquierda a derecha una tras otra con un intervalo de 200 mili segundos.
        En la figura siguiente se muestra como conectar cada uno de los leds.




        A continuación, en el siguiente programa veremos una declaración nueva el GOSUB y
        el RETURN, estos sirven para cuando tenemos muchas repeticiones de una línea o
        grupo de líneas de programa, en nuestro caso el Wait, en vez de poner en cada cambio
        de estado de las luces, lo agrupamos en una sola subrutina y lo llamaremos las veces
        que queramos, la declaración RETURN lo envía de regreso a continuar después del
        GOSUB que lo envió. Una de las ventajas mas importantes que tenemos es que ahorra
        espacio en el AVR, y otra que si queremos cambiar el Wait por el de otro valor, basta
        con cambiar una sola vez y el cambio se ejecuta para todos, lo que al contrario si no lo
        utilizaremos el GOSUB y escribiríamos 30 Wait, deberíamos cambiarlo a los 30 Wait
        por el de otro valor, un ejemplo sería:
FISEI




                Octavo Electrónica 2009 – 2010                      FISEI - UTA                     21
$regfile = "m8def.dat"
         $crystal = 1000000
         Config Portb = Output

         Discoteca:
         Portb = 1
         Gosub Pause
         Portb = 2
         Gosub Pause
         Portb = 4
         Gosub Pause
         Portb = 8
         Gosub Pause
         Portb = 16
         Gosub Pause
         Portb = 32
         Gosub Pause
         Portb = 64
         Gosub Pause
         Portb = 128
         Gosub Pause
         Goto Discoteca

         Pause:
          Waitms 300
         Return
         End



        Nota: La ubicación de la subrutina Pause, es importante, fíjense que se encuentra
        después y fuera de las líneas principales de programación, si esta misma subrutina lo
        colocáremos al principio del programa, de seguro se nos cuelga por que al encontrar el
        RETURN simplemente no sabe a donde retornar ya que nadie lo ha enviado aún.



               EJERCICIO CON LA INSTRUCCIÓN FOR NEXT

        Este proyecto es muy importante encenderlo, ya que el siguiente proyecto de luces de
        auto fantástico utilizando la declaración FOR NEXT.
        Esa declaración sirve para ejecutar un número n de veces una línea de programa o grupo
        de líneas de programa, el siguiente proyecto pretende encender un led en el puerto B.0 5
        veces con intervalo de medio segundo segundo, después debe detenerse por 2 segundos
        y luego parpadear 3 veces mas, detenerse por 3 segundos y luego repetir nuevamente el
        proceso, se puede utilizar el proto que se armo para las luces de discoteca ya que el
        mismo nos servirá después para el siguiente proyecto el de las luces del auto fantástico,
        FOR NEXT se utiliza de la siguiente manera:
FISEI




                 Octavo Electrónica 2009 – 2010                     FISEI - UTA                     22
Dim Peter As Byte        ; Primero se crea y asigna un tamaño para la variable peter
        FOR Peter = 1 to 5       ; Ejecuta las siguientes instrucciones 5 veces hasta donde dice
        NEXT
        ……..                     ; una vez concluido las repeticiones continúa con la declaración
        que está
        ……..                     ; después del NEXT, peter debe ser creado como variable, es decir
        NEXT                     ; asignarle un espacio en la memoria en este caso para 5.

        LAS VARIABLES BIT, BYTE Y WORD.
        Estas son creadas para guardar datos en la memoria RAM (Random Access Memory) o
        memoria de acceso casual, esta memoria trabaja únicamente mientras esté alimentado
        el AVR, una vez que el AV R es desconectado, los datos de la memoria RAM se borran.


        Dim Repe As Bit  ; crea una variable y asigna un tamaño de un bit, es decir 0 o 1
        Dim Repe As Byte ; crea una variable y asigna un tamaño de 8 bits, es decir 0 a 255
        Dim Repe As Word ; crea una variable y asigna un tamaño de 2 bytes, es decir 0 a
        65535

        Para nuestro caso como queremos hacer 5 repeticiones, nos corresponde crear un BYTE
        que nos permite almacenar un número hasta 255.


         $regfile = "m8def.dat"
         $crystal = 1000000
         Config Portb = Output
         Led1 Alias Pinb.0
         ' creo una variable llamada Repe con
         ' longitud BYTE
         Dim Repe As Byte
         Programa:
         ' ciclo FOR
         For Repe = 1 To 5
            Led1 = 1
            Waitms 500
            Led1 = 0
            Waitms 500
         Next
            Wait 2
         For Repe = 1 To 5
            Led1 = 1
            Waitms 500
            Led1 = 0
            Waitms 500
         Next
         Wait 3
         Goto Programa
         End
FISEI




                 Octavo Electrónica 2009 – 2010                       FISEI - UTA                    23
LUCES DEL AUTO FANTÁSTICO (DESPLAZAMIENTOS)
        Este proyecto es muy similar al de las luces para discoteca, con la diferencia de que este
        se enciende de izquierda a derecha y luego de derecha a izquierda, pensaríamos que el
        programa será el doble del tamaño que el que hicimos paira las luces de discoteca, pero
        no es así, recuerde que existen varios caminos para llegar a un mismo objetivo, y este es
        uno de ellos, esta vez utilizaremos los desplazamientos, que no son nada más que
        recorrer un uno lógico a la izquierda o - Derecha de la salida de los puertos.
        Los desplazamientos utiliza la multiplicación y la división, como sabemos el AVR
        trabaja con el sistema binario, si tenemos una variable X con un valor inicial de 1
        (%00000001) y lo Multiplicáramos por 2 . el resultado sería 2 (%00000010),y este a su
        vez lo volveríamos a multiplicar por 2 el resultado sería 4 (%00000100), y así
        sucesivamente hasta llegar a 128, en le en binario sería (% 10000000), veríamos que los
        leds se enciende de la misma forma que las luces para discoteca, para hacer que las
        luces se regresen hasta el puerto B.0 debemos dividir para 2, entonces 128 / 2 es igual a
        64 (%01000000), como podemos ver ahora está regresando a su lugar de origen, los
        desplazamientos se escribe de la siguiente manera:

        Rotate Portb , Left ;desplaza a la izquierda un bit en el puerto
        Rotate Portb , Right ;desplaza a la derecha un bit en el puerto

        Entendido como funcionan los desplazamientos desarrollamos el siguiente programa:


         $regfile = "m8def.dat"
         $crystal = 1000000
         Config Portb = Output
         ' creo una variable llamada I con
         ' longitud BYTE
         Dim I As Byte
         Portb = 1
         Programa:
         ' ciclo FOR
            For I = 1 To 7
              Rotate Portb , Left
              Waitms 150
            Next
            For I = 1 To 7
              Rotate Portb , Right
              Waitms 150
            Next
         Return

         Goto Programa
         End
FISEI




        Nota: No olvide cargar al Puerto con 1, porque si no lo hace significa que vale cero (0)
        y esto multiplicado por 2 siempre dará cero, en consecuencia nunca veríamos el
        desplazamiento.


                 Octavo Electrónica 2009 – 2010                      FISEI - UTA                     24
EJERCICIOS CON PULSADORES
        Para esta practica debemos entender como funciona los pulsadores con el AVR, existe
        básicamente 2 tipos de conexión para los pulsadores, el que siempre está en 1 lógico
        (5V) y cuando es pulsado cambia a cero lógico (0V), y el que está en cero lógico y
        cuando pulsamos para a uno lógico, los siguientes son los diagramas de conexión.




        LA DECLARACION IF… THEN.

        Esta sirve de condicionante, si es verdadera ejecuta la operación que sigue al THEN, y
        si es falsa a la siguiente línea después del THEN, existen varias formas de aplicación.

         IF porb.0 = 0 THEN Michu ; ir a Michu si la entrada Portb.0 es cero lógico


         IF porb.0 = 1 THEN Gato      ; ir a Gato si la entrada Portb.0 es uno lógico


         IF porb.0 = 0 THEN           ; Si la comparación es verdadera ejecuta todo el
                Porta.0 = 1           ; contenido que se encuentra entre el THEN y el
                Wait 1                ; END IF
                Porta.0 = 0
         ENDIF
FISEI




                Octavo Electrónica 2009 – 2010                       FISEI - UTA                  25
IF porb.0 = 0 THEN            ; Si la comparación es verdadera ejecuta todo el
                ……….                   ; contenido que se encuentra entre el THEN y el
                ELSE                   ; ELSE y si es falsa ejecuta el contenido entre
                ……….                   ; ELSE y END IF
         ENDIF


         IF pato > 10 THEN Majo        ; si la variable pato es mayor que 35 ejecuta Majo



        El siguiente es el diagrama de conexión para esta práctica del pulsador:




        Diagrama de conexión de un pulsador conectado en el puerto B0, de estado 1 lógico, en
        el momento que es presionado este desvía la tensión hacia tierra, por lo que el AVR
        detecta un cambio de estado a cero lógico, en ese instante se enciende el led.

        A continuación el programa en Basic para leer el estado de un pulsador:
FISEI




                Octavo Electrónica 2009 – 2010                       FISEI - UTA                26
' Indico al compilador que micro voy a usar
         $regfile = "m8def.dat"
         ' Cristal interno de 1MHz
         $crystal = 1000000
         '*******************************************************************
         '*** ENE STE EJEMPLO VAMOS A REALIZAR EL PARPADEO DE LOS LEDS... PERO VAMOS
         '*** VAMOS A VER COMO SE PUEDE CONFIGURAR BIT A BIT EL I/O DE UN PUERTO....
         '*** PARA ESTO VAMOS A USAR EL COMANDO DDR.... EL CUAL DEBE IR ACOMPAÑADO DEL
         '*** COMANDO PORT......
         '*** ACA UNA BREVE DESCRIPCION DE ESTOS COMANDOS..

         '*** DDBn PORTBn E/S Pull up      Comment
         '*** 0   0 Entrada No   Tercer estado (Alta impedancia)
         '*** 0   1 Entrada Yes  PBn
         '*** 1   0 Salida  No  Push-Pull Salida en Cero
         '*** 1   1 Salida  No  Push-Pull Salida en Uno

         '*** DECIR BREVEMENTO QUE DEPENDIENDO DE LOS VALORES QUE DEMOS A ESTOS
         '*** PARAMETROS OBTENDREMOS SALIDAS O ENTRADAS EN UN PUERTO...
         '*** PARA ESTE EJEMPLO VAMOS A CONFIGURAR BIT A BIT EL PORTB PARA QUE
         '*** SEAN SALIDAS EN 0 LOGICO
         '*** POR LO QUE LOS VALORES DEBEN SER DDRn 1 Y PORTn 0..

         ' Configuro todo el puerto B.0 como entrada, con resistencia push pull
         Ddrb.0 = 0
         Portb.0 = 0
         ' Configuro todo el puerto C.0 como salida
         Ddrc.0 = 1
         Portc.0 = 0

         Programa:
         If Pinb.0 = 0 Then Goto Encender
         Goto Programa

         Encender:
         Portc.0 = 1
         Wait 3
         Portc.0 = 0
         Goto Programa
         End




        CONTADOR BINARIO CON PULSADOR ANTIRREBOTE
        En esta práctica haremos un contador binario, el resultado lo veremos en código binario
        a través de 8 leds conectados al puerto B. Para esta practica necesita poner un
        antirrobote al pulsador, ya que si presiona por un instante, dada la velocidad que procesa
        el AVR el programa se ejecutara varias veces hasta que suelte el pulsador, para aprender
        de los errores haga el programa sin antirrobote y luego con antirrobote.
FISEI




                 Octavo Electrónica 2009 – 2010                                   FISEI - UTA        27
$regfile = "m8def.dat"
         $crystal = 1000000
         Ddrc.0 = 0
         Portc.0 = 1
         Config Portb = Output
         Dim Num As Byte
         Num = 0

         Pulsar:
         Portb = Num
         If Pinc.0 = 0 Then Goto Contar
         Goto Pulsar
         Contar:
         Num = Num + 1
         Goto Pulsar
         End



        Si tuvo la oportunidad de ver funcionando este proyecto, se dará cuenta que cada que se
        pulsa el botón el contador aumenta demasiado, esto es como se dijo antes por el AVR
        trabaja a gran velocidad cada instrucción y cuando una persona presione el botón, por lo
        menos necesita de 100ms de tiempo para soltarlo, en este tiempo el AVR ya sumo
        alrededor de 25000 veces. Para solucionar este problema proponemos hacer un
        programa de antirrobote de tecla, en el cual si presionamos el botón, este envía a un
        programa que lo mantiene encerrado, únicamente sale de esta subrutina en el momento
        que el pulsador deja de ser presionado, a continuación incluimos un WAITMS 200, que
        es necesario para que en el momento de soltar la tecla se estabilice la señal.

         $regfile = "m8def.dat"
         $crystal = 1000000
         Ddrc.0 = 0
         Portc.0 = 1
         Config Portb = Output
         Dim Num As Byte
         Num = 0

         Pulsar:
         Portb = Num
         If Pinc.0 = 0 Then Goto Contar
         Goto Pulsar

         Contar:
         If Pinc.0 = 0 Then Goto Contar
         Waitms 200
         Num = Num + 1
         Goto Pulsar
         End




        Para conocer más sobre los operadores matemáticos disponible como: resta
FISEI




        multiplicación, división, etc. Existentes en el Software BASCOM, se recomienda ver la
        ayuda del software.



                 Octavo Electrónica 2009 – 2010                     FISEI - UTA                    28
LED INTERMITENTE DE VELOCIDAD VARIABLE
        Este proyecto se basa en dos pulsadores, el primero para aumentar la frecuencia del
        parpadeo del led, y el segundo para disminuir la frecuencia de parpadeo. Para esto
        utilizaremos dos operadores matemáticos, la suma y la resta, la suma incrementa las
        repeticiones de una instrucción FOR…NEXT, que contiene un WAITMS 5, mientras
        que la resta disminuirá las repeticiones del mismo wait. Debemos tener en cuenta que
        una variable BYTE no puede exceder su contenido a mas de 255. ni tampoco pasar a
        valores negativos al ser restado consecutivamente, si excediera el valor a mas de 255, el
        mismo se carga con valor de cero, y viceversa si el resultado de la resta pasara a
        negativo, la variable se carga con 255.


         $regfile = "m8def.dat"
         $crystal = 1000000
         Ddrb.0 = 0
         Portb.0 = 1
         Ddrb.1 = 0
         Portb.1 = 1
         Ddrc.0 = 1
         Portc.0 = 0

         Led Alias Portc.0
         ' Pbaja Portb.1
         ' Psube Portb.0
         Dim Xy As Byte
         Dim Veces As Byte
         Veces = 100
         Inicio:
         Led = 1
         Gosub Tim
         Led = 0
         Gosub Tim
         Goto Inicio
         Tim:
         If Pinb.0 = 0 Then Gosub Restar
         If Pinb.1 = 0 Then Gosub Sumar
         For Xy = 1 To Veces
         Waitms 5
         Next
         Return
         Sumar:
         If Veces > 150 Then Return
         Veces = Veces + 5
         Return
         Restar:
         If Veces < 10 Then Return
         Veces = Veces - 5
         Return
         End
FISEI




                 Octavo Electrónica 2009 – 2010                     FISEI - UTA                     29
PROYECTO CON DISPLAYS

         MANEJO DE UN DISPLAY DE 7 SEGMENTOS CON EL
                           CI.7447
        Los display son muy utilizados para visualizar datos. Para esta práctica se utiliza como
        periférico de salida un display tipo ánodo común, para lo cual se facilita el diagrama en
        la figura siguiente. El proyecto consiste en hacer un contador decimal (0,…,9), con
        intervalos de 0.5 segundos.
        El programa es muy similar al contador binario, con la diferencia que solo se necesita 4
        bits del puerto, el decodificador binario a 7 segmentos (7447), es encargado de
        transformar el número binario que ingresa al número decimal.


         $regfile = "m8def.dat"
         $crystal = 1000000
         Config Portc = Output
         Dim Numero As Byte
         Encerar:
         Numero = 0

         Visualizar:
         Portc = Numero
         Waitms 500
         If Numero = 9 Then Goto
         Encerar
         Numero = Numero + 1
         Goto Visualizar
         End



          UN CONTADOR DECIMAL DE UN DIGITO CON EL CI
                     7447 Y UN PULSADOR
        Adicionando al proyecto anterior un pulsador se hace un contador manual de un digito.
        No se olvide hacer un programa antirrobote de tecla, por el caso expuesto
        anteriormente.

        El diagrama de este proyecto es el mismo de la figura anterior, pero adicionando un
        pulsador de estado uno lógico en el puerto B.0.
FISEI




                 Octavo Electrónica 2009 – 2010                     FISEI - UTA                     30
$regfile = "m8def.dat"
        $crystal = 1000000
        Config Portc = Output
        Ddrb.0 = 0
        Portb.0 = 1
        Dim Numero As Byte
        Encerar:
        Numero = 0
        Visualizar:
        Portc = Numero
        If Pinb.0 = 0 Then Goto
        Aumentar
        Goto Visualizar

        Aumentar:
        If Pinb.0 = 0 Then Goto
        Aumentar
        Waitms 200
        If Numero = 9 Then Goto Encerar
        Numero = Numero + 1
        Goto Visualizar
        End



           MANEJO DE UN DISPLAY DE 7 SEGMENTOS SIN EL
                             CI.7447
        Como se sabemos, al AVR se le puede programar para reemplazar a casi cualquier
        circuito integrado, en esta ocasión haremos que le propio AVR sea como el CI.7447,
        para esto debemos saber que para sacar el numero 3 por ejemplo, debemos calcular el
        numero decimal que hace que se enciendan los segmentos correctos del display, esto se
        hace de la siguiente forma.
        Como debemos encender los segmentos a, b, c, d y g. revisamos los pintes del AVR que
        les corresponde y estos son: B0, B1, B2, B3 y B6, respectivamente, estos debemos
FISEI




        ponerlos en cero lógicos para que los segmentos se enciendan (recuerde que el display
        es ánodo común), y los demás 1 lógico para que permanezcan apagados:


                 Octavo Electrónica 2009 – 2010                   FISEI - UTA                   31
DECLARACIÓN LOOKUP
        Sirve para obtener un valor constante de una tabla, esto lo hace según el número de
        veces que repita el FOR…NEXT, por ejemplo la primera vez toma el dato que se
        encuentra en el lugar 0, la segunda vez, toma el dato del lugar 1 y así sucesivamente.




         $regfile = "m8def.dat"
         $crystal = 1000000
         Config Portd = Output
         Dim I As Byte

         Prog:
         For I = 0 To 5
           Portd = Lookup(i , Secuencia)
           Waitms 500
         Next
         Goto Prog
         End
         Secuencia:
         Data &B1000000 , &B1111001 , &B0100100 , &B0110000 , &B0011001 , &B0010010




            MANEJO DE 4 DISPLAY DE7 SEGMENTOS CON EL
                              CI.7447
        El siguiente proyecto debe encender 4 display para poder mostrar cualquier numero de 0
        hasta el 9999, esto lo conseguimos gracias al transistor tipo PNP, que nos ayudara a
        multiplexar cada uno de los displays, el funcionamiento es bastante sencillo, debemos
        conectar los 4 bits mas altos a cada transistor y los cuatro bits mas bajos al CI 7447, si
        por ejemplo queremos sacar el numero 6874, primero habilitamos el cuarto transistor, el
        de la derecha y enviamos el número 4, el CI 7447 se encargara de formar el numero 4
        en el display, luego pasamos a cero lógico el segundo transistor y los demás los
FISEI




        mantenemos en nivel alto, al mismo tiempo sacamos el numero 7 por los bits menos
        significativos del puerto B, y así consecutivamente, el tiempo que debemos mantener



                 Octavo Electrónica 2009 – 2010                      FISEI - UTA                     32
activado cada transistor no puede ser mayor que 5 mili segundos, es decir que los
        cambios son tan rápidos que el ojo humano ve todos los display encendidos al mismo
        tiempo, cuando en realidad solo se encienden uno a la vez.

        Ejemplo: para sacar el número 8 en las centenas debemos sacar (176 + 8), es decir el
        número 184 porque si analizamos en código binario, tenemos que los bits mas bajos
        entran al CI 7447, y los bits mas altos, son los encargados de encender el display que le
        corresponden a las centenas.




         $regfile = "m8def.dat"
         $crystal = 1000000
         Config Portd = Output
         Visualizar:
         ' activo transistor de unidades y presento el 1
         Portd = 224 + 1
         Waitms 5
         ' activo transistor de decenas y presento el 2
         Portd = 208 + 2
         Waitms 5
         ' activo transistor de centenas y presento el 3
         Portd = 176 + 3
         Waitms 5
FISEI




         ' activo transistor de miles y presento el 4
         Portd = 112 + 4
         Waitms 5
         Goto Visualizar
         End


                  Octavo Electrónica 2009 – 2010                    FISEI - UTA                     33
CONTADOR DECIMAL DE 4 DIGITOS CON EL CI.7447




        Es hora de hacer un proyecto de considerable tamaño, una vez entendido como
        multiplexar 4 displays, y entendido el ejercicio del contador, pues el siguiente proyecto
        consta en hacer un contador decimal que incremente su valor cada vez que se pulsa el
        botón A, si pulsamos el botón B se encera y se apaga la chicharra, y si pulsamos la tecla
        C, presenta el numero al cual va a comparar, si el numero a contar es igual a 24, activa
        un aviso auditivo, este buzzer trabaja a 12 Voltios, lo que diferencia de los parlantes
        comunes es que no necesita ser activado con una frecuencia, sino basta con alimentarle
        con 12 voltios para que suene.

         $regfile = "m8def.dat"
         $crystal = 1000000
         Config Portd = Output
         Ddrc.0 = 1
         Portc.0 = 0
         Ddrc.1 = 0
         Portc.1 = 1
         Ddrc.2 = 0
         Portc.2 = 1
         Ddrc.3 = 0
         Portc.3 = 1

         Dim Unid As Byte
         Dim Dece As Byte
         Dim Cent As Byte
FISEI




         Dim Mile As Byte




                 Octavo Electrónica 2009 – 2010                     FISEI - UTA                     34
Dim Setunid As Byte
        Dim SetDece As Byte
        Dim SetCent As Byte
        Dim Setmile As Byte
        Setunid = 4
        Setdece = 2
        Setcent = 0
        Setmile = 0
        Dim Activar As Bit
        ' chicha Portc.0
        ' Contar Portc.1
        ' Encerar Portc.2
        ' visualizar Portc.3
        Portc.0 = 1
        Waitms 200
        Encerar:
        Unid = 0
        Dece = 0
        Cent = 0
        Mile = 0
        Portc.0 = 0
        Visualizar:
        Portd = 224 + Unid
        Waitms 5
        Portd = 208 + Dece
        Waitms 5
        Portd = 176 + Cent
        Waitms 5
        Portd = 112 + Mile
        Waitms 5
        Gosub Teclas
        Goto Visualizar
        Teclas:
        If Pinc.1 = 0 Then Gosub Sumar
        If Pinc.2 = 0 Then Gosub Encerar
        If Pinc.3 = 0 Then Gosub Visualizar2
        Activar = 1
        Return
        Sumar:
        If Activar = 0 Then Return
        Activar = 0
        Unid = Unid + 1
        If Unid < 10 Then Goto Comparar
        Unid = 0
        Dece = Dece + 1
        If Dece < 10 Then Goto Comparar
        Dece = 0
        Cent = Cent + 1
        If Cent < 10 Then Goto Comparar
        Cent = 0
        Mile = Mile + 1
        If Mile < 10 Then Goto Comparar
        Mile = 0
        Return
        Visualizar2:
        Portd = 224 + Setunid
        Waitms 5
        Portd = 208 + setDece
        Waitms 5
        Portd = 176 + setCent
        Waitms 5
        Portd = 112 + setMile
        Waitms 5
        Return
        Comparar:
        If Unid = Setunid And Dece = Setdece And Cent = Setcent And Mile = Setmile Then
        Portc.0 = 1
        Else
        Return
        End If
FISEI




        End




                  Octavo Electrónica 2009 – 2010                                          FISEI - UTA   35
MANEJO DE 4 DISPLAYS DE 7 SEGMENTOS SIN EL
                      CI.7447 (ROTULACIÓN)
        Es posible hacer un contador decimal igual que el del proyecto anterior y sin ayuda del
        CI, 7447, pero en esta ocasión haremos mas que eso, como vieron la ventaja de conectar
        el display directamente al AVR es la de poder sacar casi la mayoría de las letras del
        alfabeto, pues bien este proyecto consiste en sacar la palabra HOLA a través de los 4
        displays.




         $regfile = "m8def.dat"                        ' %1011 activa el siguiente display
         $crystal = 1000000                            Portd = 11
         Config Portd = Output                         ' forma la letra O
         Config Portb = Output                         Portb = 64
         Texto:                                        Waitms 5
         ' %1110 activa el display de la derecha       ' %0111 activa el siguiente display
         Portd = 14                                    Portd = 7
         ' forma la letra A                            ' forma la letra H
         Portb = 8                                     Portb = 9
         Waitms 5                                      Waitms 5
         ' %1101 activa el siguiente display           Goto Texto
         Portd = 13                                    End
         ' forma la letra L
         Portb = 71
         Waitms 5
FISEI




                 Octavo Electrónica 2009 – 2010                      FISEI - UTA                  36
MANEJO DE 4 DISPLAYS CON ROTULO EN
                             MOVIMIENTO
        Para hacerlo mas interesante el proyecto anterior, le añadiremos movimiento, con esto
        podemos ingresar frases completas como “HOLA LUIS”, pero para no alargar mucho el
        programa solo utilizaremos la palabra HOLA, moviéndose continuamente de derecha a
        izquierda y con un espacio por palabra.
        La variable x es la que regula la velocidad con que se desplazan las letras, para
        comprobarlo modifique el valor de todas las repeticiones de 1 TO 20 al doble 1 TO 40,
        y vera como se desplaza las letras mas lentamente.


         $regfile = "m8def.dat"
         $crystal = 1000000
         Config Portd = Output
         Config Portb = Output
         Dim X As Byte

         Texto:
         For X = 1 To 20
          Portd = 14 : Portb = 8
          Waitms 5
          Portd = 13 : Portb = 71
          Waitms 5
          Portd = 11 : Portb = 64
          Waitms 5
          Portd = 7 : Portb = 9
          Waitms 5
         Next

         For X = 1 To 20
          Portd = 14 : Portb = 127
          Waitms 5
          Portd = 13 : Portb = 8
          Waitms 5
          Portd = 11 : Portb = 71
          Waitms 5
          Portd = 7 : Portb = 64
          Waitms 5
         Next

         For X = 1 To 20
          Portd = 14 : Portb = 9
          Waitms 5
          Portd = 13 : Portb = 127
          Waitms 5
          Portd = 11 : Portb = 8
          Waitms 5
          Portd = 7 : Portb = 71
          Waitms 5
         Next
FISEI




                 Octavo Electrónica 2009 – 2010                   FISEI - UTA                   37
For X = 1 To 20
          Portd = 14 : Portb = 64
          Waitms 5
          Portd = 13 : Portb = 9
          Waitms 5
          Portd = 11 : Portb = 127
          Waitms 5
          Portd = 7 : Portb = 8
          Waitms 5
         Next

         For X = 1 To 20
          Portd = 14 : Portb = 71
          Waitms 5
          Portd = 13 : Portb = 64
          Waitms 5
          Portd = 11 : Portb = 9
          Waitms 5
          Portd = 7 : Portb = 127
          Waitms 5
         Next

         Goto Texto
         End




                             MANEJO DE UN MODULO LCD

        Los módulos LCD (Display de Cristal Líquidos), son utilizados para mostrar mensajes
        que indican al operario es estado de la maquina, o para dar instrucciones de manejo,
        Mostar valores, etc. El LCD permite la comunicación entre las maquinas y los humanos,
        este puede mostrar cualquier carácter ASCII, y consume mucho menos que los display
        de 7 segmentos, existe de varias presentaciones por ejemplo de 2 líneas por 8 caracteres,
        2x16, 2x20, 4x20, 4x40, etc. Sin backlight (14 pines) o con backlight (16 pines,
        iluminado de pantalla), el LCD más popular es el 2x16, 2 líneas de 16 caracteres cada
        una.
        Fotografía de un LCD 2x16
FISEI




                 Octavo Electrónica 2009 – 2010                     FISEI - UTA                     38
Pin   Simb   Descripción
        1     Vss    Tierra de alimentación GND
        2     Vdd    Alimentación de +5V CC
        3     Vo     Ajuste de contraste del cristal liquido (0 a +5V)
        4     RS     Selección del registro control/datos RS=0 reg. Control RS=1 reg. Datos
        5     R/W    Lectura/Escritura en LCD R/W = 0 escritura (write) R/W = 1 lectura (read)
        6     E      Habilitación E = 0 módulo desconectado E = 1 módulo conectado
        7     D0     Bit menos significativo (bus de datos bidireccional)
        8     D1
        9     D2
        10    D3
        11    D4
        12    D5
        13    D6
        14    D7     Bit masmenos significativo (bus de datos bidireccional)
        15    A      Alimentación del backlight +3.5V o +5 Vcc (según especificaciones técnicas)
        16    K      Tierra GND del backlight


        Bascom puede manejar los dos tipos principales de pantallas de cristal líquido:
        alfanuméricos y gráficos. Por el momento, vamos a preocuparnos por el tipo más común
        alfanuméricos. Este tipo de pantalla LCD puede mostrar los caracteres, números y
        caracteres especiales. El tipo más común de LCD alfanumérico utiliza un Hitachi
        HD44780 como controlador de pantalla. Cuando usted no está seguro acerca de qué tipo
        de pantalla que están sosteniendo en sus manos, sólo tiene que mirar a las
        denominaciones de chips en la espalda. Si uno de estos dice HD44780 estás a salvo.

        Bascom tiene una configuración por defecto para la conexión de la pantalla LCD.
        Options / Compiler / LCD
FISEI




                Octavo Electrónica 2009 – 2010                        FISEI - UTA                  39
Afortunadamente, el predeterminado es de tipo LCD de 16 * 2. Esta es la pantalla LCD
        más común con dos líneas y 16 caracteres por línea. HD44780 tipo LCD tienen ocho
        datalines, pero pueden ser controlados de una manera más económica mediante el uso
        de los cuatro líneas. Esto ahorra cuatro Pins I / O en el controlador. Esta es la
        predeterminada (modo de 4 bit bus) en la ventana de opciones. El envío de datos se lo
        hace en modo 4-bit bus de curso tiene dos escrituras de cada 8-bits a enviar Si realmente
        necesitas la pantalla LCD para ser lo más rápido posible (y rara vez lo hacen), tendrá
        que elegir el modo 8-bit bus.
        El modo de datos es el pin por defecto. Esto significa que los pines individuales se
        pueden seleccionar para cada pin LCD. Esta opción proporciona la mayor flexibilidad
        en la elección de la i / o de configuración de su controlador. La opción de «bus» se
        puede utilizar en la clásica configuración de microprocesador de autobuses donde un
        montón de I / O está conectado a un bus y la decodificación de dirección debe ser
        utilizado para hacer frente a cada dispositivo por separado en el autobús.
        En el 'pin' opción, puede especificar cómo las clavijas de seis LCD está conectado a su
        controlador. El pin de activación es usada por la pantalla LCD para ver si tiene para leer
        / escribir datos en las cuatro I / O Pins. Mientras el pin de activación es bajo, la pantalla
        no "escuchar" a los cambios en los cuatro pines de datos (lo que también puede ser
        utilizado para otros fines, por el AT90S2313 que también se utilizan para el MOSI,
        miso y CLK). El pin RS se utiliza para que la pantalla LCD sepa si los datos que están
        en los pines de datos tienen que ver con una presentación en la pantalla o con un
        comando, como un restablecimiento de pantalla o un cambio del cursor
        La pantalla LCD tiene un séptimo séptimo pin llamado R / W para contar la pantalla
        LCD si queremos leer los datos, o escribir en la pantalla LCD. Bascom supone que este
        pin está permanentemente conectado a tierra, de modo que la pantalla LCD siempre está
        en modo de lectura. Sin embargo, para ver si la pantalla LCD está preparada para recibir
        datos, se debe leer la memoria de ocupación.
        Esto implicaría el envío de un comando de verificación de ocupado, cambiar la pantalla
        a modo de escritura, la lectura del valor de un byte del registro del pabellón ocupado y
        se determina el valor del bit de ocupado. Como no podemos hacer eso, Bascom debe
        utilizar bucles de espera después de cada escritura. Los bucles de espera son
        determinados por la velocidad de reloj. Esto es entre otras cosas por la especificación de
        la velocidad de reloj en las opciones / Compilador / ventana de comunicación o con la
        palabra clave de cristal $ es importante. Tenga en cuenta que si ha especificado un reloj
        de 4 MHz y luego cambiar el cristal en un modelo de 10MHz, el controlador se
        ejecutará 2,5 veces más rápido, pero los circuitos de espera del cristal líquido son
        probablemente demasiado corto. Esto puede resultar en que la pantalla LCD no
        funciona en absoluto o actúe de manera extraña.
        Al igual que con la especificación del tipo de controlador y de cristal, las conexiones de
        pin LCD se puede especificar en el origen de Bascom en lugar de utilizar Opciones /
        Compiler / LCD:
FISEI




        La pantalla LCD está conectada al controlador de la siguiente manera


                 Octavo Electrónica 2009 – 2010                        FISEI - UTA                      40
Config Lcd = 16 * 2
         Config lcdpin = PIN, DB4 = PORTB.1, DB5 = PORTB.2, DB6 = PORTB.3,
         DB7 = PORTB.4, E = PORTB.5, RS = PORTB.6
         Lcd Mode Config = Puerto




        La pantalla LCD alfanumérico estándar tiene 14 pins. Pin número 1 es la tierra. Pin
        número 5 es R / W y también está conectado a tierra. Pin número 2 es Vcc, va a +5 V.
        Algunos LCD no tolerará una fuente de alimentación con tensión de salida de un lento
        aumento. Pin número 3 es para el contraste del LCD. Con la mayoría de las pantallas se
        puede conectar el pin de contraste a tierra. Por un contraste óptimo, en algunas pantallas
        se necesita una tensión ligeramente positiva en este pin. Uso de un potenciómetro entre
        +5 V y tierra debe dar una configuración óptima para la mayoría de las pantallas. Los
        números de PIN 4 (RS), 6 (E) y 11, 12, 13 y 14 están conectados a la controladora como
        se muestra en el esquema. PIN números 7, 8, 9 y 10 se puede quedar desconectados.
        Tenga en cuenta que D5, D6 y D7 son compartidos con MOSI, miso y SCK. Si usted
        tiene una pantalla LCD con backlight LED que puede tener un 16 pines en el PCB del
        LCD. Pins 15 y 16 son para la luz de fondo. Si estos pines no tienen otras indicaciones,
        intente una alimentación de +5 V con un resistor limitador de corriente de unos pocos
        cientos de ohmios para averiguar cuál es el cátodo y el ánodo. A veces la luz de fondo
        LED tiene un conector separado de los otros 14 pines.
FISEI




                Octavo Electrónica 2009 – 2010                       FISEI - UTA                     41
$regfile = "m8def.dat"
         $crystal = 1000000
         Dim Count As Integer
         $sim

         Config Lcd = 16 * 2
         Config lcdpin = PIN, DB4 = PORTB.1, DB5 = PORTB.2, DB6 = PORTB.3,
         DB7 = PORTB.4, E = PORTB.5, RS = PORTB.6
         Config Lcdmode = Port

         Do
          ' borrar la pantalla
          Cls
          ' Presento en la lcd HELLO
          Lcd "Hello " ; Count
          Count = Count + 1
          Wait 1
         Loop
         End


        Compile el programa, y luego Program / Simulate




        LCD de carácter conjunto.
        El conjunto de LCD de caracteres estándar se muestra en la siguiente tabla:
FISEI




                 Octavo Electrónica 2009 – 2010                     FISEI - UTA       42
Los caracteres especiales en esta tabla se pueden enviar a la pantalla utilizando el
        charactercode decimal. Por ejemplo, utilice:
        LCD chr (228)
        Para enviar el símbolo μ. (1110.0100 binario es 228 en decimal)


        Se debe entender que existe un cursor que aunque no lo vemos, pues es este el que
        indica donde aparecerá la siguiente letra, para poder entender haremos un ejercicio
        completo, así podrán aprender más del LCD y las funciones de cada uno de los
        comandos. Primero que nada haremos visible el cursor y luego pondremos Wait para
        poder ver el funcionamiento.
        El siguiente programa muestra algunos de los comandos que pueden ser utilizados con
        la pantalla LCD.
FISEI




                Octavo Electrónica 2009 – 2010                   FISEI - UTA                   43
$regfile = "m8def.dat"                                Wait 1
        $crystal = 1000000                                    Cls
        ' proporción del baud                                 'apaga el despliegue
        $baud = 19200                                         Display Off
        ' uso 32 predefinido para la pila del hardware        Wait 1
        $hwstack = 32                                         'encender el despliegue
        ' so 10 predefinido para la pila de SW                Display On
        $swstack = 10                                         Wait 1
        ' uso 40 predefinido para el espacio del marco        Goto Programa
        $framesize = 40                                       End

        Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2
        Config Lcdpin = Pin , Db6 = Portb.3 , Db7 = Portb.4
        Config Lcdpin = Pin , E = Portb.5 , Rs = Portb.6
        Dim A As Byte
        Config Lcd = 16 * 2
        Programa:
        Cls
        Lcd "Hola mundo"
        Wait 1
        Lowerline
        Wait 1
        Lcd "Como estas"
        Wait 1
        For A = 1 To 10
           Shiftlcd Right
           Wait 1
        Next
        For A = 1 To 10
        'cambio el texto a la izquierda
           Shiftlcd Left
           Wait 1
        Next
        Cls
        ' fijar posicion del cursor
        Locate 2 , 1
        Lcd "*"
        Wait 1
        Cls
        'cambio el texto a la derecha
        Shiftcursor Right
        Lcd "@"
        Wait 1
        Cls
        ' seleccionar linea 1 y retornar a casa
        Home Upper
        Lcd "Remplazar."
        Wait 1
        Cls
        'esconda el cursor
        Cursor Off Noblink
        Wait 1
        ' mostar el cursor
        Cursor On Blink
FISEI




                Octavo Electrónica 2009 – 2010                     FISEI - UTA          44
DEFINA SUS PROPIOS PERSONAJES LCD
        La LCD con el controlador HD44780 tiene espacio para ocho caracteres adicionales que
        se pueden definir. Usted podría utilizar caracteres especiales que de origen a:
               Hacer una pantalla de barras de un metro o S-VU-meter
               Una pelota para pasar el tiempo del usuario, mientras que el controlador está
               haciendo algo mucho tiempo.
               Un objeto en rotación o saltar al hombre para que el usuario sepa que el
               controlador está aún en marcha.

        Situé el cursor en Tools / LCD designer




        Dar el un clic en cualquier cuadro para que este se haga negro, o clic en un cuadro negra
        para que se haga blanco. Hacer un símbolo de la cruz




        Haga clic en Aceptar. Colocar el cursor en el origen del programa y aparecerá el
        siguiente texto.
        Deflcdchar ?,32,4,4,31,4,4,32,32' replace ? with number (0-7)

        Cambiar el "?" por el número "0" y eliminar el comentario después del carácter '
FISEI




        Deflcdchar 0 , 32 , 4 , 4 , 31 , 4 , 4 , 32 , 32



                 Octavo Electrónica 2009 – 2010                     FISEI - UTA                     45
Mover el cursor de texto a la siguiente línea vacía, rehacer Tools / LCD designer,
        realizar el siguiente grafico.




        Deflcdchar ?,32,2,20,14,5,8,32,32' replace ? with number (0-7)
        Cambiar el "?" por el número "1" y eliminar el comentario después del carácter '
        Deflcdchar 1 , 32 , 2 , 20 , 14 , 5 , 8 , 32 , 32

        Repita este proceso otras cuatro veces (usa tu imaginación) hasta que su programa es el
        siguiente:

          $regfile = "m8def.dat"
          $crystal = 1000000
          ' proporción del baud
          $baud = 19200
          ' uso 32 predefinido para la pila del hardware
          $hwstack = 32
          ' so 10 predefinido para la pila de SW
          $swstack = 10
          ' uso 40 predefinido para el espacio del marco
          $framesize = 40

          Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2
          Config Lcdpin = Pin , Db6 = Portb.3 , Db7 = Portb.4
          Config Lcdpin = Pin , E = Portb.5 , Rs = Portb.6
          Dim Star As Byte
          Config Lcd = 16 * 2

          Deflcdchar 0 , 32 , 4 , 4 , 31 , 4 , 4 , 32 , 32
          Deflcdchar 1 , 32 , 2 , 20 , 14 , 5 , 8 , 32 , 32
          Deflcdchar 2 , 32 , 2 , 26 , 4 , 11 , 8 , 32 , 32
          Deflcdchar 3 , 32 , 17 , 10 , 4 , 10 , 17 , 32 , 32
          Deflcdchar 4 , 32 , 8 , 11 , 4 , 26 , 2 , 32 , 32
          Deflcdchar 5 , 32 , 8 , 5 , 14 , 20 , 2 , 32 , 32

          Cls
          Do
           For Star = 0 To 5 Step 1
            Locate 1 , 16
            Lcd Chr(star)
           Next Star
           Loop
          End



        Compilar y Simulación. El resultado es una estrella de rotación rápida en la posición
FISEI




        más a la derecha de la línea de LCD de la primera fila.




                    Octavo Electrónica 2009 – 2010                  FISEI - UTA                   46
CONTADOR DE PULSOS CON LCD
        Este proyecto, consiste en contar el numero de pulsos que ingresan por un pin en un
        determinado periodo, este a su vez visualiza en un LCD, si la cantidad de este supera a
        los 120 pulsos por segundo es decir 120Hz, se encenderá una alarma visual (un led
        rojo), y si la cantidad de pulsos baja a menos de 100Hz, este encenderá un led Verde, si
        la frecuencia se mantiene entre estos 2 rangos, no se encenderá ningún led.
        Para esta practica utilizaremos el C.I 555 que nos ayuda a generar un tren de pulsos
        variable, el cual lo conectamos al AVR para su posterior conteo.

        DECLARACIÓN PULSEIN. Sirve para contar el número de pulsos que ingresan por
        un pin en un determinado tiempo, este a su vez lo guarda en una variable para su
        posterior procesamiento, la manera de utilizarlo es la siguiente.

        var          Una palabra variable que se asigna con el resultado
        PINX         Puero a usar
        PIN          Pin del Puerto con el que se contar
        STATE        Podria ser 0 or 1.

                     0 Medio de muestreo. Transición 0 to 1.

                     1 Medio de muestreo. Transición 1 to 0.

        Algo muy importante de conocer, es como conocer verdaderamente la cantidad de
        pulsos que el AVR esta detectando en la entrada, para ello debemos primeramente
        tomar en cuenta que clase de variable es la que esta almacenado el conteo. La cantidad
        de pulsos del conteo obtengo dividiendo la cantidad máxima que puede almacenar dicha
        variable para el dato almacenado de conteo.


         Pulsos = 26315 / Variable
         Uso variable Word = 26315 = 2 bytes
FISEI




                Octavo Electrónica 2009 – 2010                      FISEI - UTA                    47
$regfile = "m8def.dat"
        $crystal = 1000000
        $baud = 19200
        $hwstack = 32
        $swstack = 10
        $framesize = 40
        ' Configuro todo el puerto D.2, D.3 como salida
        Ddrd.2 = 1
        ' led rojo
        Portd.2 = 0
        Ddrd.3 = 1
        ' led verde
        Portd.3 = 0

        Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2
        Config Lcdpin = Pin , Db6 = Portb.3 , Db7 = Portb.4
        Config Lcdpin = Pin , E = Portb.5 , Rs = Portb.6
        Dim Puls As Word
        Config Lcd = 16 * 2
        Prog:
          ' escondo el cursor
          Cursor Off Noblink
          Pulsein Puls , Pind , 0 , 1
          Puls = 26315 / Puls
          Cls
          Lcd " Frecuencia"
          ' localizo al cursos fila 2 columna 6
FISEI




          Locate 2 , 6




                Octavo Electrónica 2009 – 2010                FISEI - UTA   48
Lcd Puls
           Locate 2 , 10
           Lcd "Hz"
           If Puls > 120 Then Goto Alarmah
           If Puls < 100 Then Goto Alarmal
           Pind.2 = 0 : Pind.3 = 0
         Goto Prog
         Alarmah:
         Pind.2 = 1 : Pind.3 = 0
         Goto Prog
         Alarmal:
         Pind.3 = 1 : Pind.2 = 0
         Goto Prog
         End




                                GENERACIÓN DE SONIDO
        El software Bascom es capaz de sacar las frecuencias especificadas por un pin del AVR,
        para esto aprenderemos la declaración SOUND.

        LA DECLARACIÓN SOUND. Saca lo o las frecuencias especificadas por un pin del
        micro, estas pueden ser de 0 a 32767 Hz, su utilización es de la siguiente forma.


         SOUND pin, pulsos, duración
         Sound Portb.0 ,65635 , 10000

        Quiere decir sacar una frecuencia de 65635 ciclos durante 10 segundos por el puerto
        B.0.
        En esta práctica lo utilizaremos para generar un sonido a través de un piezoeléctrico o
        por medio de un parlante.
FISEI




                 Octavo Electrónica 2009 – 2010                    FISEI - UTA                    49
$regfile = "m8def.dat"
         $crystal = 1000000
         $baud = 19200
         $hwstack = 32
         $swstack = 10
         $framesize = 40
         ' Configuro todo el puerto C.0 como salida
         Ddrc.0 = 1
         ' led rojo
         Portc.0 = 0
         Speaker Alias Portc.0
         Do
            Sound Speaker , 1000 , 2
            Wait 2
         Loop
         end



                                     UNA SIRENA POLICIAL
        Esta practica consiste en sacar por un parlante el sonido característico de una sirena
        policial, para esto emplearemos la ayuda de la declaración vista anteriormente.

         ' Configuro todo el puerto C.0 como salida
         Ddrc.0 = 1
         ' led rojo
         Portc.0 = 0
         Speaker Alias Portc.0
         Do
            Sound Speaker , 100 , 10
            Sound Speaker , 50 , 10
            Wait 2
         Loop
FISEI




                 Octavo Electrónica 2009 – 2010                   FISEI - UTA                    50
Esto quiere decir sacar dos tonos por el puerto C.0, el primer tono es 100 que equivale a
        (7874 Hz) con una duración de 10 milisegundos y luego un tono de 50 (3937 Hz) con
        una duración de 10 milisegundos también.
        En cuanto al diagrama y materiales son los mismos de la práctica anterior.

                GENERACIÓN DE UN TIMBRE DE TELÉFONO
                             CELULAR

        Esta practica consiste en sacar por un parlante el sonido característico de un teléfono
        celular, para esto emplearemos la ayuda de la declaración SOUND.
        En cuando al diagrama de conexión y materiales, podemos utilizar el mismo de la
        práctica anterior.


         $regfile = "m8def.dat"
         $crystal = 1000000
         $baud = 19200
         $hwstack = 32
         $swstack = 10
         $framesize = 40
         ' Configuro todo el puerto C.0 como salida
         Ddrc.0 = 1
         ' led rojo
         Portc.0 = 0
         Speaker Alias Portc.0
         Do
            Sound Speaker , 125 , 4
            Sound Speaker , 123 , 5
            Wait 2
         Loop



        Pruebe con algunas combinaciones de tonos, así como también con diferentes tiempos y
        verá que bien pude componer una melodía.

                             LLAMADA TELEFÓNICA DTMF

        Esta practica tiene como objetivo generar tonos DTMF (Dual tono Multifrecuency) a
        través de un AVR, como los que genera cualquier teléfono fijo o celular, estos tonos no
        son nada mas que el envió de dos frecuencias especificas asignadas a cada tecla, estas
        frecuencias podemos ver en la figura siguiente, lo que sucede cuando pulsamos una
        tecla, es que envía una frecuencia baja y luego una segunda frecuencia del grupo alto,
        esto podríamos hacerlo con la declaración PULSEOUT.
FISEI




                 Octavo Electrónica 2009 – 2010                     FISEI - UTA
                                                                                                    51
LA DECLARACIÓN DTMFOUT

        Esta genera automáticamente los tonos duales correspondientes a cada tecla y los envía
        cada una con intervalos de 50 milisegundos, aunque estos los podemos cambiar.
        Para nuestro caso, para saber que puerto es el que envía la señal DTMF, debemos acudir
        a la hoja de dados del ATMEGA8 y buscamos el puerto con características OC1, para
        nuestro AVR es el pin B.1.
FISEI




                Octavo Electrónica 2009 – 2010                    FISEI - UTA                    52
$regfile = "m8def.dat"
         $crystal = 1000000
         $baud = 19200
         $hwstack = 32
         $swstack = 10
         $framesize = 40
         Config Portb = Output
         ' creo una cadenan de caracteres
         Dim Numero As String * 9
         ' numero a marcar
         Numero = "123456789"
         Do
         ' duracion de 50ms por cada digito
         Dtmfout Numero , 50
         Waitms 500
         Loop



        En la figura siguiente se muestra el diagrama básico de conexión para poder hacer una
        llamada telefónica:
        La resistencia de 560Ohm a 1 vatio paralela a la red telefónica, sirve para simular la
        carga de un teléfono normal, y con esto podremos tener el tono de marcado necesario
        para hacer la llamada, además notarán que esta resistencia empieza a disipar calor en
        el momento que se une a la red telefónica, esto debido a la cantidad de voltaje que
        circula (60 voltios).
        El relé hace la conexión y desconexión de la red telefónica, que en este caso sería
        como el auricular que cuelga y descuelga el teléfono.
        El filtro de 1 uF a 100 voltios, sirve para poder mejorar la onda que sale del AVR y
        además como protección para el AVR. Es importante indicar que la red telefónica
        suministra alrededor de 60 voltios en DC, por lo que el capacitor debe pasar de 60
        voltios y además el lado positivo de la red telefónica debe ir a tierra del AVR y el
        negativo hacía el pin del AVR, por lo que necesitaremos la ayuda de un voltímetro
        para poder identificar la polaridad de la red.
FISEI




                 Octavo Electrónica 2009 – 2010                   FISEI - UTA                    53
Para solucionar este inconveniente se propone el diagrama de la figura, este es un
        diagrama más completo en el que la polaridad de la línea no es un problema, puesto que
        dispone un puente de diodos en donde el lado positivo ya está unido a tierra y el lado
        negativo va a través del filtro hacia el AVR.




        Este proyecto es muy utilizado en sistemas de seguridad, se puede hacer una alarma, la
        cual en el momento de violar su seguridad, este realice automáticamente una llamada al
        propietario, el propietario en el momento de contestar escuchará una sirena, señal
        suficiente para saber que alguien ha activado la alarma, este mismo principio utilizan las
        centrales de monitoreo, con la diferencia que en vez de generar un sonido de sirena, se
        envía datos en forma serial como: Zona de apertura, hora, estado de batería, etc.




         LECTURA DE UN TECLADO DE 16 PULSADORES CON
                  DISPLAY DED 7 SEGMENTOS
        La mayoría de las aplicaciones de Controlador pequeñas utilizar uno o más botones o
        interruptores de entrada del usuario. Cuando las cosas van un poco más complicadas, un
        pequeño teclado puede ser una buena solución. Estos teclados vienen en 3x4 o 4x4
        variantes, más a menudo el keyswitches están dispuestos en una matriz.
FISEI




                Octavo Electrónica 2009 – 2010                       FISEI - UTA                     54
La matriz se utiliza, ya que minimiza el número de conexiones desde el teclado al
        controlador. Un teclado 4x4 tiene 16 keyswitches. Usted podría cablear los 16
        keyswitches al controlador, pero una solución más inteligente es el de organizar las
        claves en una matriz y luego conectar las cuatro columnas y filas al controlador.
        Los teclados matriciales son muy útiles para ingresar datos, un ejemplo es el teclado del
        computador, el teclado de una alarma que nos permite armar y desarmar un sistema de
        seguridad, el teclado de una caja fuerte, el de una cerradura eléctrica, etc. Para
        introducirnos en el manejo de un teclado, haremos un proyecto para aprender a
        identificar filas y columnas que lo componen un teclado hexadecimal de 16 pulsadores,
        y su correspondiente barrido de teclas, luego se visualizara en un display de 7
        segmentos el número de la tecla presionado.
FISEI




                Octavo Electrónica 2009 – 2010                      FISEI - UTA                     55
$regfile = "m8def.dat"
          $crystal = 1000000
          ' configuro puertos como salida
          Ddrb = &B00001111
          Portb = &B00001111
          Config Portc = Output
          A Alias Portb.0
          B Alias Portb.1
          C Alias Portb.2
          D Alias Portb.3
          Uno Alias Pinb.4
          Dos Alias Pinb.5
          Tres Alias Pinb.6
          Cuatro Alias Pinb.7
          Barrido:
          A=0
          If Uno = 0 Then Portc = 1
          If Dos = 0 Then Portc = 2
          If Tres = 0 Then Portc = 3
          If Cuatro = 0 Then Portc = 10
          A=1
          B=0
          If Uno = 0 Then Portc = 4
          If Dos = 0 Then Portc = 5
          If Tres = 0 Then Portc = 6
          If Cuatro = 0 Then Portc = 11
          B=1
          C=0
          If Uno = 0 Then Portc = 7
          If Dos = 0 Then Portc = 8
          If Tres = 0 Then Portc = 9
          If Cuatro = 0 Then Portc = 12
          C=1
          D=0
          If Uno = 0 Then Portc = 14
          If Dos = 0 Then Portc = 0
          If Tres = 0 Then Portc = 15
          If Cuatro = 0 Then Portc = 13
          D=1
          Waitms 10
          Goto Barrido
          End




        Como se puede ver este programa es un poco largo pero el uso de memoria es mínima
        en el AVR.
        El funcionamiento es sencillo, solo debemos fijarnos cual fila es la que esta en nivel
        bajo y esta es la fila que se esta barriendo, si una de las condiciones encuentra la
        igualdad, pues esta es la tecla pulsada.
        Ejemplo: Si pulsamos la tecla 6, en algún momento se pondrá en bajo la fila B y
        detectara un cambio de estado de 1 a 0 en la columna 3, por lo que:
FISEI




        A=0
        If Tres = 0 Then Portc = 3


                 Octavo Electrónica 2009 – 2010                   FISEI - UTA                    56
Debemos considerar que un persona requiere como mínimo 100 milisegundos para
        presionar una tecla, en este tiempo el AVR realiza 10 barridos, por lo que de seguro
        detectara inmediatamente la tecla pulsada.
        Para el caso de utilizar un teclado de 12 pulsadores, debemos eliminar una columna, las
        que corresponden a la tecla A, B, C y D, es decir eliminar las siguientes líneas de
        programa.

        If Cuatro = 0 Then Portc = 10
        If Cuatro = 0 Then Portc = 11
        If Cuatro = 0 Then Portc = 12
        If Cuatro = 0 Then Portc = 13

        En este caso quedaría un teclado con pulsadores del 0 al 9 y dos teclas de propósito
        especial, la tecla asterisco (*) y la tecla numeral (#).


               CERRADURA ELECTRÓNICA CON CLAVE EN
                         MEMORIA FLASH
        Este es un proyecto aplicable en seguridad, se trata de una cerradura electrónica en la
        cual al ingresar los 4 dígitos correctamente en su teclado, el AVR energiza un relé, pero
        si la clave es incorrecta el AVR emite 3 pitos indicando que ingreso una clave errónea y
        por supuesto que el relé no se conectara, para hacerlo mas interesante se le agregado
        sonido a las teclas en el momento de ser pulsadas, esto sirve para que el usuario sepa
        que el AVR reconoció la pulsación, también tiene un programa antirrebote de tecla para
        asegurarse que ingrese una sola tecla a la vez.
        El único inconveniente es que la clave no puede ser cambiada, ya que el numero de la
        combinación (1, 2, 3, 4) se la grabó en el programa del AVR por lo que reside en la
        memoria FLASH, mas adelante en los próximos proyectos la memoria podrá ser
        cambiada a gusto del usuario, en tal caso este proyecto sirve para poder identificar y
        diferenciar las 3 memorias que dispone el AVR.
FISEI




                Octavo Electrónica 2009 – 2010                      FISEI - UTA                     57
$regfile = "m8def.dat"                   If Uno = 0 Then Numero = 4 : Return
        $crystal = 4000000                       If Dos = 0 Then Numero = 5 : Return
        ' configuro puertos como salida          If Tres = 0 Then Numero = 6 : Return
        Dim Numero As Byte                       If Cuatro = 0 Then Numero = 11 :
        Dim R As Byte                            Return
        Config Portc = Output                    B=1
        Ddrb = &B00001111                        C=0
        Portb = &B00001111                       If Uno = 0 Then Numero = 7 : Return
        Config Portc = Output                    If Dos = 0 Then Numero = 8 : Return
        A Alias Portb.0                          If Tres = 0 Then Numero = 9 : Return
        B Alias Portb.1                          If Cuatro = 0 Then Numero = 12 :
        C Alias Portb.2                          Return
        D Alias Portb.3                          C=1
        Uno Alias Pinb.4                         D=0
        Dos Alias Pinb.5                         If Uno = 0 Then Numero = 14 :
        Tres Alias Pinb.6                        Return
        Cuatro Alias Pinb.7                      If Dos = 0 Then Numero = 0 : Return
        Bip Alias Portc.0                        If Tres = 0 Then Numero = 15 :
        Led Alias Portc.1                        Return
        Door Alias Portc.2                       If Cuatro = 0 Then Numero = 13 :
                                                 Return
        Iniciando:                               D=1
        Led = 1 : Bip = 1                        Waitms 10
        Waitms 500                               Goto Barrido
        Led = 0 : Bip = 0
        Goto Teclauno                            Ptecla:
                                                 Led = 1 : Bip = 1
        Barrido:                                 Waitms 100
        A=0                                      Led = 0 : Bip = 0
        If Uno = 0 Then Numero = 1 : Return
        If Dos = 0 Then Numero = 2 : Return      Espacio:
        If Tres = 0 Then Numero = 3 : Return     If Uno = 0 Then Goto Espacio
        If Cuatro = 0 Then Numero = 10 :         If Dos = 0 Then Goto Espacio
FISEI




        Return                                   If Tres = 0 Then Goto Espacio
        A=1                                      If Cuatro = 0 Then Goto Espacio
        B=0                                      Waitms 25
                                                 Return


                Octavo Electrónica 2009 – 2010                       FISEI - UTA        58
Teclauno:
        Gosub Barrido
        Gosub Ptecla
        If Numero = 1 Then Goto Teclados
        Goto Falso

        Teclados:
        Gosub Barrido : Gosub Ptecla
        If Numero = 2 Then Goto Teclatres
        Goto Falso1

        Teclatres:
        Gosub Barrido : Gosub Ptecla
        If Numero = 3 Then Goto Teclacuatro
        Goto Falso2

        Teclacuatro:
        Gosub Barrido : Gosub Ptecla
        If Numero = 4 Then Goto Openge
        Goto Falso3

        Openge:
        For R = 1 To 2
        Waitms 100
        Led = 1 : Bip = 1
        Waitms 100
        Led = 0 : Bip = 0
        Next
        Door = 1
        Wait 1
        Door = 0
        Goto Teclauno

        Falso:
        Gosub Barrido : Gosub Ptecla
        Falso1:
        Gosub Barrido : Gosub Ptecla
        Falso2:
        Gosub Barrido : Gosub Ptecla
        Falso3:
        For R = 1 To 3
        Wait 1
        Led = 1 : Bip = 1
        Wait 1
        Led = 0 : Bip = 0
        Next
        Goto Teclauno
        End
FISEI




               Octavo Electrónica 2009 – 2010   FISEI - UTA   59
CERRADURA ELECTRÓNICA CON CLAVE EN
                  MEMORIA RAM Y CAMBIO DE CLAVE
        Este proyecto es muy similar al anterior con la diferencia que este se le puede cambiar
        la clave predefinida (1, 2, 3, 4) por cualquier otra combinación de teclas, la clave
        original será cargada en cuatro variables y existirá una manera de cambiar los valores de
        estas variables lo cual se lo hace de la siguiente manera: después de haber colocado la
        clave original, debemos mantener presionado la tecla D durante 2 segundos, para ser
        más exactos en el momento que el relé se conecta después de 1 segundo hay una
        pregunta si la tecla D es presionada ir a grabar, si no presionamos la tecla D a tiempo,
        perderemos la oportunidad de cambiar la clave y tendremos que volver a repetir el
        proceso, en el momento que ingresa al programa de cambio de clave se encenderá el led
        y permanecerá encendido esperando a que ingresemos los 4 nuevos dígitos.
        Es importante saber que la nueva clave se almacenara en las variables SETPRIME,
        SETSEGUN, SETERCER y SETCUART, estas variables ocupan espacio de 224
        BYTES, por lo tanto solo están activadas mientras el AVR se encuentra alimentado, una
        vez que se corta la alimentación al AVR esta memoria de borra, por consiguiente al
        momento de volver a prender el micro AVR, la nueva clave se nos habrá perdido y en
        su lugar se encontrara la clave original (1, 2, 3, 4), esto debido a que esta clave se
        encuentra en la memoria FLASH y en el momento de correr el programa lo carga
        nuevamente en la memoria RAM para desde aquí poder ser modificada.
        En cuanto a los materiales y el diagrama de conexión, son los mismos que se utilizaron
        en el ejercicio anterior.

          $regfile = "m8def.dat"                   Setsegu = 2
          $crystal = 4000000                       Setercer = 3
          ' configuro puertos como salida          Setcuart = 4
          Dim Numero As Byte                       niciando:
          Dim R As Byte                            Led = 1 : Bip = 1
          Config Portc = Output                    Waitms 500
          Ddrb = &B00001111                        Led = 0 : Bip = 0
          Portb = &B00001111                       Goto Teclauno
          Config Portc = Output
          A Alias Portb.0                          Grabauno:
          B Alias Portb.1                          Gosub Ptecla : Led = 1
          C Alias Portb.2                          Gosub Barrido : Gosub Ptecla
          D Alias Portb.3                          Led = 1
          Uno Alias Pinb.4                         Setprime = Numero
          Dos Alias Pinb.5
          Tres Alias Pinb.6                        Grabados:
          Cuatro Alias Pinb.7                      Gosub Barrido : Gosub Ptecla
          Bip Alias Portc.0                        Led = 1
          Led Alias Portc.1                        Setsegu = Numero
          Door Alias Portc.2
          Dim Setprime As Byte                     Grabatres:
          Dim Setsegu As Byte                      Gosub Barrido : Gosub Ptecla
          Dim Setercer As Byte                     Led = 1
FISEI




          Dim Setcuart As Byte                     Setercer = Numero
          Setprime = 1




                 Octavo Electrónica 2009 – 2010                        FISEI - UTA                  60
Grabacuatro:                            Teclauno:
        Gosub Barrido : Gosub Ptecla            Gosub Barrido
        Led = 1                                 Gosub Ptecla
        Setcuart = Numero                       If Numero = Setprime Then Goto
        Goto Iniciando                          Teclados
                                                Goto Falso
        Barrido:
        A=0                                     Teclados:
        If Uno = 0 Then Numero = 1 : Return     Gosub Barrido : Gosub Ptecla
        If Dos = 0 Then Numero = 2 : Return     If Numero = Setsegu Then Goto
        If Tres = 0 Then Numero = 3 : Return    Teclatres
        If Cuatro = 0 Then Numero = 10 :        Goto Falso1
        Return
        A=1                                     Teclatres:
        B=0                                     Gosub Barrido : Gosub Ptecla
        If Uno = 0 Then Numero = 4 : Return     If Numero = Setercer Then Goto
        If Dos = 0 Then Numero = 5 : Return     Teclacuatro
        If Tres = 0 Then Numero = 6 : Return    Goto Falso2
        If Cuatro = 0 Then Numero = 11 :
        Return                                  Teclacuatro:
        B=1                                     Gosub Barrido : Gosub Ptecla
        C=0                                     If Numero = Setcuart Then Goto
        If Uno = 0 Then Numero = 7 : Return     Openge
        If Dos = 0 Then Numero = 8 : Return     Goto Falso3
        If Tres = 0 Then Numero = 9 : Return
        If Cuatro = 0 Then Numero = 12 :        Openge:
        Return                                  For R = 1 To 2
        C=1                                     Waitms 100
        D=0                                     Led = 1 : Bip = 1
        If Uno = 0 Then Numero = 14 :           Waitms 100
        Return                                  Led = 0 : Bip = 0
        If Dos = 0 Then Numero = 0 : Return     Next
        If Tres = 0 Then Numero = 15 :          Door = 1
        Return                                  Wait 1
        If Cuatro = 0 Then Numero = 13 :        Door = 0
        Return                                  A=1:B=1:C=1:D=1
        D=1                                     If Cuatro = 0 Then Goto Grabauno
        Waitms 10                               Goto Teclauno
        Goto Barrido
                                                Falso:
        Ptecla:                                 Gosub Barrido : Gosub Ptecla
        Led = 1 : Bip = 1                       Falso1:
        Waitms 100                              Gosub Barrido : Gosub Ptecla
        Led = 0 : Bip = 0                       Falso2:
                                                Gosub Barrido : Gosub Ptecla
        Espacio:                                Falso3:
        If Uno = 0 Then Goto Espacio            For R = 1 To 3
        If Dos = 0 Then Goto Espacio            Wait 1
        If Tres = 0 Then Goto Espacio           Led = 1 : Bip = 1
        If Cuatro = 0 Then Goto Espacio         Wait 1
        Waitms 25                               Led = 0 : Bip = 0
        Return                                  Next
                                                Goto Teclauno
                                                End
FISEI




               Octavo Electrónica 2009 – 2010                    FISEI - UTA       61
CERRADURA ELECTRÓNICA CON CLAVE EN
                MEMORIA EEPROM Y CAMBIO DE CLAVE
        Una vez aprendido acerca de las 2 memoria anteriores, es el momento de aprender a
        utilizar la memoria EEPROM (Electrical Erasable Programable Read Only Memory), o
        memoria de lectura de programación y borrado eléctrico, que a diferencia de la memoria
        RAM, esta no es volátil y tiene capacidad para 128 Bytes, lo que quiere decir que si al
        AVR se le corta la alimentación, los datos almacenados en la memoria EEPROM,
        permanecen según su fabricante por un periodo de 40 años a 100 años.
        Este proyecto cumple todas las expectativas de un estudiante de micros, tiene la
        posibilidad de cambiar la clave y no borrarse, si se digita una clave errónea el teclado se
        bloquea y únicamente lo desbloqueamos presionando al mismo tiempo las teclas 7 y C
        por 2 segundos, así mismo para cambiar la clave procedemos como en el proyecto
        anterior, presionando la tecla D.
        Algo importante es que si nos olvidamos la clave, la única manera de recuperarlo es
        leyendo el contenido del AVR a través de un programador.
        En cuanto a los materiales y el diagrama de conexión, son los mismos que se utilizaron
        en el proyecto anterior.

        LA DECLARACIÓN WRITEEEPROM Y READEEPROM

        WRITEEEPROM: escribe un contenido variable en DATA EEPROM.
        SINTAXIS: WRITEEEPROM variable, dirección

        WRITEEEPROM 137, 8 quiere decir guardar en la dirección 8 de la memoria
        EEPROM el número 137, si existiera un dato anterior en esta dirección, se borrara.

        READEEPROM: lee el contenido de la EEPROM y lo almacena en una variable
        SINTAXIS: READEEPROM variable, dirección

        READEEPROM pepe, 5 quiere decir leer la dirección 5 de la memoria EEPROM y
        guardar en la variable pepe, por consiguiente pepe se carga con el dato que esta
        almacenado en la dirección.
FISEI




                 Octavo Electrónica 2009 – 2010                       FISEI - UTA                     62
$regfile = "m8def.dat"                     Readeeprom Setprime , 0
        $crystal = 4000000                         Readeeprom Setsegu , 1
        $eeprom                                    Readeeprom Setercer , 2
        ' configuro puertos como salida            Readeeprom Setcuart , 3
        Dim Numero As Byte                         Goto Teclauno
        Dim R As Byte
        Config Portc = Output                      Grabauno:
        Ddrb = &B00001111                          Gosub Ptecla : Led = 1
        Portb = &B00001111                         Gosub Barrido : Gosub Ptecla
        Config Portc = Output                      Led = 1
        A Alias Portb.0                            Writeeeprom Numero , 0
        B Alias Portb.1
        C Alias Portb.2                            Grabados:
        D Alias Portb.3                            Gosub Barrido : Gosub Ptecla
        Uno Alias Pinb.4                           Led = 1
        Dos Alias Pinb.5                           Writeeeprom Numero , 1
        Tres Alias Pinb.6
        Cuatro Alias Pinb.7                        Grabatres:
        Bip Alias Portc.0                          Gosub Barrido : Gosub Ptecla
        Led Alias Portc.1                          Led = 1
        Door Alias Portc.2                         Writeeeprom Numero , 2
        Dim Setprime As Byte
        Dim Setsegu As Byte                        Grabacuatro:
        Dim Setercer As Byte                       Gosub Barrido : Gosub Ptecla
        Dim Setcuart As Byte                       Led = 1
        Setprime = 1                               Writeeeprom Numero , 3
        Setsegu = 2                                Goto Reseteo
        Setercer = 3
        Setcuart = 4
        Dim Eeprom1 As Byte                        Barrido:
        Dim Eeprom2 As Byte                        A=0
        Dim Eeprom3 As Byte                        If Uno = 0 Then Numero = 1 : Return
        Dim Eeprom4 As Byte                        If Dos = 0 Then Numero = 2 : Return
        Eeprom1 = 1                                If Tres = 0 Then Numero = 3 : Return
        Eeprom2 = 2                                If Cuatro = 0 Then Numero = 10 :
        Eeprom3 = 3                                Return
        Eeprom4 = 4                                A=1
        Iniciando:                                 B=0
        For R = 1 To 2                             If Uno = 0 Then Numero = 4 : Return
        Led = 1 : Bip = 1                          If Dos = 0 Then Numero = 5 : Return
        Waitms 500                                 If Tres = 0 Then Numero = 6 : Return
        Led = 0 : Bip = 0                          If Cuatro = 0 Then Numero = 11 :
        Waitms 150                                 Return
        Next                                       B=1
                                                   C=0
        Writeeeprom Eeprom1 , 0                    If Uno = 0 Then Numero = 7 : Return
        Writeeeprom Eeprom2 , 1                    If Dos = 0 Then Numero = 8 : Return
        Writeeeprom Eeprom3 , 2                    If Tres = 0 Then Numero = 9 : Return
        Writeeeprom Eeprom4 , 3                    If Cuatro = 0 Then Numero = 12 :
        Reseteo:                                   Return
        For R = 1 To 3                             C=1
        Led = 1 : Bip = 1                          D=0
        Waitms 50                                  If Uno = 0 Then Numero = 14 :
        Led = 0 : Bip = 0                          Return
        Waitms 50                                  If Dos = 0 Then Numero = 0 : Return
        If Cuatro = 0 And Uno = 0 Then Goto        If Tres = 0 Then Numero = 15 :
FISEI




        Reseteo                                    Return
        Next                                       If Cuatro = 0 Then Numero = 13 :




                  Octavo Electrónica 2009 – 2010                       FISEI - UTA
                                                                                          63
Return                                   Falso:
        D=1                                      Gosub Barrido : Gosub Ptecla
        Waitms 10                                Falso1:
        Goto Barrido                             Gosub Barrido : Gosub Ptecla
                                                 Falso2:
        Ptecla:                                  Gosub Barrido : Gosub Ptecla
        Led = 1 : Bip = 1                        Falso3:
        Waitms 100                               For R = 1 To 3
        Led = 0 : Bip = 0                        Waitms 150
                                                 Led = 1 : Bip = 1
        Espacio:                                 Waitms 15
        If Uno = 0 Then Goto Espacio             Led = 0 : Bip = 0
        If Dos = 0 Then Goto Espacio             A=1:B=1:C=1:D=1
        If Tres = 0 Then Goto Espacio            If Cuatro = 0 And Uno = 0 Then Goto
        If Cuatro = 0 Then Goto Espacio          Reseteo
        Waitms 25                                Next
        Return
                                                 Panico:
        Teclauno:                                Led = 1
        Gosub Barrido                            Waitms 500
        Gosub Ptecla                             Led = 0
        If Numero = Setprime Then Goto           Waitms 500
        Teclados                                 A=1:B=1:C=1:D=1
        Goto Falso                               If Cuatro = 0 And Uno = 0 Then Goto
                                                 Reseteo
        Teclados:                                Goto Panico
        Gosub Barrido : Gosub Ptecla             End
        If Numero = Setsegu Then Goto
        Teclatres
        Goto Falso1

        Teclatres:
        Gosub Barrido : Gosub Ptecla
        If Numero = Setercer Then Goto
        Teclacuatro
        Goto Falso2

        Teclacuatro:
        Gosub Barrido : Gosub Ptecla
        If Numero = Setcuart Then Goto
        Openge
        Goto Falso3

        Openge:
        For R = 1 To 2
        Waitms 100
        Led = 1 : Bip = 1
        Waitms 100
        Led = 0 : Bip = 0
        Next
        Door = 1
        Wait 1
        Door = 0
        A=1:B=1:C=1:D=1
        If Cuatro = 0 Then Goto Grabauno
        Goto Teclauno
FISEI




                Octavo Electrónica 2009 – 2010                     FISEI - UTA         64
MOTORES PASO A PASO




        ¿QUÉ ES UN MOTOR PASO A PASO?

        Como todo motor, es en esencia un conversor electromecánico, que transforma la
        energía eléctrica en mecánica; pero de un modo tan peculiar que constituye en la
        actualidad una categoría aparte. En efecto, mientras que un motor convencional gira
        libremente al aplicar una tensión comprendida dentro de ciertos límites (que se
        corresponden de un lado al par mínimo capaz de vencer su propia inercia mecánica, y de
        otro a sus propias limitaciones de potencia); el motor paso a paso está concebido de tal
        manera que gira un determinado ángulo proporcional a la "codificación" de tensiones
        aplicadas a sus entradas (4, 6, etc.). La posibilidad de controlar en todo momento esta
        codificación permite realizar desplazamientos angulares lo suficientemente precisos,
        dependiendo el ángulo de paso (o resolución angular) del tipo de motor (puede ser tan
        pequeño como 1,80º hasta unos 15º). De este modo, si por ejemplo el número de grados
        por paso es de 1,80º, para completar una vuelta serán necesarios 200 pasos.
        De la misma manera que se puede posicionar el eje del motor, es posible controlar la
        velocidad del mismo, la cual será función directa de la frecuencia de variación de las
        codificaciones en las entradas. De ello se deduce que el motor paso a paso presenta una
        precisión y repetitividad que lo habilita para trabajar en sistemas abiertos sin
        realimentación.

        MOTORES PASO A PASO BIPOLARES

        En el esquema de la figura 4 aparece uno de estos motores con dos estatores, sobre cada
        uno de los cuales se ha devanado una bobina (1 y U), las cuales se encuentran
        conectadas directamente a unos conmutadores de control que, como se verá más
        adelante, podrán ser sustituidos por las líneas de entrada y salida de nuestro ordenador
        debidamente programadas. Como las bobinas se encuentran distribuidas simétricamente
        en torno al estator, el campo magnético creado dependerá en magnitud de la intensidad
FISEI




        de corriente por cada fase, y en polaridad magnética, del sentido de la corriente que
        circule por cada bobina. De este modo el estator adquiere la magnetización
        correspondiente, orientándose el rotor según ella (fig. 4a). Si el interruptor 1.1 se


                Octavo Electrónica 2009 – 2010                      FISEI - UTA                    65
conmuta a su segunda posición (fig. 4b), se invierte el sentido de la corriente que circula
        por T y por tanto la polaridad magnética, volviéndose a reorientar el rotor (el campo ha
        sufrido una rotación de 90º en sentido antihorario, haciendo girar el rotor 90º en ese
        mismo sentido). Con esto se llega a la conclusión de que para dar una vuelta completa
        serían necesarios cuatro pasos de 90º cada uno (el ciclo completo se puede seguir en la
        figura 4a,b,c,d).Ahora bien, este tipo de motores también puede funcionar de un modo
        menos "ortodoxo", pero que nos va a permitir doblar el número de pasos, si bien a costa
        de la regularidad del par. Esto se consigue de la siguiente manera: en principio, al igual
        que en el anterior fondo de funcionamiento, por los devanados T y U se hace circular
        una corriente, de tal modo que el estator adquiere la magnetización correspondiente y
        por lo tanto el rotor se orienta según ella. Ahora bien, al contrario que en el caso
        anterior, antes de conmutar el interruptor I.1 a su segunda posición, se desconectará el
        devanado T, reorientándose por consiguiente el rotor, pero la mitad de un paso (45º).
FISEI




                 Octavo Electrónica 2009 – 2010                       FISEI - UTA                     66
MOTORES PASO A PASO UNIPOLARES




        Los motores paso a paso unipolares, en cuanto a construcción son muy similares a los
        anteriormente descritos excepto en el devanado de su estator (fig. 5). En efecto, cada
        bobina del estator se encuentra dividida en dos mediante una derivación central
        conectada a un terminal de alimentación. De este modo, el sentido de la corriente que
        circula a través de la bobina y por consiguiente la polaridad magnética del estator viene
        determinada por el terminal al que se conecta la otra línea de la alimentación, a través
        de un dispositivo de conmutación. Por consiguiente las medias bobinas de conmutación
        hacen que se inviertan los polos magnéticos del estator, en la forma apropiada. Nótese
        que en vez de invertir la polaridad de la corriente como se hacía en los M.P.P. bipolares
        se conmuta la bobina por donde circula dicha corriente.
FISEI




                Octavo Electrónica 2009 – 2010                      FISEI - UTA                     67
Al igual que los M.P.P. bipolares, es posible tener resoluciones de giro correspondientes
        a un semipaso. Ahora bien, dado que las características constructivas de estos motores
        unipolares son idénticas a las de los bipolares, se puede deducir que los devanados tanto
        en uno como otro caso ocuparán el mismo espacio, y por tanto es evidente que por cada
        fase tendremos menos vueltas o bien el hilo de cobre será de una sección menor. En
        cualquiera de los dos casos se deduce la disminución de la relación de amperios/vuelta.
        Por tanto, a igualdad de tamaño los motores bipolares ofrecen un mayor par.
FISEI




                Octavo Electrónica 2009 – 2010                      FISEI - UTA                     68
SECUENCIA DEL CIRCUITO DE CONTROL

        Existen dos formas básicas de hacer funcional los motores paso a paso atendiendo al
        avance del rotor bajo cada impulso de excitación:

        Paso completo (full step): El rotor avanza un paso completo por cada pulso de
        excitación y para ello su secuencia ha de ser la correspondiente a la expuesta
        anteriormente, para un motor como el de la Figura 2, y que se presentada de forma
        resumida en la Tabla 1 para ambos sentidos de giro, las X indican los interruptores que
        deben estar cerrados (interruptores en ON), mientras que la ausencia de X indica
        interruptor abierto (interruptores en OFF).




        Medio paso (Half step): Con este modo de funcionamiento el rotor avanza medio paso
        por cada pulso de excitación, presentando como principal ventaja una mayor resolución
        de paso, ya que disminuye el avance angular (la mitad que en el modo de paso
        completo). Para conseguir tal cometido, el modo de excitación consiste en hacerlo
        alternativamente sobre dos bobinas y sobre una sola de ellas, según se muestra en la
        Tabla siguiente para ambos sentidos de giro.
FISEI




                Octavo Electrónica 2009 – 2010                     FISEI - UTA                    69
MANEJO DE UN MOTOR PASO A PASO EN SECUENCIA
                       WAVE DRIVE




        $regfile = "m8def.dat"                  For X = 1 To 12
        $crystal = 4000000                       Portc = &B1000
        $eeprom                                  Gosub Pausa
        Dim X As Byte                            Portc = &B0100
        Config Portc = Output                    Gosub Pausa
        Antihorario:                             Portc = &B0010
        For X = 1 To 12                          Gosub Pausa
          Portc = &B0001                         Portc = &B0010
          Gosub Pausa                            Gosub Pausa
          Portc = &B0010                        Next
          Gosub Pausa                           Wait 1
          Portc = &B0100                        Goto Antihorario
          Gosub Pausa                           Pausa:
          Portc = &B1000                        Waitms 100
          Gosub Pausa                           Return
        Next                                    End
        Wait 1
FISEI




               Octavo Electrónica 2009 – 2010                FISEI - UTA
MANEJO DE UN MOTOR PASO A PASO EN SECUENCIA
                        FULL STEP

        $regfile = "m8def.dat"
        $crystal = 4000000
        $eeprom
        Dim X As Byte
        Config Portc = Output
        Antihorario:
        For X = 1 To 12
          Portc = &B0011
          Gosub Pausa
          Portc = &B0110
          Gosub Pausa
          Portc = &B1100
          Gosub Pausa
          Portc = &B1001
          Gosub Pausa
        Next
        Goto Antihorario
        Pausa:
        Waitms 100
        Return
        End




        MANEJO DE UN MOTOR PASO A PASO EN SECUENCIA
                        HALF STEP



        $regfile = "m8def.dat"                    Gosub Pausa
        $crystal = 4000000                        Portc = &B1000
        $eeprom                                   Gosub Pausa
        Dim X As Byte                             Portc = &B1100
        Config Portc = Output                     Gosub Pausa
        Antihorario:                              Portc = &B1000
        For X = 1 To 12                           Gosub Pausa
          Portc = &B0001                          Portc = &B1001
          Gosub Pausa                             Gosub Pausa
          Portc = &B0011                         Next
          Gosub Pausa                            Goto Antihorario
          Portc = &B0010                         Pausa:
          Gosub Pausa                            Waitms 100
          Portc = &B0110                         Return
          Gosub Pausa                            End
FISEI




          Portc = &B0100
          Gosub Pausa
          Portc = &B1100




                Octavo Electrónica 2009 – 2010               FISEI - UTA   70
COMUNICACIÓN
        QUE ES LA COMUNICACIÓN SERIAL?

        RS-232 es hoy en día un estándar de comunicación antiguo. Es sorprendente que una
        norma, definida en los años sesenta, es aún ampliamente utilizado hoy en día.
        Formalmente no obstante, el nombre de RS-232 no es aplicable a una norma. Una
        organización estadounidense, ahora conocida como la Asociación de Industrias
        Electrónicas, propuso una forma de comunicación entre grandes ordenadores centrales y
        periféricos tales como terminales La propuesta se llama un nivel recomendado y 232 no
        era más que un número de identificación. Mucho más tarde esto se convirtió en una
        norma oficial, la EIA-232. En 1991, la versión más reciente, la EIA-232E fue publicado.
        Sin embargo, el nombre de RS-232 es aún ampliamente utilizado.

               Una tensión entre -3 y -25 voltios es una lógica de un (1)
               Una tensión entre 3 y 25 voltios es una lógica de cero (0)

        UART

        UART medio receptor asíncrono de transmisor universal. Es el final de hardware en
        ambos lados de un puerto RS-232 enlace de comunicación. En el PC o cualquier otro
        equipo que es un chip en la placa base, bajo el control de la CPU. En el controlador de
        AVR es una pequeña área en el chip dedicada a esta función.
        En el ATMEGA8 el UART está conectado al pin 2 (RXD) y 3 (TXD). Como estos
        pines también funcionan como de propósito general de E / S PortD.0 y PortD.1, tendrá
        que sacrificar algunas de E / S si usted necesita el UART. Un UART se encarga de
        enviar y recibir bits. Cuando se recibe, se determina cuándo se muestra el RxD PIN para
        determinar si se recibe cero o uno. Cuando se transmite, la UART lee un byte del búfer
        de transmisión y envía los bits que corresponden con el momento apropiado para el RS-
        232 de velocidad seleccionada.
FISEI




                Octavo Electrónica 2009 – 2010                      FISEI - UTA                   71
                                                                                                  72
Un convertidor de nivel genera las tensiones necesarias para cumplir con los niveles Del
        RS-232. También se invierte la lógica de los niveles. El MAX232 usa interiormente,
        convertidores de conmutación y dobladores de voltaje para generar niveles de alrededor
        de -9 y 9 voltios. Estas tensiones se encuentran claramente dentro del rango requerido.




        MODOS DE TRANSMISIÓN DE DATOS

        Simplex: se dice a la transmisión que puede ocurrir en un solo sentido, sea sólo para
        recibir o sólo para transmitir. Una ubicación pude ser un transmisor o un receptor, pero
        no ambos a la vez, un ejemplo claro es la radiodifusión, en donde la estación es el
        transmisor y los radios son los receptores.

        Half-duplex: se refiere a la transmisión que puede ocurrir en ambos sentidos, pero no al
        mismo tiempo, en donde una ubicación puede ser transmisor o un receptor, pero no los
        dos al mismo tiempo, un ejemplo son los llamados radios WALKING TALKING, en
        donde un operador presiona el botón y habla, luego suelta el botón y el otro usuario
        presiona el botón para contestar.

        Full-duplex: se dice a la transmisión que puede ocurrir en ambos sentidos y al mismo
        tiempo, también se lo conoce con el nombre de líneas simultaneas de doble sentido, una
        ubicación puede transmitir y recibir simultáneamente, siempre y cuando la estación a la
        que está transmitiendo también sea la estación de la cual está recibiendo, un ejemplo es
        la telefonía móvil.
FISEI




                Octavo Electrónica 2009 – 2010                      FISEI - UTA                    73
Full/full-duplex: con este modo de transmisión es posible transmitir y recibir
        simultáneamente, pero no necesariamente entre las dos ubicaciones, es decir una
        estación puede transmitir a una segunda estación y recibir ded una tercera estación al
        mismo tiempo. Esta transmisión se utiliza exclusivamente con circuitos de
        comunicación de datos.

                          COMUNICACIÓN SERIAL AVR A PC

        Una vez comprendido la teoría de la comunicación serial y su protocolo RS232,
        haremos un ejercicio de comunicación serial asincrónico modo simplex, que consiste en
        enviar datos, mas específicamente los caracteres ASCII de la palabra “DOG”, a través
        de un cable y directamente desde el AVR al PC, a 2400 bits/seg, a 8 bits de datos, sin
        paridad, y 1 bit de parada. Como sabemos el computador tiene al menos un puerto
        serial, como la norma RS232, por lo tanto debemos simular esos voltajes desde el AVR,
        esto lo conseguimos enviando 0 para representar el 1 lógico y 5V para representar el 0
        lógico, para esto existe la declaración PRINT.

        Print “D” envía el carácter ASCII “D” por el puerto de comunicación serial del AVR.
        $baud = 19200 Digo que trabajare a 19200 bits/segundo.




          $regfile = "m8def.dat"
          $crystal = 1000000
          $baud = 96000
          Config Portb = Output
          Inicio:
          Portb.0 = 1
          Wait 1
          Portb.0 = 0
          Waitms 500
          ' envio datos en forma serial
          Print "DOG"
          Goto Inicio
          End
FISEI




                  Octavo Electrónica 2009 – 2010                  FISEI - UTA                    74
BASCOM nos ofrece una herramienta para poder simular la comunicación serial, para
        ello nos vamos a Tools / Terminal Emulator




        Debemos configurar el terminal, para ello damos un clic en Terminal y se presentara la
        siguiente ventana de configuración. Terminal / Setting
FISEI




                Octavo Electrónica 2009 – 2010                    FISEI - UTA
                                                                                                 75
COMUNICACIÓN SERIAL PC A AVR
        Si usted tubo problemas con el envió de datos del AVR al PC, este proyecto de seguro
        le funcionara, se trata de enviar datos desde el PC al AVR, por lo que es de suponerse
        los voltajes serán desde -10V hasta +10V y la distancia podemos extenderlo hasta 15
        metros sin ningún problema, como la conexión es directamente al AVR debemos
        colocar una resistencia de 22K para no dañar el puerto del AVR. En este caso el AVR es
        un receptor por lo que debemos permanecer en espera del bit de inicio, para esto
        tenemos la declaración SERIN.

        DECLARACIÓN SERIN: esta declaración sirve para recibir datos seriales en un
        formato estándar asíncrono.

        Mybaud = 19200
        Serin S , 0 , D , 0 , Mybaud , 0 , 8 , 1
        '                           ^ 1 stop bit
        '                        ^---- 8 data bits
        '                      ^------ even parity (0=N, 1 = E, 2=O)
        '                ^-------------- baud rate
        '            ^-------------------- pin number
        '         ^----------------------- port so PORTd.0 and PORTd.1 son usados
        '      ^--------------------------- for strings pass 0
        '   ^-------------------------------- variable
FISEI




                Octavo Electrónica 2009 – 2010                     FISEI - UTA                   76
$regfile = "m8def.dat"
         $crystal = 1000000
         Dim Dat As Byte
         Dim Mybaud As Integer
         Mybaud = 9600

         Config Lcd = 16 * 2
         Config Lcdpin = Pin , Db4 = Portb.1 ,
         Db5 = Portb.2
         Config Lcdpin = Pin , Db6 = Portb.3 ,
         Db7 = Portb.4
         Config Lcdpin = Pin , E = Portb.5 ,
         Rs = Portb.6
         Config Lcdmode = Port

           ' borrar la pantalla
           Cls
           ' Presento en la lcd
           Lcd " LCD listo"
           Wait 1
           Cls

         Inicio:
         Serin Dat , 0 , D , 0 , Mybaud , 0 , 8 ,
         1
         Lcd "Dat"
         Goto Inicio




                                          COMUNICACIÓN I²C
        I²C significa Inter-IC. e trata de un desarrollo de Philips, que comenzó en los años
        ochenta. En aquellos días la electrónica de consumo, como televisores y la radio pasó
        por una fase rápida de conseguir más y más usuarios. Lotes de circuitos integrados se
        han añadido a estos productos como consecuencia de cableado más complicado en un
        circuito impreso de hacinamiento. Philips considera que un bus serie simple era una
        solución posible. En lugar de buses de acoplamiento en paralelo IC, todos estos LED's
        se conectan a un bus de dos hilos. El bus de dos hilos tiene un cable de datos y de un
        reloj, llaman SDA y SCL, respectivamente.
        En 1992, el estándar I²C utiliza un esquema de siete bits para el direccionamiento,
        permitiendo 128 CI a ser conectados a un bús.
FISEI




                 Octavo Electrónica 2009 – 2010                   FISEI - UTA
                                                                                                 77
Direccion I²C

        El número de CI en un bus I²C está limitado a 128, ya que cada IC necesita únicos siete
        bits de dirección.




        Estándar I²C

        La norma original especifica una velocidad máxima en el bus de 100 kHz. En 1992, se
        añadió un modo rápido con una velocidad máxima de 400 kHz. En 1998, una versión 2
        fue lanzado. Esta versión tiene un modo de alta velocidad con un máximo de 3.4Mbit/s.

        Mas sobre I²C

        Philips tiene la patente en la I²C eso significa que otros fabricantes de chips que quieren
        hacer IC I²C tienen que pagar regalías y deben firmar un acuerdo que indique que se
        adhieren a los estándares I²C.
        La mayoría de los controladores de AVR de Atmel tiene una interfaz de dos hilos, por
        lo menos eso es lo que dice la documentación. Esto es por supuesto una interfaz I²C.
        La norma I²C prescribe resistencias en SDA y la línea SCL. Este es uno de los errores
        más comunes de la primera vez que utiliza una interfaz de I²C. Olvídese de los "push-
        pull y su interfaz no funcionará.
FISEI




                 Octavo Electrónica 2009 – 2010                       FISEI - UTA                     78
La longitud máxima de los cables de bus I²C no está en la norma. Sólo dice que para la
        variante de 100 kHz, la capacidad total del cableado de bus y los dispositivos
        conectados no debe exceder 400pF.


        COMUNICACIÓN I²C CON UNA MEMORIA SERIAL 24L04B

        Esta es una practica muy básica para aprender sobre la interfaz I²C, consiste en guardar
        datos es las cuatro primeras direcciones de la memoria serial, estas son utilizadas para el
        almacenamiento de datos que pueden ser necesitados más adelante. Para el caso de la
        memoria 24LC04B tiene un espacio de memoria de 4Kbytes, luego de almacenarlos los
        volveremos a leer y mostrar en la pantalla LCD.

        Referencia    Capacida    Ciclos de    Bloques    Dirección         Cantidad    Voltaje de
                      d           E/W          Internos   A0    A1    A2    de          operación
                                                                            disposit.
                                                                            En el bus
        24LC01B       1K bits     1000000      1          1-0   1-0   1-0   8           2.5-5.5V
        24LC02B       2 K bits    1000000      1          1-0   1-0   1-0   8           2.5-5.5V
        24LC04B       4 K bits    1000000      2          x     1-0   1-0   4           2.5-5.5V
        24LC08B       8 K bits    1000000      4          x     x     1-0   2           2.5-5.5V
        24LC016B      16 K bits   1000000      8          x     x     x     1           2.5-5.5V

        El principio de funcionamiento es el siguiente: primero se envía el star (bit de arranque)
        cada palabra puesta en el bus SDA debe tener 8 bits, la primera palabra transferida debe
        contener la dirección del esclavo seleccionado, en este caso se envía el código de la
        memoria 1010 (este dato lo suministra el fabricante), luego la dirección del dispositivo
        (A2, A1, A0), y un bit 0 indicando que se debe escribir en la memoria (1 = lectura),
        luego de todo esto la memoria, debe enviar un reconocimiento para informar al
FISEI




        microcontrolador que recibió la información, este acuse de recibo se denomina ACK
        (acknowledge).



                 Octavo Electrónica 2009 – 2010                       FISEI - UTA                     79
Luego el master lee el ACK, si vale 0 (enviado por el esclavo), el proceso de
        transferencia continúa. Si vale 1, esto indica que el circuito direccionado no valida la
        comunicación, entonces es Master genera un bit de stop para liberar el bus I²C, en la
        cual las líneas SDA y SCL pasan a un estado alto, vamos a suponer que el ACK es 0,
        entonces el microcontrolador envía los 8 bits correspondientes a la posición de memoria
        que se desea escribir a leer, nuevamente la memoria envía un reconocimiento,
        finalmente se envía el dato a ser almacenado y se espera la respuesta de la memoria
        indicando que el dato llegó correctamente, finalmente se debe enviar el bit de parada.


        DECLARACIÓN

        I2CSTART genera una condición de inicio.

        I2CSTOP genera una condición de parada

        I2CRBYTE recibe un byte de un dispositivo.

        I2CWBYTE envía un byte a un dispositivo.
FISEI




                Octavo Electrónica 2009 – 2010                      FISEI - UTA                    80
En este casi vamos a escribir y leer en la memoria, por lo que el pin WP debe estar
        colocado en estado bajo, una vez que se haya grabado se podrá colocar este pin en
        estado alto para proteger la memoria de futuras escrituras, los datos almacenados en esta
        memoria permanece aun si se le corta la alimentación al CI, el acceso a estos datos se lo
        realiza las veces deseadas, recuerde que la memoria serial soporta 1000000 de ciclos de
        borrado y escritura, por lo tanto se debe tener cuidado de no ejecutar un programa que
        almacene una y otra vez el mismo dato.

         Config Sda = Portb.5
         Dim Dato As Byte
         Dim Dato1 As Byte
         Dato = 2
         Dato1 = 0
         Wait 5
         Do
         Cursor Off Noblink
         ' escribo en la memoria
            ' genere inicio
            I2cstart
            ' direccion del esclavo
            I2cwbyte &B10100000
            ' direccion de eeprom
            I2cwbyte 0
           ' valor a escribir
            I2cwbyte Dato
            ' genere parada
            I2cstop
            Waitms 10
         ' leo la memoria
            I2cstart
            I2cwbyte &B1010_0000
            I2crbyte Dato1 , Nack
            I2cstop
            Cls
            Lcd " DATO " ; Dato1
            Wait 2
            Cls
         Loop
FISEI




                 Octavo Electrónica 2009 – 2010                     FISEI - UTA                     81
INTERRUPCIONES
        Suponga que tiene un programa de Bascom que se encuentra en un bucle haciendo algo
        complicado y requiere mucho tiempo. Usted quiere ser capaz de detener esta tarea y
        cambiar el programa para hacer algo más. La solución de hardware obvia es añadir un
        botón STOP para su AVR.




        Normalmente, se pulsa el botón con el siguiente fragmento de programa:

        ...
        Config Pind.2 as Input
        ... ...
        Do
          ... ...
          ...someting complicated... ...
          ... ...
          If Pind.2 = 0 Then
            Lcd "Stop!"
            Goto Othertask
          End If
        Loop
        ... ...
        OtherTask:
FISEI




        ... ...




                Octavo Electrónica 2009 – 2010                    FISEI - UTA
                                                                                              82
El problema fundamental de este ejemplo es que podemos pasar tanto tiempo haciendo
        la tarea complicada, que al pulsar el botón STOP a menudo no se detecta cuando se
        pulso el Boton de stop. Obviamente necesitamos otro mecanismo para reaccionar a
        pulsar el botón STOP de manera independiente del programa principal. Las
        interrupciones son para cambiar el flujo del programa para responder a externos, así
        como eventos de controlador interno


         $regfile = "m8def.dat"
         $crystal = 1000000
         $hwstack = 32
         $swstack = 10
         $framesize = 40
         Config Lcd = 16 * 2
         Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2
         Config Lcdpin = Pin , Db6 = Portb.3 , Db7 = Portb.4
         Config Lcdpin = Pin , E = Portb.5 , Rs = Portb.6
         Config Lcdmode = Port
         Config Pind.6 = Output
         Config Pind.2 = Input
         Config Int0 = Falling
         Dim Wtime As Byte
         On Int0 Stopbutton
         Cls
         Wtime = 255
         Enable Interrupts
         Enable Int0

         Do
          Set Portd.6
          Waitms Wtime
          Reset Portd.6
          Waitms Wtime
         Loop
         Stopbutton:
          Lcd "stop!"
          Wait 1
          Cls
         Return
         End
FISEI




                 Octavo Electrónica 2009 – 2010                  FISEI - UTA                   83
SLEEP Y WAKE-UP, WATCH DOG
        Se utilizan normalmente en aplicaciones de batería cuando el controlador no tiene nada
        que hacer y desea ahorrar energía.
        El ATMEGA8 puede hacer el SLEEP de dos maneras:

                La declaración de inactividad se detiene el reloj del controlador, pero la UART,
                las interrupciones externas y el temporizador / contador de interrupciones seguir
                funcionando. Todas estas interrupciones pueden despertar el controlador.
                Wake-up detiene el reloj del controlador, pero las interrupciones externas se
                mantienen funcionando y puede despertar el controlador,



           $regfile = "m8def.dat"
           $crystal = 1000000
           Config Lcd = 16 * 2
           Config Lcdpin = Pin , Db4 = Portb.1 ,
           Db5 = Portb.2
           Config Lcdpin = Pin , Db6 = Portb.3 ,
           Db7 = Portb.4
           Config Lcdpin = Pin , E = Portb.5 ,
           Rs = Portb.6
           Config Lcdmode = Port
           Config Pind.6 = Output
           Config Int0 = Low Level

           On Int0 Button
           Enable Interrupts
           Enable Int0
           Do
            Set Portd.6
            Wait 1
            Reset Portd.6
            Cls
            Lcd "power apagado"
            Lowerline
            Lcd "push boton"
            Powerdown
           Loop
           Button:
            Cls
            Lcd "despierta!"
            Wait 1
           Return
           End



        Después de parpadear el LED y escribir un mensaje a la pantalla LCD,
        Desmantelamiento "se utiliza para detener el reloj del controlado. Al pulsar el botón se
FISEI




        despierta el controlador




                 Octavo Electrónica 2009 – 2010                      FISEI - UTA                    84
WATCHDOG
        Bascom puede proporcionar una función de vigilancia. n vigilante es un truco para
        restablecer su control si el programa de alguna manera se atasca o "cuelga". Un
        vigilante es un contador de tiempo que tendrá que ponerse a cero de vez en cuando. Si
        se bloquea el programa, no será capaz de restablecer la vigilancia y cuando los tiempos
        de vigilancia a cabo, se restablecerá el controlador. Esto a menudo se utiliza en
        aplicaciones críticas donde tiene que estar seguro de que el controlador se reiniciará
        pase lo que pase. Un programa decente debe lidiar con un tiempo de vigilancia en una
        forma sensata. El tiempo de espera vigilante es una situación muy grave, tal vez causada
        por un error de diseño de hardware o de software. En cualquier caso, cuando se utilizan
        perros guardianes, siempre incluyen algún tipo de mecanismo de información, o bien
        nunca se sabrá acerca de estos posibles errores.
        Un organismo de control tiene que estar configurado para un tiempo de espera
        específicas:

        Config Watchdog 16 | 32 | 64 | 128 | 256 | 512 | 1024 | 2048
        que van desde 16 hasta 2048 milisegundos.
        El organismo de control tiene que ponerse a cero antes del tiempo de espera.

        Reset Watchdog

        Para evitar un reinicio del controlador.
        El organismo de control puede ser iniciado y se detuvo con un

        Start Watchdog
        Stop Watchdog

         $regfile = "m8def.dat"
         $crystal = 1000000
         Config Lcd = 16 * 2
         Config Lcdpin = Pin , Db4 = Portb.1 ,
         Db5 = Portb.2
         Config Lcdpin = Pin , Db6 = Portb.3 ,
         Db7 = Portb.4
         Config Lcdpin = Pin , E = Portb.5 ,
         Rs = Portb.6
         Config Lcdmode = Port
         Config Pind.6 = Output
         Config Watchdog = 2048
         Do
          Cls
          Set Portd.6
          Wait 2
          Reset Portd.6
          Lcd "WD correr"
FISEI




          Lowerline
          Lcd "wait 2 secs..."
          Start Watchdog
          Idle
         Loop
         End
                Octavo Electrónica 2009 – 2010                      FISEI - UTA                    85
Después de que el perro guardián de inicio, el controlador se pone en Idle, detener el
        reloj del controlador. Como el organismo de control se ejecuta en un reloj
        independiente, se puede y se restablecerá el controlador después de app dos segundos.




                      CIRCUITO PROGRAMADOR DE AVR
        PROGRAMADOR ISP

        BASCOM soporta al STK200, STK200+ y STK300 programador ISP de Atmel.
        Éste es un programador de puerto de impresora paralelo muy fiable. La mayoría de los
        programas se probó con el STK200.
        Para aquéllos que no tienen este equipo programador les muestro el esquema siguiente
        de cómo hacer su propio programador.
FISEI




                Octavo Electrónica 2009 – 2010                    FISEI - UTA                    86
El PG302 es un programador serial. Funciona y se visualiza exactamente como el
        software PG302.




        Seleccione el programador en Opciones de menú del Programador, o clic derecho en el


        botón           o en las opciones del programa en el menú.

        EJEMPLO DEL CABLE DE PROGRAMACIÓN

        Este programador es muy simple y usted puede hacer dentro de 30 minutos. Lo que
        necesitas es un terminal DB25 (conector macho), cable, conectores.
        Las conexiones que se debe realizar son las siguientes.




        La numeración del pin MCU son para los 8535 y 8515.
        Usted puede usar una resistencia pequeña de 100-220 ohm en serie con la linea D0, D2
        y D3 evitando un corto circuito que sus LPT ponen a babor en el evento cuando los
        pines de MCU son altos. Se probó sin estas resistencias y ningún problema ocurrió.

        El siguiente grafico muestra las conexiones a realizar:
FISEI




                Octavo Electrónica 2009 – 2010                       FISEI - UTA               87
FISEI




        Octavo Electrónica 2009 – 2010   FISEI - UTA   88
FISEI




        CHIPS


                Octavo Electrónica 2009 – 2010   FISEI - UTA
AT86RF401

        Se muestra el entorno de distribución de pines, si desea información adicional se debe
        buscar los Datasheet de los Chips en www.datasheetcatalog.com




        AT90S1200
FISEI




                Octavo Electrónica 2009 – 2010                    FISEI - UTA                    89
AT90S2313




        AT90S2323
FISEI




             Octavo Electrónica 2009 – 2010   FISEI - UTA   90
AT90S2333




        AT90S2343




        Cuando usas el AT90S2343 con Bascom-AVR y el STK200, el jumper del
        programador debe estar en ext-clk.
FISEI




              Octavo Electrónica 2009 – 2010         FISEI - UTA             91
AT90S4414




        AT90S4433
FISEI




             Octavo Electrónica 2009 – 2010   FISEI - UTA   92
AT90S4434




        AT90S8515
FISEI




             Octavo Electrónica 2009 – 2010   FISEI - UTA   93
AT90S8535




        AT90PWM2-3
FISEI




             Octavo Electrónica 2009 – 2010   FISEI - UTA   94
AT90CAN128
FISEI




             Octavo Electrónica 2009 – 2010   FISEI - UTA   95
AT90USB162




        ATtiny12




        ATtiny13
FISEI




              Octavo Electrónica 2009 – 2010   FISEI - UTA   96
ATtiny15




        ATtiny22




        ATtiny24




        ATtiny25
FISEI




              Octavo Electrónica 2009 – 2010   FISEI - UTA   97
ATtiny26




        ATtiny44




        ATtiny45
FISEI




              Octavo Electrónica 2009 – 2010   FISEI - UTA   98
ATtiny48




        ATtiny84




        ATtiny85
FISEI




              Octavo Electrónica 2009 – 2010   FISEI - UTA   99
ATtiny88




        ATtiny261
FISEI




              Octavo Electrónica 2009 – 2010   FISEI - UTA   100
ATtiny861




        ATtiny2313




        ATMEGA8
FISEI




              Octavo Electrónica 2009 – 2010   FISEI - UTA   101
ATMEGA16




        ATMEGA32
FISEI




             Octavo Electrónica 2009 – 2010   FISEI - UTA   102
ATMEGA32U




        ATMEGA48
FISEI




             Octavo Electrónica 2009 – 2010   FISEI - UTA   103
ATMEGA48P




        ATMEGA88
FISEI




             Octavo Electrónica 2009 – 2010   FISEI - UTA   104
ATMEGA88P
FISEI




             Octavo Electrónica 2009 – 2010   FISEI - UTA   105
ATMEGA64
FISEI




             Octavo Electrónica 2009 – 2010   FISEI - UTA   106
ATMEGA103
FISEI




             Octavo Electrónica 2009 – 2010   FISEI - UTA   107
ATMEGA128




        ATMEGA1284P
FISEI




             Octavo Electrónica 2009 – 2010   FISEI - UTA   108
ATMEGA161




        ATMEGA162
FISEI




             Octavo Electrónica 2009 – 2010   FISEI - UTA   109
ATMEGA163




        ATMEGA164P
FISEI




             Octavo Electrónica 2009 – 2010   FISEI - UTA   110
ATMEGA165




        ATMEGA168
FISEI




             Octavo Electrónica 2009 – 2010   FISEI - UTA   111
ATMEGA168P




        ATMEGA169
FISEI




             Octavo Electrónica 2009 – 2010   FISEI - UTA   112
ATMEGA323




        ATMEGA324P
FISEI




             Octavo Electrónica 2009 – 2010   FISEI - UTA   113
ATMEGA325




        ATMEGA328P
FISEI




             Octavo Electrónica 2009 – 2010   FISEI - UTA   114
ATMEGA329




        ATMEGA406
FISEI




             Octavo Electrónica 2009 – 2010   FISEI - UTA   115
ATMEGA603
FISEI




             Octavo Electrónica 2009 – 2010   FISEI - UTA   116
ATMEGA640
FISEI




             Octavo Electrónica 2009 – 2010   FISEI - UTA   117
ATMEGA644P




        ATMEGA645
FISEI




             Octavo Electrónica 2009 – 2010   FISEI - UTA   118
ATMEGA649
FISEI




             Octavo Electrónica 2009 – 2010   FISEI - UTA   119
ATMEGA2560
FISEI




             Octavo Electrónica 2009 – 2010   FISEI - UTA   120
ATMEGA2561
FISEI




             Octavo Electrónica 2009 – 2010   FISEI - UTA   121
ATMEGA8515




        ATMEGA8535
FISEI




             Octavo Electrónica 2009 – 2010   FISEI - UTA   122
ATXMEGA128A1
FISEI




             Octavo Electrónica 2009 – 2010   FISEI - UTA   123
FISEI




        Octavo Electrónica 2009 – 2010   FISEI - UTA

Turorial avr Bascom

  • 1.
    Octavo Electrónica 2009– 2010 Universidad Técnica de Ambato Facultad de Ingeniería en Sistemas Electrónica e Industrial FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA
  • 2.
    TABLA DE CONTENIDOS INSTALACIÓN Instalación de Bascom ……………………………………………………………... 1 INTRODUCCIÓN A BASCOM Bascom ……………………………………………………………………………... 6 AVR ………………………………………………………………………………… 7 Qué es lo que usted necesita para empezar ……………………………………… 7 Su Pc ………………………………………………………………………………... 7 Construir (o comprar) un "programador" ……………………………………... 8 EL SOFTWARE DE PROGRAMACIÓN Obtener TWinAVR. ………………………………………………………………. 9 Obtener Userport …………………………………………………………………. 11 Configurar TWinAVR Bascom …………………………………………………. 12 Como usar Bascom ……………………………………………………………….. 13 Programa básico para hacer parpadear un led con intervalos de 1 segundo .. 18 Un semáforo de dos intersecciones ……………………………………………… 19 Juego de luces para discoteca …………………………………………………… 21 Ejercicio con la instrucción FOR NEXT ……………………………………….. 23 LAS VARIABLES BIT, BYTE Y WORD ……………………………………… 23 Luces del auto fantástico ………………………………………………………… 24 Ejercicios con pulsadores ……………………………………………………….. 25 La declaración IF… THEN …………………………………………………….. 25 Contador binario con pulsador antirrebote …………………………………… 27 Led intermitente de velocidad variable ………………………………………… 29 FISEI Manejo de un display de 7 segmentos con el ci.7447 ………………………….. 30 Octavo Electrónica 2009 – 2010 FISEI - UTA
  • 3.
    Un contador decimalde un digito con el ci 7447 y un pulsador ……………. 30 Manejo de un display de 7 segmentos sin el ci.7447 …………………………. 31 Declaración LOOKUP ………………………………………………………… 32 Manejo de 4 display de7 segmentos con el ci.7447 ………………………….. 33 Contador decimal de 4 digitos con el CI.7447 ………………………………… 34 Manejo de 4 displays de 7 segmentos sin el ci.7447 (rotulación) …………… 36 Manejo de 4 displays con rotulo en movimiento …………………………….. 37 Manejo de un modulo lcd ……………………………………………………… 38 Defina sus propios personajes lcd …………………………………………….. 45 Contador de pulsos con lcd ……………………………………………………. 47 Generación de sonido …………………………………………………………. 49 Una sirena policial …………………………………………………………….. 50 Generación de un timbre de teléfono celular ……………………………….. 51 Llamada telefónica DTMF …………………………………………………… 51 La declaración DTMFOUT …………………………………………………... 52 Lectura de un teclado de 16 pulsadores con display ded 7 segmentos ……. 54 Cerradura electrónica con clave en memoria flash ……………………….. 57 Cerradura electrónica con clave en memoria ram y cambio de clave …… 60 Cerradura electrónica con clave en memoria eeprom y cambio de clave .. 62 La declaración WRITEEEPROM y READEEPROM ……………………... 62 MOTORES PASO A PASO Que es un motor Paso a paso ………………………………………………… 65 Motores paso a paso bipolares ………………………………………………. 65 FISEI Motores paso a paso unipolares ……………………………………………… 67 Secuencia del circuito de control …………………………………………….. 69 Octavo Electrónica 2009 – 2010 FISEI - UTA
  • 4.
    Manejo de unmotor paso a paso en secuencia wave drive ………….……. 70 Manejo de un motor paso a paso en secuencia full step ……………..……. 71 Manejo de un motor paso a paso en secuencia half step …….………….… 71 COMUNICACIÓN Que es la comunicación serial? …………………………………………..… 72 Modos de transmisión de datos ……………………………………... 73 Comunicación serial avr a pc …………………………………………..….. 74 Comunicación serial pc a avr …………………….……………………..…. 76 Comunicación i²c ……………..………………………………………….….. 77 Comunicación i²c con una memoria serial 24l04b …………………….…. 79 Interrupciones ………………………………………………………….....…. 82 SLEEP Y WAKE-UP, WATCH DOG …………………………….……….. 84 Circuito programador de AVR ……………………………………….…… 86 Datashteets ……………………………………………………………….. 89 - 123 FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA
  • 5.
    FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA
  • 6.
    FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA
  • 7.
    INSTALACIÓN INSTALACIÓN DE BASCOM Después de que usted ha descargado el archivo ZIP que usted necesita, debe ABRIR el archivo. En Windows XP, para la versión de la DEMOSTRACIÓN, corra los setupdemo.exe. (http://www.atmel.com : (http://www.ckuehnel.ch) Click en el botón Next para seguir la instalación. Aparecerá la ventana de información de la licencia. FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 1
  • 8.
    Leer las instrucciones,selecciones 'I accept the agreement' y presione el botón NEXT. La ventana siguiente se mostrará Lea la información adicional y presiones el botón NEXT Ahora la próxima pantalla aparecerá: Usted puede seleccionar la direccion y camino dónde le gusta que BASCOM sea instalado. Usted puede también acepte el valor predefinido que es C:Archivo de programasMCS ElectronicsBASCOM-AVR FISEI Cuando tu termines click en botón NEXT para continuar Octavo Electrónica 2009 – 2010 FISEI - UTA 2
  • 9.
    Cuando el directorioexiste, porque usted instala una más nueva versión, usted conseguirá una advertencia. En caso de la advertencia, selecciones Yes. Tú observaras la siguiente ventana. Usted puede escoger crear en un nuevo Grupo del Programa llamdo 'BASCOM-AVR', o usted pueda modificar el nombre, o instale en un Grupo del Programa existente, presione el boton Next después de que usted ha hecho su opción Ahora el archivo esta siendo instalado. FISEI 3 Octavo Electrónica 2009 – 2010 FISEI - UTA
  • 10.
    Después de quelos archivos principales se instalan, algunos archivos adicionales se instalarán. Cuando la instalación está lista usted verá la última pantalla Usted tiene que reiniciar su computadora. FISEI 4 Octavo Electrónica 2009 – 2010 FISEI - UTA
  • 11.
    La carpeta delprograma BASCOM se crea: Usted puede ver los "Raed me" y archivos de la Licencia y usted puede empezar BASCOMAVR. FISEI 5 Octavo Electrónica 2009 – 2010 FISEI - UTA
  • 12.
    FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA
  • 13.
    INTRODUCCIÓN: BASCOM YAVR BASCOM: Medios básicos del compilador Bascom. Bascom es desarrollado y vendido por MCS Electronics. Bascom viene en tres variantes Bascom-LT para microcontroladores Atmel AT89Cx051 Bascom-8051 de 8051 microcontroladores. Bascom-AVR de microcontroladores Atmel AVR Bascom es una aplicación para PC que le permitirá: Escribir programas en Basic Traducir estos programas en el PC para código maquina (un formato que el controlador puede ejecutar AVR). Simular el código compilado El uso de programas externos de flash ("programa"), el código compilado en microcontrolador de un AVR Atmel. Lo bueno de Bascom es que se puede empezar con una versión libre Bascom, y descargar el Bascom-AVR Demo zip-file), cuyo único límite es la 4k tamaño del código generado (esto fue 2k hasta 2005 ). The obvious choice of AVR microcontroller would then be one of the (2k flash) ATTiny models or the much-used (but now obsolete) AT90S2313 which will let you get acquainted with Bascom and AVR microcontrollers. La elección obvia de microcontrolador AVR sería uno de los flash (2K) modelos ATTINY o el tan usado (pero ahora obsoleto) AT90S2313 que le permitirá familiarizarse con Bascom y microcontroladores AVR. Bascom permite crear rápidamente prototipos porque se ha incorporado soporte para casi todos los microcontroladores AVR características tales como: Contadores / temporizadores UART ADC PWM I2C Además de que soporta gran cantidad de periféricos, tales como: Botones LCD de alfanuméricos LCD Gráficos PS / 2 para teclado FISEI Control remoto por infrarrojos Es sobre todo este apoyo que hace que el uso de Bascom atractivo en términos de tiempo ahorrado, mientras que el desarrollo de una aplicación. Octavo Electrónica 2009 – 2010 FISEI - UTA 6
  • 14.
    AVR: AVR es una familia de microcontroladores de 8 bits con una amplia gama de variantes diferentes en: Tamaño del programa de la memoria (flash) Tamaño de la memoria EEPROM Número de pines I / O Número de servicios tales como características de los chips UART y ADC Paquete de formularios El más pequeño es el microcontrolador ATTINY11 con 1k flash y 6 pines I / O. The largest is the ATMEGA256x with 256k flash, 54 I/O pins and lots of on-chip features. La más grande es la ATMEGA256x con 256K flash, 54 pines I / O y muchas de las características del chip. Todos los controladores tienen el AVR RISC mismo como conjunto de instrucciones, que permite portar bastante fácil de los programas de Bascom entre los tipos de microcontroladores. Que ejecutar una instrucción por ciclo de reloj haciéndolas sensiblemente más rápido que el 8 bits comparables 4 ciclos de reloj por cada instrucción de los controladores de Microchip PIC. ¿QUÉ ES LO QUE USTED NECESITA PARA EMPEZAR? La siguiente lista es el mínimo que necesita para empezar con la primera solicitud: Un PC con un puerto paralelo con Windows (95 y más). Bascom instalado en su PC. Un "programador", un dispositivo que carga el código que se compila por Bascom en la memoria del programa del microcontrolador. Una configuración de prueba con un microcontrolador. SU PC Su PC debe ejecutar W95 o superior, consulte la página Bascom AVR para más detalles. Si usted quiere construir su propio programador sencillo, el PC debe tener un puerto paralelo o en serie. Si su PC funciona NT, 2000 o XP, acceso al puerto paralelo requiere un pequeño programa independiente. Detalles de seguir adelante. FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 7
  • 15.
    Instalar Bascom Comience con la descarga de la versión libre Bascom. Se limitará el tamaño de código que puede compilar (traducir de base a código de máquina AVR) de 2k, pero le ayudará a empezar con casi todos los aspectos importantes de Bascom y controladores AVR. Ir a la Electrónica MCS, sitio web a continuación, seleccione Descargas y, a continuación Bascom, a continuación, Bascom-AVR, y descargar el Bascom-AVR Demo archivo ZIP. Descomprimir en un directorio temporal. A continuación, inicie el programa de instalación ejecutable, que ahora debería estar en este directorio temporal. Instale Bascom, usted puede elegir el directorio de instalación. Cree un directorio Bascom de trabajo, por ejemplo: C: Yourname Bascom Construir (o comprar) un "programador" Aquí, un programador es un dispositivo para obtener el código Bascom compilado en la memoria flash del microcontrolador AVR. La forma más fácil sería comprar un programador. i elige la STK500 Atmel, se obtiene un programmerboard con un controlador de AVR y algunos periféricos, tales como LED's. Esto le permite ponerse en marcha inmediatamente. Sin embargo, la construcción de su propio programador es fácil y barato. Un programador muy básico es el basado en el SP12 trabajado por Roland Walter. Su hardware del programador es controlado a través del puerto paralelo del PC con un pequeño programa llamado TWinAVR. Usted debe descargarlo también. Descomprimir TWinAVR a una ubicación conveniente en su PC. No se necesita configuración, puede ejecutar TWinAVR.exe directamente desde el directorio de descarga La versión de Roland es un programador en el que tienes que poner el microcontrolador AVR en un zócalo, el programa, quite el microcontrolador y colocarlo en la configuración del circuito. Lo hice un par de veces y consideró que sería posible modificar su hardware de programación para que en la Programación del Sistema (ISP). Para ello ISP, usted simplemente puede reservarse el microcontrolador pines que se trate con la programación para este fin. Sin embargo, mientras esté conectado el programador, estos pines no se puede utilizar para cualquier otro fin, puesto que podría producirse un conflicto entre el programador, el microcontrolador y cualquier otra cosa adjunta a estos pines. Esto no sería tanto un problema con microcontroladores grandes con gran cantidad de pines I / O, pero en el AVR pequeños, sacrificando esos pines para la programación externa a menudo no es posible. La solución es modificar el programador de tal manera que las clavijas de programación sólo se conecta al microcontrolador mientras que la programación está lugar. Para un buffer, he intentado un 74HCT244 y 74HCT541. Los resultados de estos búferes pueden ser tri-dijo, lo que significa que sus resultados se puede dejar aislados o "flotantes", evitando así problemas con el hardware conectado a los pines de programación. FISEI Este programador simple puede ser construido sobre un trozo de Vakelita.. 8 Octavo Electrónica 2009 – 2010 FISEI - UTA
  • 16.
    El software deprogramación Obtener TWinAVR. Este es el software que se comunica a través del hardware de programación se realizó con el controlador de AVR. Les recomendamos que usen el TWinAVR hecho por Ronald Walter. Ir a su página web, en la columna de la izquierda, seleccione microcontrolador, seleccione Programador, lea el texto (que usted aprenderá algunas TWinAVR alemán!) Y descargar. TWinAVR de instalación TWinAVR tiene que ser configurado para usar el Vcc generados por algunos pines del puerto paralelo para cambiar el buffer. FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 9
  • 17.
    Iniciar TWinAVR, hagaclic en el logo de TWinAVR en la esquina superior izquierda, haga clic en el Ajuste. Se aparecerá la siguiente ventana, para configurar el software. En esta ventana desactive la casilla Vcc. Esto significa que sólo se genera Vcc TWinAVR mientras está activo. Si a continuación, utilizar esta Vcc para cambiar el buffer 74HCT244, el bufferports será aislado TWinAVR cuando no está activo, dando lugar a "En la programación del sistema. Aproveche esta oportunidad para comprobar la configuración en paralelo: si el puerto no está en el estándar de la dirección "y 378", (comprobarlo en la BIOS del PC si es necesario) cambiar la configuración LPT en consecuencia. FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 10
  • 18.
    Obtener Userport sies necesario Si está utilizando Windows NT, 2000 o XP, TWinAVR no tendrán acceso directo al puerto paralelo. Una solución es usar un programa piloto especial que proporciona acceso directo. Uno de ellos es un programa de Userport. Debe ser instalado y la configuración antes de utilizar TWinAVR. En primer lugar, Userport descarga. Descomprima en un directorio, y Userport.sys copia de este directorio C: Windows System32 Drivers. Leer Userport.pdf. Userport.exe de inicio. La ventana principal muestra la configuración predeterminada. Asumiendo que su puerto paralelo está en "y 378", sólo es necesario la primera entrada en la ventana de la izquierda para permanecer. En la ventana izquierda, seleccione 3BC-3BF y 3E8-3FF y haga clic en Eliminar. Repita este paso para todas las entradas en la ventana derecha. FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 11
  • 19.
    Lo que quedaes 200-37F en la ventana izquierda. Click on Start. Haga clic en Iniciar. Userport ahora activa la dirección seleccionada gama para usted y lo harán cada vez que enciendes tu PC. Si necesita utilizar el puerto paralelo para otros fines, por ejemplo una impresora, debe iniciar el programa de Userport y haga clic en Detener. El conductor será cancelada. Configurar TWinAVR Bascom Bascom compila código básico en un "Bin'-archivo. Esta caja-archivo contiene las instrucciones de AVR en el llamado código de máquina, lo que el controlador de AVR puede ejecutar directamente. Usted puede utilizar un programador externo para escribir esta caja de archivo en la memoria flash del AVR. El programador externo, a su vez, es controlado a través de un programa separado como TWinAvr. TWinAvr le permite seleccionar el archivo HEX que debe enviar al AVR. Sin embargo, es mucho más fácil si Bascom directamente TWinAvr podría comenzar después de la compilación está terminada y decirle que TWinAvr hex-archivo para su uso. Esto se puede hacer en Bascom como sigue: Inicio Bascom, seleccione Opciones / Programador Externo Seleccione 'programador' de la lista de los programadores Seleccione la pestaña "Otros" Entrar en el "programa" campo de la localización de su software de programación, TWinAvr.exe en nuestro caso. Utilice el. FISEI Introduzca en el campo "Parámetro ': (archivo) Octavo Electrónica 2009 – 2010 FISEI - UTA 12
  • 20.
    Esto le dicea Bascom para iniciar TWinAvr con el nombre de la bandeja de archivo, se produce después de que la compilación fue exitosa: A continuación, haga clic en Aceptar. PROGRAMACIÓN BÁSICA PARA HACER PARPADEAR LEDs CON INTERVALOS DE 1 SEGUNDO POR MEDIO DE TODO EL PUERTO B. Este es el programa con el cual iniciaremos nuestro primeros pasos en el mundo de los AVR, este programa te enseñara a configura los puertos de nuestro microcontrolador. En primer lugar, configurar Bascom para iniciar TWinAvr con el nombre correcto de la bandeja de archivo se produce después de una compilación exitosa. A continuación, proceder como sigue Inicio Bascom Seleccione Archivo / Nuevo FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 13
  • 21.
    En el textwindowque aparece, entrar en el programa de bases siguientes: “El atmega8 posee 8kb de memoria flash, 512 bytes eçde EEPOM, y 1KB de SRAM, posee 2 timers, 2 de 8 bits y uno de 16 bits…Posee un reloj de tiempo real (RTC) con oscilador externo.. y 6 canales de ADC… y por supuesto comunicación serial…” (A medida que escribe Bascom va a cambiar el texto del programa de color de acuerdo a las palabras clave que reconoce). En este simple de los programas, PORTB del AVR ATMEGA8 por primera vez configurado para funcionar como una salida. PORTB Entonces se establece en el valor decimal 255. Los ocho bits de PORTB se establece ahora en valor binario "uno". Tenga en cuenta que sólo la parte inferior de siete bits están disponibles en el exterior como alfileres PB0 hasta PB6. Si se conecta cualquiera de estos pines a un LED con un FISEI resistor limitador de corriente a tierra, la corriente fluirá desde el AVR a los LED. El LED está encendido. Después de esperar durante 1000 milisegundos, PORTB se 14 Octavo Electrónica 2009 – 2010 FISEI - UTA
  • 22.
    establece en elvalor decimal 0. Ahora, todos los pines se establecen en el valor binario de "cero" y no pasará corriente del AVR a los LED. El LED está apagado. Después de esperar otros 1000 milisegundos, se repite el ciclo. El resultado es que el LED encenderse y apagarse. Después de introducir el texto del programa, seleccione Archivo / Guardar como y seleccione una ubicación y un nombre para el archivo. Supongamos que usted seleccione 'ledflasher.bas' como un nombre de archivo. Como Bascom genera gran cantidad de archivos después de una compilación, es una buena idea crear directorios separados para cada proyecto Bascom que trabajar. Bascom ahora se puede contar acerca de su configuración del controlador de AVR. Seleccione Opciones / Compiler / Chip El chip está predeterminado a ATMEGA 8: FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 15
  • 23.
    Ahora, seleccione lapestaña de Comunicación: Por defecto, la velocidad de reloj es de 4MHz, pero como usamos un cristal de 1MHz, seleccione 1000000 de la lista de «frecuencia» Después se guarda el archivo, seleccione Program / Compile (F7). FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 16
  • 24.
    A continuación lesdejo el circuito simulado, con el cual pueden ver funcionamiento de nuestro primer programa creado. Para simular necesitamos cualquier software dedicado a la electrónica que posea las librerías de AVR, yo use el software Proteus, lo puedes bajar de www.4shared.com. Ahora vamos a aprender como configurar cada bit de los diferentes puertos como salida o entrada, para ello vamos a realizar el siguiente ejemplo. FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 17
  • 25.
    FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA
  • 26.
    PROGRAMA BÁSICO PARAHACER PARPADEAR UN LED CON INTERVALOS DE 1 SEGUNDO. Este proyecto es muy parecido al que lo vimos anteriormente, si usted no ha leído todo el folleto, hágalo. ' Indico al compilador que micro voy a usar $regfile = "m8def.dat" ' Cristal interno de 1MHz $crystal = 1000000 '******************************************************************* '*ENE STE EJEMPLO VAMOS A REALIZAR EL PARPADEO DE LOS LEDS... PERO VAMOS '*VAMOS A VER COMO SE PUEDE CONFIGURAR BIT A BIT EL I/O DE UN PUERTO.... '*PARA ESTO VAMOS A USAR EL COMANDO DDR.... EL CUAL DEBE IR ACOMPAÑADO DEL '*COMANDO PORT...... '*ACA UNA BREVE DESCRIPCION DE ESTOS COMANDOS.. '*** DDBn PORTBn E/S Pull up Comment '*** 0 0 Entrada No Tercer estado (Alta impedancia) '*** 0 1 Entrada Yes PBn '*** 1 0 Salida No Push-Pull Salida en Cero '*** 1 1 Salida No Push-Pull Salida en Uno '* DECIR BREVEMENTO QUE DEPENDIENDO DE LOS VALORES QUE DEMOS A ESTOS PARAMETROS '* OBTENDREMOS SALIDAS O ENTRADAS EN UN PUERTO... '* PARA ESTE EJEMPLO VAMOS A CONFIGURAR BIT A BIT EL PORTB PARA QUE SEAN SALIDAS EN 0 '* LOGICO '* POR LO QUE LOS VALORES DEBEN SER DDRn 1 Y PORTn 0.. '* Configuro todo el puerto B.0 como salida Ddrb.0 = 1 Portb.0 = 0 ' Nombre de subrutina Parpadear: ' Activar el puerto B.0 Portb.0 = 1 ' Espero 1 segundo Wait 1 ' Apagar el puerto B.0 Portb.0 = 0 ' Espero 1 segundo Wait 1 ' ir a la subrutina parpadear Goto Parpadear End FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 18
  • 27.
    Una vez escritoel programa compilamos y grabamos el AVR, si no sabe como hacerlo recordamos leer las páginas anteriores, no olvide dejar conectado como ilustra la figura siguiente: Una vez realizado este proyecto siga intentando con diferentes tiempos de Wait, recuerde que son en segundos, pruebe Wait 3 verá que el parpadeo es mas lento, así mismo ponga diferentes valores entre los 2 Wait, vera diferentes efectos. Si desea tiempos mas pequeños debe usar Waitms, este se mide en milisegundos. UN SEMAFORO DE DOS INTERSECCIONES. Este es el ejemplo ideal para entender como asignar nombres a los diferentes bits de los puertos, para ello usaremos un grupo de leds y manejaremos todo el puerto, existe otra forma de realizar este proyecto, es controlando el puerto como un todo, para que entiendan lo que digo, voy a realizar de las dos formas el programa. ' Indico al compilador que micro voy a usar $regfile = "m8def.dat" ' Cristal interno de 1MHz $crystal = 1000000 ' Configuro todo el puerto B.0 como salida Config Portb = Output ' Nombre de subrutina Semaforo: Portb = 33 Wait 9 Portb = 34 Wait 3 Portb = 12 Wait 9 FISEI Portb = 20 Wait 3 Goto Semaforo End Octavo Electrónica 2009 – 2010 FISEI - UTA 19
  • 28.
    Bien es momentode escribir el programa, empecemos de la forma que se maneja el puerto completo, para esto debemos entender como trabaja los semáforos. Primero nunca se encienden las luces del mismo color, es decir no puede estar en el un semáforo verde y en el otro verde también existe un cambio de verde a amarillo mientras en el otro semáforo sigue en rojo, en el momento que se pone en rojo el primer semáforo el segundo salta de rojo a verde. Por considerar que esta es una practica, pondremos tiempos estimados de cambio de color, de verde a amarillo durante 9 segundos, de amarillo a rojo solo 3 segundos. ' Indico al compilador que micro voy a usar $regfile = "m8def.dat" ' Cristal interno de 1MHz $crystal = 1000000 ' Configuro todo el puerto B.0 como salida Config Portb = Output ' asigno nombres a los bit del puertoB Verde2 Alias Pinb.0 Amarillo2 Alias Pinb.1 Rojo2 Alias Pinb.2 Verde1 Alias Pinb.3 Amarillo1 Alias Pinb.4 Rojo1 Alias Pinb.5 ' Nombre de subrutina Semaforo: Rojo1 = 1 : Verde2 = 1 Wait 9 Verde2 = 0 : Amarillo2 = 1 Wait 3 Amarillo2 = 0 Rojo1 = 0 Verde1 = 1 Rojo2 = 1 Wait 9 Verde1 = 0 : Amarillo1 = 1 FISEI Wait 3 Goto Semaforo End Octavo Electrónica 2009 – 2010 FISEI - UTA 20
  • 29.
    Es esta otramanera de escribir el programa, noten que es más largo que el primer programa, y además colocamos Alias a los diferentes bits del puerto B. Rojo1 = 1 Verde1 = 1 Podemos escribirlo asi: Rojo1 = 1 : Verde1 = 1 JUEGO DE LUCES PARA DISCOTECA Este proyecto propone familiarizar aún más con el manejo de los puertos, esta vez vamos a utilizar las 8 salidas del puerto B, se trata de una secuencia de luces que deben encender de izquierda a derecha una tras otra con un intervalo de 200 mili segundos. En la figura siguiente se muestra como conectar cada uno de los leds. A continuación, en el siguiente programa veremos una declaración nueva el GOSUB y el RETURN, estos sirven para cuando tenemos muchas repeticiones de una línea o grupo de líneas de programa, en nuestro caso el Wait, en vez de poner en cada cambio de estado de las luces, lo agrupamos en una sola subrutina y lo llamaremos las veces que queramos, la declaración RETURN lo envía de regreso a continuar después del GOSUB que lo envió. Una de las ventajas mas importantes que tenemos es que ahorra espacio en el AVR, y otra que si queremos cambiar el Wait por el de otro valor, basta con cambiar una sola vez y el cambio se ejecuta para todos, lo que al contrario si no lo utilizaremos el GOSUB y escribiríamos 30 Wait, deberíamos cambiarlo a los 30 Wait por el de otro valor, un ejemplo sería: FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 21
  • 30.
    $regfile = "m8def.dat" $crystal = 1000000 Config Portb = Output Discoteca: Portb = 1 Gosub Pause Portb = 2 Gosub Pause Portb = 4 Gosub Pause Portb = 8 Gosub Pause Portb = 16 Gosub Pause Portb = 32 Gosub Pause Portb = 64 Gosub Pause Portb = 128 Gosub Pause Goto Discoteca Pause: Waitms 300 Return End Nota: La ubicación de la subrutina Pause, es importante, fíjense que se encuentra después y fuera de las líneas principales de programación, si esta misma subrutina lo colocáremos al principio del programa, de seguro se nos cuelga por que al encontrar el RETURN simplemente no sabe a donde retornar ya que nadie lo ha enviado aún. EJERCICIO CON LA INSTRUCCIÓN FOR NEXT Este proyecto es muy importante encenderlo, ya que el siguiente proyecto de luces de auto fantástico utilizando la declaración FOR NEXT. Esa declaración sirve para ejecutar un número n de veces una línea de programa o grupo de líneas de programa, el siguiente proyecto pretende encender un led en el puerto B.0 5 veces con intervalo de medio segundo segundo, después debe detenerse por 2 segundos y luego parpadear 3 veces mas, detenerse por 3 segundos y luego repetir nuevamente el proceso, se puede utilizar el proto que se armo para las luces de discoteca ya que el mismo nos servirá después para el siguiente proyecto el de las luces del auto fantástico, FOR NEXT se utiliza de la siguiente manera: FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 22
  • 31.
    Dim Peter AsByte ; Primero se crea y asigna un tamaño para la variable peter FOR Peter = 1 to 5 ; Ejecuta las siguientes instrucciones 5 veces hasta donde dice NEXT …….. ; una vez concluido las repeticiones continúa con la declaración que está …….. ; después del NEXT, peter debe ser creado como variable, es decir NEXT ; asignarle un espacio en la memoria en este caso para 5. LAS VARIABLES BIT, BYTE Y WORD. Estas son creadas para guardar datos en la memoria RAM (Random Access Memory) o memoria de acceso casual, esta memoria trabaja únicamente mientras esté alimentado el AVR, una vez que el AV R es desconectado, los datos de la memoria RAM se borran. Dim Repe As Bit ; crea una variable y asigna un tamaño de un bit, es decir 0 o 1 Dim Repe As Byte ; crea una variable y asigna un tamaño de 8 bits, es decir 0 a 255 Dim Repe As Word ; crea una variable y asigna un tamaño de 2 bytes, es decir 0 a 65535 Para nuestro caso como queremos hacer 5 repeticiones, nos corresponde crear un BYTE que nos permite almacenar un número hasta 255. $regfile = "m8def.dat" $crystal = 1000000 Config Portb = Output Led1 Alias Pinb.0 ' creo una variable llamada Repe con ' longitud BYTE Dim Repe As Byte Programa: ' ciclo FOR For Repe = 1 To 5 Led1 = 1 Waitms 500 Led1 = 0 Waitms 500 Next Wait 2 For Repe = 1 To 5 Led1 = 1 Waitms 500 Led1 = 0 Waitms 500 Next Wait 3 Goto Programa End FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 23
  • 32.
    LUCES DEL AUTOFANTÁSTICO (DESPLAZAMIENTOS) Este proyecto es muy similar al de las luces para discoteca, con la diferencia de que este se enciende de izquierda a derecha y luego de derecha a izquierda, pensaríamos que el programa será el doble del tamaño que el que hicimos paira las luces de discoteca, pero no es así, recuerde que existen varios caminos para llegar a un mismo objetivo, y este es uno de ellos, esta vez utilizaremos los desplazamientos, que no son nada más que recorrer un uno lógico a la izquierda o - Derecha de la salida de los puertos. Los desplazamientos utiliza la multiplicación y la división, como sabemos el AVR trabaja con el sistema binario, si tenemos una variable X con un valor inicial de 1 (%00000001) y lo Multiplicáramos por 2 . el resultado sería 2 (%00000010),y este a su vez lo volveríamos a multiplicar por 2 el resultado sería 4 (%00000100), y así sucesivamente hasta llegar a 128, en le en binario sería (% 10000000), veríamos que los leds se enciende de la misma forma que las luces para discoteca, para hacer que las luces se regresen hasta el puerto B.0 debemos dividir para 2, entonces 128 / 2 es igual a 64 (%01000000), como podemos ver ahora está regresando a su lugar de origen, los desplazamientos se escribe de la siguiente manera: Rotate Portb , Left ;desplaza a la izquierda un bit en el puerto Rotate Portb , Right ;desplaza a la derecha un bit en el puerto Entendido como funcionan los desplazamientos desarrollamos el siguiente programa: $regfile = "m8def.dat" $crystal = 1000000 Config Portb = Output ' creo una variable llamada I con ' longitud BYTE Dim I As Byte Portb = 1 Programa: ' ciclo FOR For I = 1 To 7 Rotate Portb , Left Waitms 150 Next For I = 1 To 7 Rotate Portb , Right Waitms 150 Next Return Goto Programa End FISEI Nota: No olvide cargar al Puerto con 1, porque si no lo hace significa que vale cero (0) y esto multiplicado por 2 siempre dará cero, en consecuencia nunca veríamos el desplazamiento. Octavo Electrónica 2009 – 2010 FISEI - UTA 24
  • 33.
    EJERCICIOS CON PULSADORES Para esta practica debemos entender como funciona los pulsadores con el AVR, existe básicamente 2 tipos de conexión para los pulsadores, el que siempre está en 1 lógico (5V) y cuando es pulsado cambia a cero lógico (0V), y el que está en cero lógico y cuando pulsamos para a uno lógico, los siguientes son los diagramas de conexión. LA DECLARACION IF… THEN. Esta sirve de condicionante, si es verdadera ejecuta la operación que sigue al THEN, y si es falsa a la siguiente línea después del THEN, existen varias formas de aplicación. IF porb.0 = 0 THEN Michu ; ir a Michu si la entrada Portb.0 es cero lógico IF porb.0 = 1 THEN Gato ; ir a Gato si la entrada Portb.0 es uno lógico IF porb.0 = 0 THEN ; Si la comparación es verdadera ejecuta todo el Porta.0 = 1 ; contenido que se encuentra entre el THEN y el Wait 1 ; END IF Porta.0 = 0 ENDIF FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 25
  • 34.
    IF porb.0 =0 THEN ; Si la comparación es verdadera ejecuta todo el ………. ; contenido que se encuentra entre el THEN y el ELSE ; ELSE y si es falsa ejecuta el contenido entre ………. ; ELSE y END IF ENDIF IF pato > 10 THEN Majo ; si la variable pato es mayor que 35 ejecuta Majo El siguiente es el diagrama de conexión para esta práctica del pulsador: Diagrama de conexión de un pulsador conectado en el puerto B0, de estado 1 lógico, en el momento que es presionado este desvía la tensión hacia tierra, por lo que el AVR detecta un cambio de estado a cero lógico, en ese instante se enciende el led. A continuación el programa en Basic para leer el estado de un pulsador: FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 26
  • 35.
    ' Indico alcompilador que micro voy a usar $regfile = "m8def.dat" ' Cristal interno de 1MHz $crystal = 1000000 '******************************************************************* '*** ENE STE EJEMPLO VAMOS A REALIZAR EL PARPADEO DE LOS LEDS... PERO VAMOS '*** VAMOS A VER COMO SE PUEDE CONFIGURAR BIT A BIT EL I/O DE UN PUERTO.... '*** PARA ESTO VAMOS A USAR EL COMANDO DDR.... EL CUAL DEBE IR ACOMPAÑADO DEL '*** COMANDO PORT...... '*** ACA UNA BREVE DESCRIPCION DE ESTOS COMANDOS.. '*** DDBn PORTBn E/S Pull up Comment '*** 0 0 Entrada No Tercer estado (Alta impedancia) '*** 0 1 Entrada Yes PBn '*** 1 0 Salida No Push-Pull Salida en Cero '*** 1 1 Salida No Push-Pull Salida en Uno '*** DECIR BREVEMENTO QUE DEPENDIENDO DE LOS VALORES QUE DEMOS A ESTOS '*** PARAMETROS OBTENDREMOS SALIDAS O ENTRADAS EN UN PUERTO... '*** PARA ESTE EJEMPLO VAMOS A CONFIGURAR BIT A BIT EL PORTB PARA QUE '*** SEAN SALIDAS EN 0 LOGICO '*** POR LO QUE LOS VALORES DEBEN SER DDRn 1 Y PORTn 0.. ' Configuro todo el puerto B.0 como entrada, con resistencia push pull Ddrb.0 = 0 Portb.0 = 0 ' Configuro todo el puerto C.0 como salida Ddrc.0 = 1 Portc.0 = 0 Programa: If Pinb.0 = 0 Then Goto Encender Goto Programa Encender: Portc.0 = 1 Wait 3 Portc.0 = 0 Goto Programa End CONTADOR BINARIO CON PULSADOR ANTIRREBOTE En esta práctica haremos un contador binario, el resultado lo veremos en código binario a través de 8 leds conectados al puerto B. Para esta practica necesita poner un antirrobote al pulsador, ya que si presiona por un instante, dada la velocidad que procesa el AVR el programa se ejecutara varias veces hasta que suelte el pulsador, para aprender de los errores haga el programa sin antirrobote y luego con antirrobote. FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 27
  • 36.
    $regfile = "m8def.dat" $crystal = 1000000 Ddrc.0 = 0 Portc.0 = 1 Config Portb = Output Dim Num As Byte Num = 0 Pulsar: Portb = Num If Pinc.0 = 0 Then Goto Contar Goto Pulsar Contar: Num = Num + 1 Goto Pulsar End Si tuvo la oportunidad de ver funcionando este proyecto, se dará cuenta que cada que se pulsa el botón el contador aumenta demasiado, esto es como se dijo antes por el AVR trabaja a gran velocidad cada instrucción y cuando una persona presione el botón, por lo menos necesita de 100ms de tiempo para soltarlo, en este tiempo el AVR ya sumo alrededor de 25000 veces. Para solucionar este problema proponemos hacer un programa de antirrobote de tecla, en el cual si presionamos el botón, este envía a un programa que lo mantiene encerrado, únicamente sale de esta subrutina en el momento que el pulsador deja de ser presionado, a continuación incluimos un WAITMS 200, que es necesario para que en el momento de soltar la tecla se estabilice la señal. $regfile = "m8def.dat" $crystal = 1000000 Ddrc.0 = 0 Portc.0 = 1 Config Portb = Output Dim Num As Byte Num = 0 Pulsar: Portb = Num If Pinc.0 = 0 Then Goto Contar Goto Pulsar Contar: If Pinc.0 = 0 Then Goto Contar Waitms 200 Num = Num + 1 Goto Pulsar End Para conocer más sobre los operadores matemáticos disponible como: resta FISEI multiplicación, división, etc. Existentes en el Software BASCOM, se recomienda ver la ayuda del software. Octavo Electrónica 2009 – 2010 FISEI - UTA 28
  • 37.
    LED INTERMITENTE DEVELOCIDAD VARIABLE Este proyecto se basa en dos pulsadores, el primero para aumentar la frecuencia del parpadeo del led, y el segundo para disminuir la frecuencia de parpadeo. Para esto utilizaremos dos operadores matemáticos, la suma y la resta, la suma incrementa las repeticiones de una instrucción FOR…NEXT, que contiene un WAITMS 5, mientras que la resta disminuirá las repeticiones del mismo wait. Debemos tener en cuenta que una variable BYTE no puede exceder su contenido a mas de 255. ni tampoco pasar a valores negativos al ser restado consecutivamente, si excediera el valor a mas de 255, el mismo se carga con valor de cero, y viceversa si el resultado de la resta pasara a negativo, la variable se carga con 255. $regfile = "m8def.dat" $crystal = 1000000 Ddrb.0 = 0 Portb.0 = 1 Ddrb.1 = 0 Portb.1 = 1 Ddrc.0 = 1 Portc.0 = 0 Led Alias Portc.0 ' Pbaja Portb.1 ' Psube Portb.0 Dim Xy As Byte Dim Veces As Byte Veces = 100 Inicio: Led = 1 Gosub Tim Led = 0 Gosub Tim Goto Inicio Tim: If Pinb.0 = 0 Then Gosub Restar If Pinb.1 = 0 Then Gosub Sumar For Xy = 1 To Veces Waitms 5 Next Return Sumar: If Veces > 150 Then Return Veces = Veces + 5 Return Restar: If Veces < 10 Then Return Veces = Veces - 5 Return End FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 29
  • 38.
    PROYECTO CON DISPLAYS MANEJO DE UN DISPLAY DE 7 SEGMENTOS CON EL CI.7447 Los display son muy utilizados para visualizar datos. Para esta práctica se utiliza como periférico de salida un display tipo ánodo común, para lo cual se facilita el diagrama en la figura siguiente. El proyecto consiste en hacer un contador decimal (0,…,9), con intervalos de 0.5 segundos. El programa es muy similar al contador binario, con la diferencia que solo se necesita 4 bits del puerto, el decodificador binario a 7 segmentos (7447), es encargado de transformar el número binario que ingresa al número decimal. $regfile = "m8def.dat" $crystal = 1000000 Config Portc = Output Dim Numero As Byte Encerar: Numero = 0 Visualizar: Portc = Numero Waitms 500 If Numero = 9 Then Goto Encerar Numero = Numero + 1 Goto Visualizar End UN CONTADOR DECIMAL DE UN DIGITO CON EL CI 7447 Y UN PULSADOR Adicionando al proyecto anterior un pulsador se hace un contador manual de un digito. No se olvide hacer un programa antirrobote de tecla, por el caso expuesto anteriormente. El diagrama de este proyecto es el mismo de la figura anterior, pero adicionando un pulsador de estado uno lógico en el puerto B.0. FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 30
  • 39.
    $regfile = "m8def.dat" $crystal = 1000000 Config Portc = Output Ddrb.0 = 0 Portb.0 = 1 Dim Numero As Byte Encerar: Numero = 0 Visualizar: Portc = Numero If Pinb.0 = 0 Then Goto Aumentar Goto Visualizar Aumentar: If Pinb.0 = 0 Then Goto Aumentar Waitms 200 If Numero = 9 Then Goto Encerar Numero = Numero + 1 Goto Visualizar End MANEJO DE UN DISPLAY DE 7 SEGMENTOS SIN EL CI.7447 Como se sabemos, al AVR se le puede programar para reemplazar a casi cualquier circuito integrado, en esta ocasión haremos que le propio AVR sea como el CI.7447, para esto debemos saber que para sacar el numero 3 por ejemplo, debemos calcular el numero decimal que hace que se enciendan los segmentos correctos del display, esto se hace de la siguiente forma. Como debemos encender los segmentos a, b, c, d y g. revisamos los pintes del AVR que les corresponde y estos son: B0, B1, B2, B3 y B6, respectivamente, estos debemos FISEI ponerlos en cero lógicos para que los segmentos se enciendan (recuerde que el display es ánodo común), y los demás 1 lógico para que permanezcan apagados: Octavo Electrónica 2009 – 2010 FISEI - UTA 31
  • 40.
    DECLARACIÓN LOOKUP Sirve para obtener un valor constante de una tabla, esto lo hace según el número de veces que repita el FOR…NEXT, por ejemplo la primera vez toma el dato que se encuentra en el lugar 0, la segunda vez, toma el dato del lugar 1 y así sucesivamente. $regfile = "m8def.dat" $crystal = 1000000 Config Portd = Output Dim I As Byte Prog: For I = 0 To 5 Portd = Lookup(i , Secuencia) Waitms 500 Next Goto Prog End Secuencia: Data &B1000000 , &B1111001 , &B0100100 , &B0110000 , &B0011001 , &B0010010 MANEJO DE 4 DISPLAY DE7 SEGMENTOS CON EL CI.7447 El siguiente proyecto debe encender 4 display para poder mostrar cualquier numero de 0 hasta el 9999, esto lo conseguimos gracias al transistor tipo PNP, que nos ayudara a multiplexar cada uno de los displays, el funcionamiento es bastante sencillo, debemos conectar los 4 bits mas altos a cada transistor y los cuatro bits mas bajos al CI 7447, si por ejemplo queremos sacar el numero 6874, primero habilitamos el cuarto transistor, el de la derecha y enviamos el número 4, el CI 7447 se encargara de formar el numero 4 en el display, luego pasamos a cero lógico el segundo transistor y los demás los FISEI mantenemos en nivel alto, al mismo tiempo sacamos el numero 7 por los bits menos significativos del puerto B, y así consecutivamente, el tiempo que debemos mantener Octavo Electrónica 2009 – 2010 FISEI - UTA 32
  • 41.
    activado cada transistorno puede ser mayor que 5 mili segundos, es decir que los cambios son tan rápidos que el ojo humano ve todos los display encendidos al mismo tiempo, cuando en realidad solo se encienden uno a la vez. Ejemplo: para sacar el número 8 en las centenas debemos sacar (176 + 8), es decir el número 184 porque si analizamos en código binario, tenemos que los bits mas bajos entran al CI 7447, y los bits mas altos, son los encargados de encender el display que le corresponden a las centenas. $regfile = "m8def.dat" $crystal = 1000000 Config Portd = Output Visualizar: ' activo transistor de unidades y presento el 1 Portd = 224 + 1 Waitms 5 ' activo transistor de decenas y presento el 2 Portd = 208 + 2 Waitms 5 ' activo transistor de centenas y presento el 3 Portd = 176 + 3 Waitms 5 FISEI ' activo transistor de miles y presento el 4 Portd = 112 + 4 Waitms 5 Goto Visualizar End Octavo Electrónica 2009 – 2010 FISEI - UTA 33
  • 42.
    CONTADOR DECIMAL DE4 DIGITOS CON EL CI.7447 Es hora de hacer un proyecto de considerable tamaño, una vez entendido como multiplexar 4 displays, y entendido el ejercicio del contador, pues el siguiente proyecto consta en hacer un contador decimal que incremente su valor cada vez que se pulsa el botón A, si pulsamos el botón B se encera y se apaga la chicharra, y si pulsamos la tecla C, presenta el numero al cual va a comparar, si el numero a contar es igual a 24, activa un aviso auditivo, este buzzer trabaja a 12 Voltios, lo que diferencia de los parlantes comunes es que no necesita ser activado con una frecuencia, sino basta con alimentarle con 12 voltios para que suene. $regfile = "m8def.dat" $crystal = 1000000 Config Portd = Output Ddrc.0 = 1 Portc.0 = 0 Ddrc.1 = 0 Portc.1 = 1 Ddrc.2 = 0 Portc.2 = 1 Ddrc.3 = 0 Portc.3 = 1 Dim Unid As Byte Dim Dece As Byte Dim Cent As Byte FISEI Dim Mile As Byte Octavo Electrónica 2009 – 2010 FISEI - UTA 34
  • 43.
    Dim Setunid AsByte Dim SetDece As Byte Dim SetCent As Byte Dim Setmile As Byte Setunid = 4 Setdece = 2 Setcent = 0 Setmile = 0 Dim Activar As Bit ' chicha Portc.0 ' Contar Portc.1 ' Encerar Portc.2 ' visualizar Portc.3 Portc.0 = 1 Waitms 200 Encerar: Unid = 0 Dece = 0 Cent = 0 Mile = 0 Portc.0 = 0 Visualizar: Portd = 224 + Unid Waitms 5 Portd = 208 + Dece Waitms 5 Portd = 176 + Cent Waitms 5 Portd = 112 + Mile Waitms 5 Gosub Teclas Goto Visualizar Teclas: If Pinc.1 = 0 Then Gosub Sumar If Pinc.2 = 0 Then Gosub Encerar If Pinc.3 = 0 Then Gosub Visualizar2 Activar = 1 Return Sumar: If Activar = 0 Then Return Activar = 0 Unid = Unid + 1 If Unid < 10 Then Goto Comparar Unid = 0 Dece = Dece + 1 If Dece < 10 Then Goto Comparar Dece = 0 Cent = Cent + 1 If Cent < 10 Then Goto Comparar Cent = 0 Mile = Mile + 1 If Mile < 10 Then Goto Comparar Mile = 0 Return Visualizar2: Portd = 224 + Setunid Waitms 5 Portd = 208 + setDece Waitms 5 Portd = 176 + setCent Waitms 5 Portd = 112 + setMile Waitms 5 Return Comparar: If Unid = Setunid And Dece = Setdece And Cent = Setcent And Mile = Setmile Then Portc.0 = 1 Else Return End If FISEI End Octavo Electrónica 2009 – 2010 FISEI - UTA 35
  • 44.
    MANEJO DE 4DISPLAYS DE 7 SEGMENTOS SIN EL CI.7447 (ROTULACIÓN) Es posible hacer un contador decimal igual que el del proyecto anterior y sin ayuda del CI, 7447, pero en esta ocasión haremos mas que eso, como vieron la ventaja de conectar el display directamente al AVR es la de poder sacar casi la mayoría de las letras del alfabeto, pues bien este proyecto consiste en sacar la palabra HOLA a través de los 4 displays. $regfile = "m8def.dat" ' %1011 activa el siguiente display $crystal = 1000000 Portd = 11 Config Portd = Output ' forma la letra O Config Portb = Output Portb = 64 Texto: Waitms 5 ' %1110 activa el display de la derecha ' %0111 activa el siguiente display Portd = 14 Portd = 7 ' forma la letra A ' forma la letra H Portb = 8 Portb = 9 Waitms 5 Waitms 5 ' %1101 activa el siguiente display Goto Texto Portd = 13 End ' forma la letra L Portb = 71 Waitms 5 FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 36
  • 45.
    MANEJO DE 4DISPLAYS CON ROTULO EN MOVIMIENTO Para hacerlo mas interesante el proyecto anterior, le añadiremos movimiento, con esto podemos ingresar frases completas como “HOLA LUIS”, pero para no alargar mucho el programa solo utilizaremos la palabra HOLA, moviéndose continuamente de derecha a izquierda y con un espacio por palabra. La variable x es la que regula la velocidad con que se desplazan las letras, para comprobarlo modifique el valor de todas las repeticiones de 1 TO 20 al doble 1 TO 40, y vera como se desplaza las letras mas lentamente. $regfile = "m8def.dat" $crystal = 1000000 Config Portd = Output Config Portb = Output Dim X As Byte Texto: For X = 1 To 20 Portd = 14 : Portb = 8 Waitms 5 Portd = 13 : Portb = 71 Waitms 5 Portd = 11 : Portb = 64 Waitms 5 Portd = 7 : Portb = 9 Waitms 5 Next For X = 1 To 20 Portd = 14 : Portb = 127 Waitms 5 Portd = 13 : Portb = 8 Waitms 5 Portd = 11 : Portb = 71 Waitms 5 Portd = 7 : Portb = 64 Waitms 5 Next For X = 1 To 20 Portd = 14 : Portb = 9 Waitms 5 Portd = 13 : Portb = 127 Waitms 5 Portd = 11 : Portb = 8 Waitms 5 Portd = 7 : Portb = 71 Waitms 5 Next FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 37
  • 46.
    For X =1 To 20 Portd = 14 : Portb = 64 Waitms 5 Portd = 13 : Portb = 9 Waitms 5 Portd = 11 : Portb = 127 Waitms 5 Portd = 7 : Portb = 8 Waitms 5 Next For X = 1 To 20 Portd = 14 : Portb = 71 Waitms 5 Portd = 13 : Portb = 64 Waitms 5 Portd = 11 : Portb = 9 Waitms 5 Portd = 7 : Portb = 127 Waitms 5 Next Goto Texto End MANEJO DE UN MODULO LCD Los módulos LCD (Display de Cristal Líquidos), son utilizados para mostrar mensajes que indican al operario es estado de la maquina, o para dar instrucciones de manejo, Mostar valores, etc. El LCD permite la comunicación entre las maquinas y los humanos, este puede mostrar cualquier carácter ASCII, y consume mucho menos que los display de 7 segmentos, existe de varias presentaciones por ejemplo de 2 líneas por 8 caracteres, 2x16, 2x20, 4x20, 4x40, etc. Sin backlight (14 pines) o con backlight (16 pines, iluminado de pantalla), el LCD más popular es el 2x16, 2 líneas de 16 caracteres cada una. Fotografía de un LCD 2x16 FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 38
  • 47.
    Pin Simb Descripción 1 Vss Tierra de alimentación GND 2 Vdd Alimentación de +5V CC 3 Vo Ajuste de contraste del cristal liquido (0 a +5V) 4 RS Selección del registro control/datos RS=0 reg. Control RS=1 reg. Datos 5 R/W Lectura/Escritura en LCD R/W = 0 escritura (write) R/W = 1 lectura (read) 6 E Habilitación E = 0 módulo desconectado E = 1 módulo conectado 7 D0 Bit menos significativo (bus de datos bidireccional) 8 D1 9 D2 10 D3 11 D4 12 D5 13 D6 14 D7 Bit masmenos significativo (bus de datos bidireccional) 15 A Alimentación del backlight +3.5V o +5 Vcc (según especificaciones técnicas) 16 K Tierra GND del backlight Bascom puede manejar los dos tipos principales de pantallas de cristal líquido: alfanuméricos y gráficos. Por el momento, vamos a preocuparnos por el tipo más común alfanuméricos. Este tipo de pantalla LCD puede mostrar los caracteres, números y caracteres especiales. El tipo más común de LCD alfanumérico utiliza un Hitachi HD44780 como controlador de pantalla. Cuando usted no está seguro acerca de qué tipo de pantalla que están sosteniendo en sus manos, sólo tiene que mirar a las denominaciones de chips en la espalda. Si uno de estos dice HD44780 estás a salvo. Bascom tiene una configuración por defecto para la conexión de la pantalla LCD. Options / Compiler / LCD FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 39
  • 48.
    Afortunadamente, el predeterminadoes de tipo LCD de 16 * 2. Esta es la pantalla LCD más común con dos líneas y 16 caracteres por línea. HD44780 tipo LCD tienen ocho datalines, pero pueden ser controlados de una manera más económica mediante el uso de los cuatro líneas. Esto ahorra cuatro Pins I / O en el controlador. Esta es la predeterminada (modo de 4 bit bus) en la ventana de opciones. El envío de datos se lo hace en modo 4-bit bus de curso tiene dos escrituras de cada 8-bits a enviar Si realmente necesitas la pantalla LCD para ser lo más rápido posible (y rara vez lo hacen), tendrá que elegir el modo 8-bit bus. El modo de datos es el pin por defecto. Esto significa que los pines individuales se pueden seleccionar para cada pin LCD. Esta opción proporciona la mayor flexibilidad en la elección de la i / o de configuración de su controlador. La opción de «bus» se puede utilizar en la clásica configuración de microprocesador de autobuses donde un montón de I / O está conectado a un bus y la decodificación de dirección debe ser utilizado para hacer frente a cada dispositivo por separado en el autobús. En el 'pin' opción, puede especificar cómo las clavijas de seis LCD está conectado a su controlador. El pin de activación es usada por la pantalla LCD para ver si tiene para leer / escribir datos en las cuatro I / O Pins. Mientras el pin de activación es bajo, la pantalla no "escuchar" a los cambios en los cuatro pines de datos (lo que también puede ser utilizado para otros fines, por el AT90S2313 que también se utilizan para el MOSI, miso y CLK). El pin RS se utiliza para que la pantalla LCD sepa si los datos que están en los pines de datos tienen que ver con una presentación en la pantalla o con un comando, como un restablecimiento de pantalla o un cambio del cursor La pantalla LCD tiene un séptimo séptimo pin llamado R / W para contar la pantalla LCD si queremos leer los datos, o escribir en la pantalla LCD. Bascom supone que este pin está permanentemente conectado a tierra, de modo que la pantalla LCD siempre está en modo de lectura. Sin embargo, para ver si la pantalla LCD está preparada para recibir datos, se debe leer la memoria de ocupación. Esto implicaría el envío de un comando de verificación de ocupado, cambiar la pantalla a modo de escritura, la lectura del valor de un byte del registro del pabellón ocupado y se determina el valor del bit de ocupado. Como no podemos hacer eso, Bascom debe utilizar bucles de espera después de cada escritura. Los bucles de espera son determinados por la velocidad de reloj. Esto es entre otras cosas por la especificación de la velocidad de reloj en las opciones / Compilador / ventana de comunicación o con la palabra clave de cristal $ es importante. Tenga en cuenta que si ha especificado un reloj de 4 MHz y luego cambiar el cristal en un modelo de 10MHz, el controlador se ejecutará 2,5 veces más rápido, pero los circuitos de espera del cristal líquido son probablemente demasiado corto. Esto puede resultar en que la pantalla LCD no funciona en absoluto o actúe de manera extraña. Al igual que con la especificación del tipo de controlador y de cristal, las conexiones de pin LCD se puede especificar en el origen de Bascom en lugar de utilizar Opciones / Compiler / LCD: FISEI La pantalla LCD está conectada al controlador de la siguiente manera Octavo Electrónica 2009 – 2010 FISEI - UTA 40
  • 49.
    Config Lcd =16 * 2 Config lcdpin = PIN, DB4 = PORTB.1, DB5 = PORTB.2, DB6 = PORTB.3, DB7 = PORTB.4, E = PORTB.5, RS = PORTB.6 Lcd Mode Config = Puerto La pantalla LCD alfanumérico estándar tiene 14 pins. Pin número 1 es la tierra. Pin número 5 es R / W y también está conectado a tierra. Pin número 2 es Vcc, va a +5 V. Algunos LCD no tolerará una fuente de alimentación con tensión de salida de un lento aumento. Pin número 3 es para el contraste del LCD. Con la mayoría de las pantallas se puede conectar el pin de contraste a tierra. Por un contraste óptimo, en algunas pantallas se necesita una tensión ligeramente positiva en este pin. Uso de un potenciómetro entre +5 V y tierra debe dar una configuración óptima para la mayoría de las pantallas. Los números de PIN 4 (RS), 6 (E) y 11, 12, 13 y 14 están conectados a la controladora como se muestra en el esquema. PIN números 7, 8, 9 y 10 se puede quedar desconectados. Tenga en cuenta que D5, D6 y D7 son compartidos con MOSI, miso y SCK. Si usted tiene una pantalla LCD con backlight LED que puede tener un 16 pines en el PCB del LCD. Pins 15 y 16 son para la luz de fondo. Si estos pines no tienen otras indicaciones, intente una alimentación de +5 V con un resistor limitador de corriente de unos pocos cientos de ohmios para averiguar cuál es el cátodo y el ánodo. A veces la luz de fondo LED tiene un conector separado de los otros 14 pines. FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 41
  • 50.
    $regfile = "m8def.dat" $crystal = 1000000 Dim Count As Integer $sim Config Lcd = 16 * 2 Config lcdpin = PIN, DB4 = PORTB.1, DB5 = PORTB.2, DB6 = PORTB.3, DB7 = PORTB.4, E = PORTB.5, RS = PORTB.6 Config Lcdmode = Port Do ' borrar la pantalla Cls ' Presento en la lcd HELLO Lcd "Hello " ; Count Count = Count + 1 Wait 1 Loop End Compile el programa, y luego Program / Simulate LCD de carácter conjunto. El conjunto de LCD de caracteres estándar se muestra en la siguiente tabla: FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 42
  • 51.
    Los caracteres especialesen esta tabla se pueden enviar a la pantalla utilizando el charactercode decimal. Por ejemplo, utilice: LCD chr (228) Para enviar el símbolo μ. (1110.0100 binario es 228 en decimal) Se debe entender que existe un cursor que aunque no lo vemos, pues es este el que indica donde aparecerá la siguiente letra, para poder entender haremos un ejercicio completo, así podrán aprender más del LCD y las funciones de cada uno de los comandos. Primero que nada haremos visible el cursor y luego pondremos Wait para poder ver el funcionamiento. El siguiente programa muestra algunos de los comandos que pueden ser utilizados con la pantalla LCD. FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 43
  • 52.
    $regfile = "m8def.dat" Wait 1 $crystal = 1000000 Cls ' proporción del baud 'apaga el despliegue $baud = 19200 Display Off ' uso 32 predefinido para la pila del hardware Wait 1 $hwstack = 32 'encender el despliegue ' so 10 predefinido para la pila de SW Display On $swstack = 10 Wait 1 ' uso 40 predefinido para el espacio del marco Goto Programa $framesize = 40 End Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 Config Lcdpin = Pin , Db6 = Portb.3 , Db7 = Portb.4 Config Lcdpin = Pin , E = Portb.5 , Rs = Portb.6 Dim A As Byte Config Lcd = 16 * 2 Programa: Cls Lcd "Hola mundo" Wait 1 Lowerline Wait 1 Lcd "Como estas" Wait 1 For A = 1 To 10 Shiftlcd Right Wait 1 Next For A = 1 To 10 'cambio el texto a la izquierda Shiftlcd Left Wait 1 Next Cls ' fijar posicion del cursor Locate 2 , 1 Lcd "*" Wait 1 Cls 'cambio el texto a la derecha Shiftcursor Right Lcd "@" Wait 1 Cls ' seleccionar linea 1 y retornar a casa Home Upper Lcd "Remplazar." Wait 1 Cls 'esconda el cursor Cursor Off Noblink Wait 1 ' mostar el cursor Cursor On Blink FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 44
  • 53.
    DEFINA SUS PROPIOSPERSONAJES LCD La LCD con el controlador HD44780 tiene espacio para ocho caracteres adicionales que se pueden definir. Usted podría utilizar caracteres especiales que de origen a: Hacer una pantalla de barras de un metro o S-VU-meter Una pelota para pasar el tiempo del usuario, mientras que el controlador está haciendo algo mucho tiempo. Un objeto en rotación o saltar al hombre para que el usuario sepa que el controlador está aún en marcha. Situé el cursor en Tools / LCD designer Dar el un clic en cualquier cuadro para que este se haga negro, o clic en un cuadro negra para que se haga blanco. Hacer un símbolo de la cruz Haga clic en Aceptar. Colocar el cursor en el origen del programa y aparecerá el siguiente texto. Deflcdchar ?,32,4,4,31,4,4,32,32' replace ? with number (0-7) Cambiar el "?" por el número "0" y eliminar el comentario después del carácter ' FISEI Deflcdchar 0 , 32 , 4 , 4 , 31 , 4 , 4 , 32 , 32 Octavo Electrónica 2009 – 2010 FISEI - UTA 45
  • 54.
    Mover el cursorde texto a la siguiente línea vacía, rehacer Tools / LCD designer, realizar el siguiente grafico. Deflcdchar ?,32,2,20,14,5,8,32,32' replace ? with number (0-7) Cambiar el "?" por el número "1" y eliminar el comentario después del carácter ' Deflcdchar 1 , 32 , 2 , 20 , 14 , 5 , 8 , 32 , 32 Repita este proceso otras cuatro veces (usa tu imaginación) hasta que su programa es el siguiente: $regfile = "m8def.dat" $crystal = 1000000 ' proporción del baud $baud = 19200 ' uso 32 predefinido para la pila del hardware $hwstack = 32 ' so 10 predefinido para la pila de SW $swstack = 10 ' uso 40 predefinido para el espacio del marco $framesize = 40 Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 Config Lcdpin = Pin , Db6 = Portb.3 , Db7 = Portb.4 Config Lcdpin = Pin , E = Portb.5 , Rs = Portb.6 Dim Star As Byte Config Lcd = 16 * 2 Deflcdchar 0 , 32 , 4 , 4 , 31 , 4 , 4 , 32 , 32 Deflcdchar 1 , 32 , 2 , 20 , 14 , 5 , 8 , 32 , 32 Deflcdchar 2 , 32 , 2 , 26 , 4 , 11 , 8 , 32 , 32 Deflcdchar 3 , 32 , 17 , 10 , 4 , 10 , 17 , 32 , 32 Deflcdchar 4 , 32 , 8 , 11 , 4 , 26 , 2 , 32 , 32 Deflcdchar 5 , 32 , 8 , 5 , 14 , 20 , 2 , 32 , 32 Cls Do For Star = 0 To 5 Step 1 Locate 1 , 16 Lcd Chr(star) Next Star Loop End Compilar y Simulación. El resultado es una estrella de rotación rápida en la posición FISEI más a la derecha de la línea de LCD de la primera fila. Octavo Electrónica 2009 – 2010 FISEI - UTA 46
  • 55.
    CONTADOR DE PULSOSCON LCD Este proyecto, consiste en contar el numero de pulsos que ingresan por un pin en un determinado periodo, este a su vez visualiza en un LCD, si la cantidad de este supera a los 120 pulsos por segundo es decir 120Hz, se encenderá una alarma visual (un led rojo), y si la cantidad de pulsos baja a menos de 100Hz, este encenderá un led Verde, si la frecuencia se mantiene entre estos 2 rangos, no se encenderá ningún led. Para esta practica utilizaremos el C.I 555 que nos ayuda a generar un tren de pulsos variable, el cual lo conectamos al AVR para su posterior conteo. DECLARACIÓN PULSEIN. Sirve para contar el número de pulsos que ingresan por un pin en un determinado tiempo, este a su vez lo guarda en una variable para su posterior procesamiento, la manera de utilizarlo es la siguiente. var Una palabra variable que se asigna con el resultado PINX Puero a usar PIN Pin del Puerto con el que se contar STATE Podria ser 0 or 1. 0 Medio de muestreo. Transición 0 to 1. 1 Medio de muestreo. Transición 1 to 0. Algo muy importante de conocer, es como conocer verdaderamente la cantidad de pulsos que el AVR esta detectando en la entrada, para ello debemos primeramente tomar en cuenta que clase de variable es la que esta almacenado el conteo. La cantidad de pulsos del conteo obtengo dividiendo la cantidad máxima que puede almacenar dicha variable para el dato almacenado de conteo. Pulsos = 26315 / Variable Uso variable Word = 26315 = 2 bytes FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 47
  • 56.
    $regfile = "m8def.dat" $crystal = 1000000 $baud = 19200 $hwstack = 32 $swstack = 10 $framesize = 40 ' Configuro todo el puerto D.2, D.3 como salida Ddrd.2 = 1 ' led rojo Portd.2 = 0 Ddrd.3 = 1 ' led verde Portd.3 = 0 Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 Config Lcdpin = Pin , Db6 = Portb.3 , Db7 = Portb.4 Config Lcdpin = Pin , E = Portb.5 , Rs = Portb.6 Dim Puls As Word Config Lcd = 16 * 2 Prog: ' escondo el cursor Cursor Off Noblink Pulsein Puls , Pind , 0 , 1 Puls = 26315 / Puls Cls Lcd " Frecuencia" ' localizo al cursos fila 2 columna 6 FISEI Locate 2 , 6 Octavo Electrónica 2009 – 2010 FISEI - UTA 48
  • 57.
    Lcd Puls Locate 2 , 10 Lcd "Hz" If Puls > 120 Then Goto Alarmah If Puls < 100 Then Goto Alarmal Pind.2 = 0 : Pind.3 = 0 Goto Prog Alarmah: Pind.2 = 1 : Pind.3 = 0 Goto Prog Alarmal: Pind.3 = 1 : Pind.2 = 0 Goto Prog End GENERACIÓN DE SONIDO El software Bascom es capaz de sacar las frecuencias especificadas por un pin del AVR, para esto aprenderemos la declaración SOUND. LA DECLARACIÓN SOUND. Saca lo o las frecuencias especificadas por un pin del micro, estas pueden ser de 0 a 32767 Hz, su utilización es de la siguiente forma. SOUND pin, pulsos, duración Sound Portb.0 ,65635 , 10000 Quiere decir sacar una frecuencia de 65635 ciclos durante 10 segundos por el puerto B.0. En esta práctica lo utilizaremos para generar un sonido a través de un piezoeléctrico o por medio de un parlante. FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 49
  • 58.
    $regfile = "m8def.dat" $crystal = 1000000 $baud = 19200 $hwstack = 32 $swstack = 10 $framesize = 40 ' Configuro todo el puerto C.0 como salida Ddrc.0 = 1 ' led rojo Portc.0 = 0 Speaker Alias Portc.0 Do Sound Speaker , 1000 , 2 Wait 2 Loop end UNA SIRENA POLICIAL Esta practica consiste en sacar por un parlante el sonido característico de una sirena policial, para esto emplearemos la ayuda de la declaración vista anteriormente. ' Configuro todo el puerto C.0 como salida Ddrc.0 = 1 ' led rojo Portc.0 = 0 Speaker Alias Portc.0 Do Sound Speaker , 100 , 10 Sound Speaker , 50 , 10 Wait 2 Loop FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 50
  • 59.
    Esto quiere decirsacar dos tonos por el puerto C.0, el primer tono es 100 que equivale a (7874 Hz) con una duración de 10 milisegundos y luego un tono de 50 (3937 Hz) con una duración de 10 milisegundos también. En cuanto al diagrama y materiales son los mismos de la práctica anterior. GENERACIÓN DE UN TIMBRE DE TELÉFONO CELULAR Esta practica consiste en sacar por un parlante el sonido característico de un teléfono celular, para esto emplearemos la ayuda de la declaración SOUND. En cuando al diagrama de conexión y materiales, podemos utilizar el mismo de la práctica anterior. $regfile = "m8def.dat" $crystal = 1000000 $baud = 19200 $hwstack = 32 $swstack = 10 $framesize = 40 ' Configuro todo el puerto C.0 como salida Ddrc.0 = 1 ' led rojo Portc.0 = 0 Speaker Alias Portc.0 Do Sound Speaker , 125 , 4 Sound Speaker , 123 , 5 Wait 2 Loop Pruebe con algunas combinaciones de tonos, así como también con diferentes tiempos y verá que bien pude componer una melodía. LLAMADA TELEFÓNICA DTMF Esta practica tiene como objetivo generar tonos DTMF (Dual tono Multifrecuency) a través de un AVR, como los que genera cualquier teléfono fijo o celular, estos tonos no son nada mas que el envió de dos frecuencias especificas asignadas a cada tecla, estas frecuencias podemos ver en la figura siguiente, lo que sucede cuando pulsamos una tecla, es que envía una frecuencia baja y luego una segunda frecuencia del grupo alto, esto podríamos hacerlo con la declaración PULSEOUT. FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 51
  • 60.
    LA DECLARACIÓN DTMFOUT Esta genera automáticamente los tonos duales correspondientes a cada tecla y los envía cada una con intervalos de 50 milisegundos, aunque estos los podemos cambiar. Para nuestro caso, para saber que puerto es el que envía la señal DTMF, debemos acudir a la hoja de dados del ATMEGA8 y buscamos el puerto con características OC1, para nuestro AVR es el pin B.1. FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 52
  • 61.
    $regfile = "m8def.dat" $crystal = 1000000 $baud = 19200 $hwstack = 32 $swstack = 10 $framesize = 40 Config Portb = Output ' creo una cadenan de caracteres Dim Numero As String * 9 ' numero a marcar Numero = "123456789" Do ' duracion de 50ms por cada digito Dtmfout Numero , 50 Waitms 500 Loop En la figura siguiente se muestra el diagrama básico de conexión para poder hacer una llamada telefónica: La resistencia de 560Ohm a 1 vatio paralela a la red telefónica, sirve para simular la carga de un teléfono normal, y con esto podremos tener el tono de marcado necesario para hacer la llamada, además notarán que esta resistencia empieza a disipar calor en el momento que se une a la red telefónica, esto debido a la cantidad de voltaje que circula (60 voltios). El relé hace la conexión y desconexión de la red telefónica, que en este caso sería como el auricular que cuelga y descuelga el teléfono. El filtro de 1 uF a 100 voltios, sirve para poder mejorar la onda que sale del AVR y además como protección para el AVR. Es importante indicar que la red telefónica suministra alrededor de 60 voltios en DC, por lo que el capacitor debe pasar de 60 voltios y además el lado positivo de la red telefónica debe ir a tierra del AVR y el negativo hacía el pin del AVR, por lo que necesitaremos la ayuda de un voltímetro para poder identificar la polaridad de la red. FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 53
  • 62.
    Para solucionar esteinconveniente se propone el diagrama de la figura, este es un diagrama más completo en el que la polaridad de la línea no es un problema, puesto que dispone un puente de diodos en donde el lado positivo ya está unido a tierra y el lado negativo va a través del filtro hacia el AVR. Este proyecto es muy utilizado en sistemas de seguridad, se puede hacer una alarma, la cual en el momento de violar su seguridad, este realice automáticamente una llamada al propietario, el propietario en el momento de contestar escuchará una sirena, señal suficiente para saber que alguien ha activado la alarma, este mismo principio utilizan las centrales de monitoreo, con la diferencia que en vez de generar un sonido de sirena, se envía datos en forma serial como: Zona de apertura, hora, estado de batería, etc. LECTURA DE UN TECLADO DE 16 PULSADORES CON DISPLAY DED 7 SEGMENTOS La mayoría de las aplicaciones de Controlador pequeñas utilizar uno o más botones o interruptores de entrada del usuario. Cuando las cosas van un poco más complicadas, un pequeño teclado puede ser una buena solución. Estos teclados vienen en 3x4 o 4x4 variantes, más a menudo el keyswitches están dispuestos en una matriz. FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 54
  • 63.
    La matriz seutiliza, ya que minimiza el número de conexiones desde el teclado al controlador. Un teclado 4x4 tiene 16 keyswitches. Usted podría cablear los 16 keyswitches al controlador, pero una solución más inteligente es el de organizar las claves en una matriz y luego conectar las cuatro columnas y filas al controlador. Los teclados matriciales son muy útiles para ingresar datos, un ejemplo es el teclado del computador, el teclado de una alarma que nos permite armar y desarmar un sistema de seguridad, el teclado de una caja fuerte, el de una cerradura eléctrica, etc. Para introducirnos en el manejo de un teclado, haremos un proyecto para aprender a identificar filas y columnas que lo componen un teclado hexadecimal de 16 pulsadores, y su correspondiente barrido de teclas, luego se visualizara en un display de 7 segmentos el número de la tecla presionado. FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 55
  • 64.
    $regfile = "m8def.dat" $crystal = 1000000 ' configuro puertos como salida Ddrb = &B00001111 Portb = &B00001111 Config Portc = Output A Alias Portb.0 B Alias Portb.1 C Alias Portb.2 D Alias Portb.3 Uno Alias Pinb.4 Dos Alias Pinb.5 Tres Alias Pinb.6 Cuatro Alias Pinb.7 Barrido: A=0 If Uno = 0 Then Portc = 1 If Dos = 0 Then Portc = 2 If Tres = 0 Then Portc = 3 If Cuatro = 0 Then Portc = 10 A=1 B=0 If Uno = 0 Then Portc = 4 If Dos = 0 Then Portc = 5 If Tres = 0 Then Portc = 6 If Cuatro = 0 Then Portc = 11 B=1 C=0 If Uno = 0 Then Portc = 7 If Dos = 0 Then Portc = 8 If Tres = 0 Then Portc = 9 If Cuatro = 0 Then Portc = 12 C=1 D=0 If Uno = 0 Then Portc = 14 If Dos = 0 Then Portc = 0 If Tres = 0 Then Portc = 15 If Cuatro = 0 Then Portc = 13 D=1 Waitms 10 Goto Barrido End Como se puede ver este programa es un poco largo pero el uso de memoria es mínima en el AVR. El funcionamiento es sencillo, solo debemos fijarnos cual fila es la que esta en nivel bajo y esta es la fila que se esta barriendo, si una de las condiciones encuentra la igualdad, pues esta es la tecla pulsada. Ejemplo: Si pulsamos la tecla 6, en algún momento se pondrá en bajo la fila B y detectara un cambio de estado de 1 a 0 en la columna 3, por lo que: FISEI A=0 If Tres = 0 Then Portc = 3 Octavo Electrónica 2009 – 2010 FISEI - UTA 56
  • 65.
    Debemos considerar queun persona requiere como mínimo 100 milisegundos para presionar una tecla, en este tiempo el AVR realiza 10 barridos, por lo que de seguro detectara inmediatamente la tecla pulsada. Para el caso de utilizar un teclado de 12 pulsadores, debemos eliminar una columna, las que corresponden a la tecla A, B, C y D, es decir eliminar las siguientes líneas de programa. If Cuatro = 0 Then Portc = 10 If Cuatro = 0 Then Portc = 11 If Cuatro = 0 Then Portc = 12 If Cuatro = 0 Then Portc = 13 En este caso quedaría un teclado con pulsadores del 0 al 9 y dos teclas de propósito especial, la tecla asterisco (*) y la tecla numeral (#). CERRADURA ELECTRÓNICA CON CLAVE EN MEMORIA FLASH Este es un proyecto aplicable en seguridad, se trata de una cerradura electrónica en la cual al ingresar los 4 dígitos correctamente en su teclado, el AVR energiza un relé, pero si la clave es incorrecta el AVR emite 3 pitos indicando que ingreso una clave errónea y por supuesto que el relé no se conectara, para hacerlo mas interesante se le agregado sonido a las teclas en el momento de ser pulsadas, esto sirve para que el usuario sepa que el AVR reconoció la pulsación, también tiene un programa antirrebote de tecla para asegurarse que ingrese una sola tecla a la vez. El único inconveniente es que la clave no puede ser cambiada, ya que el numero de la combinación (1, 2, 3, 4) se la grabó en el programa del AVR por lo que reside en la memoria FLASH, mas adelante en los próximos proyectos la memoria podrá ser cambiada a gusto del usuario, en tal caso este proyecto sirve para poder identificar y diferenciar las 3 memorias que dispone el AVR. FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 57
  • 66.
    $regfile = "m8def.dat" If Uno = 0 Then Numero = 4 : Return $crystal = 4000000 If Dos = 0 Then Numero = 5 : Return ' configuro puertos como salida If Tres = 0 Then Numero = 6 : Return Dim Numero As Byte If Cuatro = 0 Then Numero = 11 : Dim R As Byte Return Config Portc = Output B=1 Ddrb = &B00001111 C=0 Portb = &B00001111 If Uno = 0 Then Numero = 7 : Return Config Portc = Output If Dos = 0 Then Numero = 8 : Return A Alias Portb.0 If Tres = 0 Then Numero = 9 : Return B Alias Portb.1 If Cuatro = 0 Then Numero = 12 : C Alias Portb.2 Return D Alias Portb.3 C=1 Uno Alias Pinb.4 D=0 Dos Alias Pinb.5 If Uno = 0 Then Numero = 14 : Tres Alias Pinb.6 Return Cuatro Alias Pinb.7 If Dos = 0 Then Numero = 0 : Return Bip Alias Portc.0 If Tres = 0 Then Numero = 15 : Led Alias Portc.1 Return Door Alias Portc.2 If Cuatro = 0 Then Numero = 13 : Return Iniciando: D=1 Led = 1 : Bip = 1 Waitms 10 Waitms 500 Goto Barrido Led = 0 : Bip = 0 Goto Teclauno Ptecla: Led = 1 : Bip = 1 Barrido: Waitms 100 A=0 Led = 0 : Bip = 0 If Uno = 0 Then Numero = 1 : Return If Dos = 0 Then Numero = 2 : Return Espacio: If Tres = 0 Then Numero = 3 : Return If Uno = 0 Then Goto Espacio If Cuatro = 0 Then Numero = 10 : If Dos = 0 Then Goto Espacio FISEI Return If Tres = 0 Then Goto Espacio A=1 If Cuatro = 0 Then Goto Espacio B=0 Waitms 25 Return Octavo Electrónica 2009 – 2010 FISEI - UTA 58
  • 67.
    Teclauno: Gosub Barrido Gosub Ptecla If Numero = 1 Then Goto Teclados Goto Falso Teclados: Gosub Barrido : Gosub Ptecla If Numero = 2 Then Goto Teclatres Goto Falso1 Teclatres: Gosub Barrido : Gosub Ptecla If Numero = 3 Then Goto Teclacuatro Goto Falso2 Teclacuatro: Gosub Barrido : Gosub Ptecla If Numero = 4 Then Goto Openge Goto Falso3 Openge: For R = 1 To 2 Waitms 100 Led = 1 : Bip = 1 Waitms 100 Led = 0 : Bip = 0 Next Door = 1 Wait 1 Door = 0 Goto Teclauno Falso: Gosub Barrido : Gosub Ptecla Falso1: Gosub Barrido : Gosub Ptecla Falso2: Gosub Barrido : Gosub Ptecla Falso3: For R = 1 To 3 Wait 1 Led = 1 : Bip = 1 Wait 1 Led = 0 : Bip = 0 Next Goto Teclauno End FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 59
  • 68.
    CERRADURA ELECTRÓNICA CONCLAVE EN MEMORIA RAM Y CAMBIO DE CLAVE Este proyecto es muy similar al anterior con la diferencia que este se le puede cambiar la clave predefinida (1, 2, 3, 4) por cualquier otra combinación de teclas, la clave original será cargada en cuatro variables y existirá una manera de cambiar los valores de estas variables lo cual se lo hace de la siguiente manera: después de haber colocado la clave original, debemos mantener presionado la tecla D durante 2 segundos, para ser más exactos en el momento que el relé se conecta después de 1 segundo hay una pregunta si la tecla D es presionada ir a grabar, si no presionamos la tecla D a tiempo, perderemos la oportunidad de cambiar la clave y tendremos que volver a repetir el proceso, en el momento que ingresa al programa de cambio de clave se encenderá el led y permanecerá encendido esperando a que ingresemos los 4 nuevos dígitos. Es importante saber que la nueva clave se almacenara en las variables SETPRIME, SETSEGUN, SETERCER y SETCUART, estas variables ocupan espacio de 224 BYTES, por lo tanto solo están activadas mientras el AVR se encuentra alimentado, una vez que se corta la alimentación al AVR esta memoria de borra, por consiguiente al momento de volver a prender el micro AVR, la nueva clave se nos habrá perdido y en su lugar se encontrara la clave original (1, 2, 3, 4), esto debido a que esta clave se encuentra en la memoria FLASH y en el momento de correr el programa lo carga nuevamente en la memoria RAM para desde aquí poder ser modificada. En cuanto a los materiales y el diagrama de conexión, son los mismos que se utilizaron en el ejercicio anterior. $regfile = "m8def.dat" Setsegu = 2 $crystal = 4000000 Setercer = 3 ' configuro puertos como salida Setcuart = 4 Dim Numero As Byte niciando: Dim R As Byte Led = 1 : Bip = 1 Config Portc = Output Waitms 500 Ddrb = &B00001111 Led = 0 : Bip = 0 Portb = &B00001111 Goto Teclauno Config Portc = Output A Alias Portb.0 Grabauno: B Alias Portb.1 Gosub Ptecla : Led = 1 C Alias Portb.2 Gosub Barrido : Gosub Ptecla D Alias Portb.3 Led = 1 Uno Alias Pinb.4 Setprime = Numero Dos Alias Pinb.5 Tres Alias Pinb.6 Grabados: Cuatro Alias Pinb.7 Gosub Barrido : Gosub Ptecla Bip Alias Portc.0 Led = 1 Led Alias Portc.1 Setsegu = Numero Door Alias Portc.2 Dim Setprime As Byte Grabatres: Dim Setsegu As Byte Gosub Barrido : Gosub Ptecla Dim Setercer As Byte Led = 1 FISEI Dim Setcuart As Byte Setercer = Numero Setprime = 1 Octavo Electrónica 2009 – 2010 FISEI - UTA 60
  • 69.
    Grabacuatro: Teclauno: Gosub Barrido : Gosub Ptecla Gosub Barrido Led = 1 Gosub Ptecla Setcuart = Numero If Numero = Setprime Then Goto Goto Iniciando Teclados Goto Falso Barrido: A=0 Teclados: If Uno = 0 Then Numero = 1 : Return Gosub Barrido : Gosub Ptecla If Dos = 0 Then Numero = 2 : Return If Numero = Setsegu Then Goto If Tres = 0 Then Numero = 3 : Return Teclatres If Cuatro = 0 Then Numero = 10 : Goto Falso1 Return A=1 Teclatres: B=0 Gosub Barrido : Gosub Ptecla If Uno = 0 Then Numero = 4 : Return If Numero = Setercer Then Goto If Dos = 0 Then Numero = 5 : Return Teclacuatro If Tres = 0 Then Numero = 6 : Return Goto Falso2 If Cuatro = 0 Then Numero = 11 : Return Teclacuatro: B=1 Gosub Barrido : Gosub Ptecla C=0 If Numero = Setcuart Then Goto If Uno = 0 Then Numero = 7 : Return Openge If Dos = 0 Then Numero = 8 : Return Goto Falso3 If Tres = 0 Then Numero = 9 : Return If Cuatro = 0 Then Numero = 12 : Openge: Return For R = 1 To 2 C=1 Waitms 100 D=0 Led = 1 : Bip = 1 If Uno = 0 Then Numero = 14 : Waitms 100 Return Led = 0 : Bip = 0 If Dos = 0 Then Numero = 0 : Return Next If Tres = 0 Then Numero = 15 : Door = 1 Return Wait 1 If Cuatro = 0 Then Numero = 13 : Door = 0 Return A=1:B=1:C=1:D=1 D=1 If Cuatro = 0 Then Goto Grabauno Waitms 10 Goto Teclauno Goto Barrido Falso: Ptecla: Gosub Barrido : Gosub Ptecla Led = 1 : Bip = 1 Falso1: Waitms 100 Gosub Barrido : Gosub Ptecla Led = 0 : Bip = 0 Falso2: Gosub Barrido : Gosub Ptecla Espacio: Falso3: If Uno = 0 Then Goto Espacio For R = 1 To 3 If Dos = 0 Then Goto Espacio Wait 1 If Tres = 0 Then Goto Espacio Led = 1 : Bip = 1 If Cuatro = 0 Then Goto Espacio Wait 1 Waitms 25 Led = 0 : Bip = 0 Return Next Goto Teclauno End FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 61
  • 70.
    CERRADURA ELECTRÓNICA CONCLAVE EN MEMORIA EEPROM Y CAMBIO DE CLAVE Una vez aprendido acerca de las 2 memoria anteriores, es el momento de aprender a utilizar la memoria EEPROM (Electrical Erasable Programable Read Only Memory), o memoria de lectura de programación y borrado eléctrico, que a diferencia de la memoria RAM, esta no es volátil y tiene capacidad para 128 Bytes, lo que quiere decir que si al AVR se le corta la alimentación, los datos almacenados en la memoria EEPROM, permanecen según su fabricante por un periodo de 40 años a 100 años. Este proyecto cumple todas las expectativas de un estudiante de micros, tiene la posibilidad de cambiar la clave y no borrarse, si se digita una clave errónea el teclado se bloquea y únicamente lo desbloqueamos presionando al mismo tiempo las teclas 7 y C por 2 segundos, así mismo para cambiar la clave procedemos como en el proyecto anterior, presionando la tecla D. Algo importante es que si nos olvidamos la clave, la única manera de recuperarlo es leyendo el contenido del AVR a través de un programador. En cuanto a los materiales y el diagrama de conexión, son los mismos que se utilizaron en el proyecto anterior. LA DECLARACIÓN WRITEEEPROM Y READEEPROM WRITEEEPROM: escribe un contenido variable en DATA EEPROM. SINTAXIS: WRITEEEPROM variable, dirección WRITEEEPROM 137, 8 quiere decir guardar en la dirección 8 de la memoria EEPROM el número 137, si existiera un dato anterior en esta dirección, se borrara. READEEPROM: lee el contenido de la EEPROM y lo almacena en una variable SINTAXIS: READEEPROM variable, dirección READEEPROM pepe, 5 quiere decir leer la dirección 5 de la memoria EEPROM y guardar en la variable pepe, por consiguiente pepe se carga con el dato que esta almacenado en la dirección. FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 62
  • 71.
    $regfile = "m8def.dat" Readeeprom Setprime , 0 $crystal = 4000000 Readeeprom Setsegu , 1 $eeprom Readeeprom Setercer , 2 ' configuro puertos como salida Readeeprom Setcuart , 3 Dim Numero As Byte Goto Teclauno Dim R As Byte Config Portc = Output Grabauno: Ddrb = &B00001111 Gosub Ptecla : Led = 1 Portb = &B00001111 Gosub Barrido : Gosub Ptecla Config Portc = Output Led = 1 A Alias Portb.0 Writeeeprom Numero , 0 B Alias Portb.1 C Alias Portb.2 Grabados: D Alias Portb.3 Gosub Barrido : Gosub Ptecla Uno Alias Pinb.4 Led = 1 Dos Alias Pinb.5 Writeeeprom Numero , 1 Tres Alias Pinb.6 Cuatro Alias Pinb.7 Grabatres: Bip Alias Portc.0 Gosub Barrido : Gosub Ptecla Led Alias Portc.1 Led = 1 Door Alias Portc.2 Writeeeprom Numero , 2 Dim Setprime As Byte Dim Setsegu As Byte Grabacuatro: Dim Setercer As Byte Gosub Barrido : Gosub Ptecla Dim Setcuart As Byte Led = 1 Setprime = 1 Writeeeprom Numero , 3 Setsegu = 2 Goto Reseteo Setercer = 3 Setcuart = 4 Dim Eeprom1 As Byte Barrido: Dim Eeprom2 As Byte A=0 Dim Eeprom3 As Byte If Uno = 0 Then Numero = 1 : Return Dim Eeprom4 As Byte If Dos = 0 Then Numero = 2 : Return Eeprom1 = 1 If Tres = 0 Then Numero = 3 : Return Eeprom2 = 2 If Cuatro = 0 Then Numero = 10 : Eeprom3 = 3 Return Eeprom4 = 4 A=1 Iniciando: B=0 For R = 1 To 2 If Uno = 0 Then Numero = 4 : Return Led = 1 : Bip = 1 If Dos = 0 Then Numero = 5 : Return Waitms 500 If Tres = 0 Then Numero = 6 : Return Led = 0 : Bip = 0 If Cuatro = 0 Then Numero = 11 : Waitms 150 Return Next B=1 C=0 Writeeeprom Eeprom1 , 0 If Uno = 0 Then Numero = 7 : Return Writeeeprom Eeprom2 , 1 If Dos = 0 Then Numero = 8 : Return Writeeeprom Eeprom3 , 2 If Tres = 0 Then Numero = 9 : Return Writeeeprom Eeprom4 , 3 If Cuatro = 0 Then Numero = 12 : Reseteo: Return For R = 1 To 3 C=1 Led = 1 : Bip = 1 D=0 Waitms 50 If Uno = 0 Then Numero = 14 : Led = 0 : Bip = 0 Return Waitms 50 If Dos = 0 Then Numero = 0 : Return If Cuatro = 0 And Uno = 0 Then Goto If Tres = 0 Then Numero = 15 : FISEI Reseteo Return Next If Cuatro = 0 Then Numero = 13 : Octavo Electrónica 2009 – 2010 FISEI - UTA 63
  • 72.
    Return Falso: D=1 Gosub Barrido : Gosub Ptecla Waitms 10 Falso1: Goto Barrido Gosub Barrido : Gosub Ptecla Falso2: Ptecla: Gosub Barrido : Gosub Ptecla Led = 1 : Bip = 1 Falso3: Waitms 100 For R = 1 To 3 Led = 0 : Bip = 0 Waitms 150 Led = 1 : Bip = 1 Espacio: Waitms 15 If Uno = 0 Then Goto Espacio Led = 0 : Bip = 0 If Dos = 0 Then Goto Espacio A=1:B=1:C=1:D=1 If Tres = 0 Then Goto Espacio If Cuatro = 0 And Uno = 0 Then Goto If Cuatro = 0 Then Goto Espacio Reseteo Waitms 25 Next Return Panico: Teclauno: Led = 1 Gosub Barrido Waitms 500 Gosub Ptecla Led = 0 If Numero = Setprime Then Goto Waitms 500 Teclados A=1:B=1:C=1:D=1 Goto Falso If Cuatro = 0 And Uno = 0 Then Goto Reseteo Teclados: Goto Panico Gosub Barrido : Gosub Ptecla End If Numero = Setsegu Then Goto Teclatres Goto Falso1 Teclatres: Gosub Barrido : Gosub Ptecla If Numero = Setercer Then Goto Teclacuatro Goto Falso2 Teclacuatro: Gosub Barrido : Gosub Ptecla If Numero = Setcuart Then Goto Openge Goto Falso3 Openge: For R = 1 To 2 Waitms 100 Led = 1 : Bip = 1 Waitms 100 Led = 0 : Bip = 0 Next Door = 1 Wait 1 Door = 0 A=1:B=1:C=1:D=1 If Cuatro = 0 Then Goto Grabauno Goto Teclauno FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 64
  • 73.
    MOTORES PASO APASO ¿QUÉ ES UN MOTOR PASO A PASO? Como todo motor, es en esencia un conversor electromecánico, que transforma la energía eléctrica en mecánica; pero de un modo tan peculiar que constituye en la actualidad una categoría aparte. En efecto, mientras que un motor convencional gira libremente al aplicar una tensión comprendida dentro de ciertos límites (que se corresponden de un lado al par mínimo capaz de vencer su propia inercia mecánica, y de otro a sus propias limitaciones de potencia); el motor paso a paso está concebido de tal manera que gira un determinado ángulo proporcional a la "codificación" de tensiones aplicadas a sus entradas (4, 6, etc.). La posibilidad de controlar en todo momento esta codificación permite realizar desplazamientos angulares lo suficientemente precisos, dependiendo el ángulo de paso (o resolución angular) del tipo de motor (puede ser tan pequeño como 1,80º hasta unos 15º). De este modo, si por ejemplo el número de grados por paso es de 1,80º, para completar una vuelta serán necesarios 200 pasos. De la misma manera que se puede posicionar el eje del motor, es posible controlar la velocidad del mismo, la cual será función directa de la frecuencia de variación de las codificaciones en las entradas. De ello se deduce que el motor paso a paso presenta una precisión y repetitividad que lo habilita para trabajar en sistemas abiertos sin realimentación. MOTORES PASO A PASO BIPOLARES En el esquema de la figura 4 aparece uno de estos motores con dos estatores, sobre cada uno de los cuales se ha devanado una bobina (1 y U), las cuales se encuentran conectadas directamente a unos conmutadores de control que, como se verá más adelante, podrán ser sustituidos por las líneas de entrada y salida de nuestro ordenador debidamente programadas. Como las bobinas se encuentran distribuidas simétricamente en torno al estator, el campo magnético creado dependerá en magnitud de la intensidad FISEI de corriente por cada fase, y en polaridad magnética, del sentido de la corriente que circule por cada bobina. De este modo el estator adquiere la magnetización correspondiente, orientándose el rotor según ella (fig. 4a). Si el interruptor 1.1 se Octavo Electrónica 2009 – 2010 FISEI - UTA 65
  • 74.
    conmuta a susegunda posición (fig. 4b), se invierte el sentido de la corriente que circula por T y por tanto la polaridad magnética, volviéndose a reorientar el rotor (el campo ha sufrido una rotación de 90º en sentido antihorario, haciendo girar el rotor 90º en ese mismo sentido). Con esto se llega a la conclusión de que para dar una vuelta completa serían necesarios cuatro pasos de 90º cada uno (el ciclo completo se puede seguir en la figura 4a,b,c,d).Ahora bien, este tipo de motores también puede funcionar de un modo menos "ortodoxo", pero que nos va a permitir doblar el número de pasos, si bien a costa de la regularidad del par. Esto se consigue de la siguiente manera: en principio, al igual que en el anterior fondo de funcionamiento, por los devanados T y U se hace circular una corriente, de tal modo que el estator adquiere la magnetización correspondiente y por lo tanto el rotor se orienta según ella. Ahora bien, al contrario que en el caso anterior, antes de conmutar el interruptor I.1 a su segunda posición, se desconectará el devanado T, reorientándose por consiguiente el rotor, pero la mitad de un paso (45º). FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 66
  • 75.
    MOTORES PASO APASO UNIPOLARES Los motores paso a paso unipolares, en cuanto a construcción son muy similares a los anteriormente descritos excepto en el devanado de su estator (fig. 5). En efecto, cada bobina del estator se encuentra dividida en dos mediante una derivación central conectada a un terminal de alimentación. De este modo, el sentido de la corriente que circula a través de la bobina y por consiguiente la polaridad magnética del estator viene determinada por el terminal al que se conecta la otra línea de la alimentación, a través de un dispositivo de conmutación. Por consiguiente las medias bobinas de conmutación hacen que se inviertan los polos magnéticos del estator, en la forma apropiada. Nótese que en vez de invertir la polaridad de la corriente como se hacía en los M.P.P. bipolares se conmuta la bobina por donde circula dicha corriente. FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 67
  • 76.
    Al igual quelos M.P.P. bipolares, es posible tener resoluciones de giro correspondientes a un semipaso. Ahora bien, dado que las características constructivas de estos motores unipolares son idénticas a las de los bipolares, se puede deducir que los devanados tanto en uno como otro caso ocuparán el mismo espacio, y por tanto es evidente que por cada fase tendremos menos vueltas o bien el hilo de cobre será de una sección menor. En cualquiera de los dos casos se deduce la disminución de la relación de amperios/vuelta. Por tanto, a igualdad de tamaño los motores bipolares ofrecen un mayor par. FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 68
  • 77.
    SECUENCIA DEL CIRCUITODE CONTROL Existen dos formas básicas de hacer funcional los motores paso a paso atendiendo al avance del rotor bajo cada impulso de excitación: Paso completo (full step): El rotor avanza un paso completo por cada pulso de excitación y para ello su secuencia ha de ser la correspondiente a la expuesta anteriormente, para un motor como el de la Figura 2, y que se presentada de forma resumida en la Tabla 1 para ambos sentidos de giro, las X indican los interruptores que deben estar cerrados (interruptores en ON), mientras que la ausencia de X indica interruptor abierto (interruptores en OFF). Medio paso (Half step): Con este modo de funcionamiento el rotor avanza medio paso por cada pulso de excitación, presentando como principal ventaja una mayor resolución de paso, ya que disminuye el avance angular (la mitad que en el modo de paso completo). Para conseguir tal cometido, el modo de excitación consiste en hacerlo alternativamente sobre dos bobinas y sobre una sola de ellas, según se muestra en la Tabla siguiente para ambos sentidos de giro. FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 69
  • 78.
    MANEJO DE UNMOTOR PASO A PASO EN SECUENCIA WAVE DRIVE $regfile = "m8def.dat" For X = 1 To 12 $crystal = 4000000 Portc = &B1000 $eeprom Gosub Pausa Dim X As Byte Portc = &B0100 Config Portc = Output Gosub Pausa Antihorario: Portc = &B0010 For X = 1 To 12 Gosub Pausa Portc = &B0001 Portc = &B0010 Gosub Pausa Gosub Pausa Portc = &B0010 Next Gosub Pausa Wait 1 Portc = &B0100 Goto Antihorario Gosub Pausa Pausa: Portc = &B1000 Waitms 100 Gosub Pausa Return Next End Wait 1 FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA
  • 79.
    MANEJO DE UNMOTOR PASO A PASO EN SECUENCIA FULL STEP $regfile = "m8def.dat" $crystal = 4000000 $eeprom Dim X As Byte Config Portc = Output Antihorario: For X = 1 To 12 Portc = &B0011 Gosub Pausa Portc = &B0110 Gosub Pausa Portc = &B1100 Gosub Pausa Portc = &B1001 Gosub Pausa Next Goto Antihorario Pausa: Waitms 100 Return End MANEJO DE UN MOTOR PASO A PASO EN SECUENCIA HALF STEP $regfile = "m8def.dat" Gosub Pausa $crystal = 4000000 Portc = &B1000 $eeprom Gosub Pausa Dim X As Byte Portc = &B1100 Config Portc = Output Gosub Pausa Antihorario: Portc = &B1000 For X = 1 To 12 Gosub Pausa Portc = &B0001 Portc = &B1001 Gosub Pausa Gosub Pausa Portc = &B0011 Next Gosub Pausa Goto Antihorario Portc = &B0010 Pausa: Gosub Pausa Waitms 100 Portc = &B0110 Return Gosub Pausa End FISEI Portc = &B0100 Gosub Pausa Portc = &B1100 Octavo Electrónica 2009 – 2010 FISEI - UTA 70
  • 80.
    COMUNICACIÓN QUE ES LA COMUNICACIÓN SERIAL? RS-232 es hoy en día un estándar de comunicación antiguo. Es sorprendente que una norma, definida en los años sesenta, es aún ampliamente utilizado hoy en día. Formalmente no obstante, el nombre de RS-232 no es aplicable a una norma. Una organización estadounidense, ahora conocida como la Asociación de Industrias Electrónicas, propuso una forma de comunicación entre grandes ordenadores centrales y periféricos tales como terminales La propuesta se llama un nivel recomendado y 232 no era más que un número de identificación. Mucho más tarde esto se convirtió en una norma oficial, la EIA-232. En 1991, la versión más reciente, la EIA-232E fue publicado. Sin embargo, el nombre de RS-232 es aún ampliamente utilizado. Una tensión entre -3 y -25 voltios es una lógica de un (1) Una tensión entre 3 y 25 voltios es una lógica de cero (0) UART UART medio receptor asíncrono de transmisor universal. Es el final de hardware en ambos lados de un puerto RS-232 enlace de comunicación. En el PC o cualquier otro equipo que es un chip en la placa base, bajo el control de la CPU. En el controlador de AVR es una pequeña área en el chip dedicada a esta función. En el ATMEGA8 el UART está conectado al pin 2 (RXD) y 3 (TXD). Como estos pines también funcionan como de propósito general de E / S PortD.0 y PortD.1, tendrá que sacrificar algunas de E / S si usted necesita el UART. Un UART se encarga de enviar y recibir bits. Cuando se recibe, se determina cuándo se muestra el RxD PIN para determinar si se recibe cero o uno. Cuando se transmite, la UART lee un byte del búfer de transmisión y envía los bits que corresponden con el momento apropiado para el RS- 232 de velocidad seleccionada. FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 71 72
  • 81.
    Un convertidor denivel genera las tensiones necesarias para cumplir con los niveles Del RS-232. También se invierte la lógica de los niveles. El MAX232 usa interiormente, convertidores de conmutación y dobladores de voltaje para generar niveles de alrededor de -9 y 9 voltios. Estas tensiones se encuentran claramente dentro del rango requerido. MODOS DE TRANSMISIÓN DE DATOS Simplex: se dice a la transmisión que puede ocurrir en un solo sentido, sea sólo para recibir o sólo para transmitir. Una ubicación pude ser un transmisor o un receptor, pero no ambos a la vez, un ejemplo claro es la radiodifusión, en donde la estación es el transmisor y los radios son los receptores. Half-duplex: se refiere a la transmisión que puede ocurrir en ambos sentidos, pero no al mismo tiempo, en donde una ubicación puede ser transmisor o un receptor, pero no los dos al mismo tiempo, un ejemplo son los llamados radios WALKING TALKING, en donde un operador presiona el botón y habla, luego suelta el botón y el otro usuario presiona el botón para contestar. Full-duplex: se dice a la transmisión que puede ocurrir en ambos sentidos y al mismo tiempo, también se lo conoce con el nombre de líneas simultaneas de doble sentido, una ubicación puede transmitir y recibir simultáneamente, siempre y cuando la estación a la que está transmitiendo también sea la estación de la cual está recibiendo, un ejemplo es la telefonía móvil. FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 73
  • 82.
    Full/full-duplex: con estemodo de transmisión es posible transmitir y recibir simultáneamente, pero no necesariamente entre las dos ubicaciones, es decir una estación puede transmitir a una segunda estación y recibir ded una tercera estación al mismo tiempo. Esta transmisión se utiliza exclusivamente con circuitos de comunicación de datos. COMUNICACIÓN SERIAL AVR A PC Una vez comprendido la teoría de la comunicación serial y su protocolo RS232, haremos un ejercicio de comunicación serial asincrónico modo simplex, que consiste en enviar datos, mas específicamente los caracteres ASCII de la palabra “DOG”, a través de un cable y directamente desde el AVR al PC, a 2400 bits/seg, a 8 bits de datos, sin paridad, y 1 bit de parada. Como sabemos el computador tiene al menos un puerto serial, como la norma RS232, por lo tanto debemos simular esos voltajes desde el AVR, esto lo conseguimos enviando 0 para representar el 1 lógico y 5V para representar el 0 lógico, para esto existe la declaración PRINT. Print “D” envía el carácter ASCII “D” por el puerto de comunicación serial del AVR. $baud = 19200 Digo que trabajare a 19200 bits/segundo. $regfile = "m8def.dat" $crystal = 1000000 $baud = 96000 Config Portb = Output Inicio: Portb.0 = 1 Wait 1 Portb.0 = 0 Waitms 500 ' envio datos en forma serial Print "DOG" Goto Inicio End FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 74
  • 83.
    BASCOM nos ofreceuna herramienta para poder simular la comunicación serial, para ello nos vamos a Tools / Terminal Emulator Debemos configurar el terminal, para ello damos un clic en Terminal y se presentara la siguiente ventana de configuración. Terminal / Setting FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 75
  • 84.
    COMUNICACIÓN SERIAL PCA AVR Si usted tubo problemas con el envió de datos del AVR al PC, este proyecto de seguro le funcionara, se trata de enviar datos desde el PC al AVR, por lo que es de suponerse los voltajes serán desde -10V hasta +10V y la distancia podemos extenderlo hasta 15 metros sin ningún problema, como la conexión es directamente al AVR debemos colocar una resistencia de 22K para no dañar el puerto del AVR. En este caso el AVR es un receptor por lo que debemos permanecer en espera del bit de inicio, para esto tenemos la declaración SERIN. DECLARACIÓN SERIN: esta declaración sirve para recibir datos seriales en un formato estándar asíncrono. Mybaud = 19200 Serin S , 0 , D , 0 , Mybaud , 0 , 8 , 1 ' ^ 1 stop bit ' ^---- 8 data bits ' ^------ even parity (0=N, 1 = E, 2=O) ' ^-------------- baud rate ' ^-------------------- pin number ' ^----------------------- port so PORTd.0 and PORTd.1 son usados ' ^--------------------------- for strings pass 0 ' ^-------------------------------- variable FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 76
  • 85.
    $regfile = "m8def.dat" $crystal = 1000000 Dim Dat As Byte Dim Mybaud As Integer Mybaud = 9600 Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 Config Lcdpin = Pin , Db6 = Portb.3 , Db7 = Portb.4 Config Lcdpin = Pin , E = Portb.5 , Rs = Portb.6 Config Lcdmode = Port ' borrar la pantalla Cls ' Presento en la lcd Lcd " LCD listo" Wait 1 Cls Inicio: Serin Dat , 0 , D , 0 , Mybaud , 0 , 8 , 1 Lcd "Dat" Goto Inicio COMUNICACIÓN I²C I²C significa Inter-IC. e trata de un desarrollo de Philips, que comenzó en los años ochenta. En aquellos días la electrónica de consumo, como televisores y la radio pasó por una fase rápida de conseguir más y más usuarios. Lotes de circuitos integrados se han añadido a estos productos como consecuencia de cableado más complicado en un circuito impreso de hacinamiento. Philips considera que un bus serie simple era una solución posible. En lugar de buses de acoplamiento en paralelo IC, todos estos LED's se conectan a un bus de dos hilos. El bus de dos hilos tiene un cable de datos y de un reloj, llaman SDA y SCL, respectivamente. En 1992, el estándar I²C utiliza un esquema de siete bits para el direccionamiento, permitiendo 128 CI a ser conectados a un bús. FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 77
  • 86.
    Direccion I²C El número de CI en un bus I²C está limitado a 128, ya que cada IC necesita únicos siete bits de dirección. Estándar I²C La norma original especifica una velocidad máxima en el bus de 100 kHz. En 1992, se añadió un modo rápido con una velocidad máxima de 400 kHz. En 1998, una versión 2 fue lanzado. Esta versión tiene un modo de alta velocidad con un máximo de 3.4Mbit/s. Mas sobre I²C Philips tiene la patente en la I²C eso significa que otros fabricantes de chips que quieren hacer IC I²C tienen que pagar regalías y deben firmar un acuerdo que indique que se adhieren a los estándares I²C. La mayoría de los controladores de AVR de Atmel tiene una interfaz de dos hilos, por lo menos eso es lo que dice la documentación. Esto es por supuesto una interfaz I²C. La norma I²C prescribe resistencias en SDA y la línea SCL. Este es uno de los errores más comunes de la primera vez que utiliza una interfaz de I²C. Olvídese de los "push- pull y su interfaz no funcionará. FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 78
  • 87.
    La longitud máximade los cables de bus I²C no está en la norma. Sólo dice que para la variante de 100 kHz, la capacidad total del cableado de bus y los dispositivos conectados no debe exceder 400pF. COMUNICACIÓN I²C CON UNA MEMORIA SERIAL 24L04B Esta es una practica muy básica para aprender sobre la interfaz I²C, consiste en guardar datos es las cuatro primeras direcciones de la memoria serial, estas son utilizadas para el almacenamiento de datos que pueden ser necesitados más adelante. Para el caso de la memoria 24LC04B tiene un espacio de memoria de 4Kbytes, luego de almacenarlos los volveremos a leer y mostrar en la pantalla LCD. Referencia Capacida Ciclos de Bloques Dirección Cantidad Voltaje de d E/W Internos A0 A1 A2 de operación disposit. En el bus 24LC01B 1K bits 1000000 1 1-0 1-0 1-0 8 2.5-5.5V 24LC02B 2 K bits 1000000 1 1-0 1-0 1-0 8 2.5-5.5V 24LC04B 4 K bits 1000000 2 x 1-0 1-0 4 2.5-5.5V 24LC08B 8 K bits 1000000 4 x x 1-0 2 2.5-5.5V 24LC016B 16 K bits 1000000 8 x x x 1 2.5-5.5V El principio de funcionamiento es el siguiente: primero se envía el star (bit de arranque) cada palabra puesta en el bus SDA debe tener 8 bits, la primera palabra transferida debe contener la dirección del esclavo seleccionado, en este caso se envía el código de la memoria 1010 (este dato lo suministra el fabricante), luego la dirección del dispositivo (A2, A1, A0), y un bit 0 indicando que se debe escribir en la memoria (1 = lectura), luego de todo esto la memoria, debe enviar un reconocimiento para informar al FISEI microcontrolador que recibió la información, este acuse de recibo se denomina ACK (acknowledge). Octavo Electrónica 2009 – 2010 FISEI - UTA 79
  • 88.
    Luego el masterlee el ACK, si vale 0 (enviado por el esclavo), el proceso de transferencia continúa. Si vale 1, esto indica que el circuito direccionado no valida la comunicación, entonces es Master genera un bit de stop para liberar el bus I²C, en la cual las líneas SDA y SCL pasan a un estado alto, vamos a suponer que el ACK es 0, entonces el microcontrolador envía los 8 bits correspondientes a la posición de memoria que se desea escribir a leer, nuevamente la memoria envía un reconocimiento, finalmente se envía el dato a ser almacenado y se espera la respuesta de la memoria indicando que el dato llegó correctamente, finalmente se debe enviar el bit de parada. DECLARACIÓN I2CSTART genera una condición de inicio. I2CSTOP genera una condición de parada I2CRBYTE recibe un byte de un dispositivo. I2CWBYTE envía un byte a un dispositivo. FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 80
  • 89.
    En este casivamos a escribir y leer en la memoria, por lo que el pin WP debe estar colocado en estado bajo, una vez que se haya grabado se podrá colocar este pin en estado alto para proteger la memoria de futuras escrituras, los datos almacenados en esta memoria permanece aun si se le corta la alimentación al CI, el acceso a estos datos se lo realiza las veces deseadas, recuerde que la memoria serial soporta 1000000 de ciclos de borrado y escritura, por lo tanto se debe tener cuidado de no ejecutar un programa que almacene una y otra vez el mismo dato. Config Sda = Portb.5 Dim Dato As Byte Dim Dato1 As Byte Dato = 2 Dato1 = 0 Wait 5 Do Cursor Off Noblink ' escribo en la memoria ' genere inicio I2cstart ' direccion del esclavo I2cwbyte &B10100000 ' direccion de eeprom I2cwbyte 0 ' valor a escribir I2cwbyte Dato ' genere parada I2cstop Waitms 10 ' leo la memoria I2cstart I2cwbyte &B1010_0000 I2crbyte Dato1 , Nack I2cstop Cls Lcd " DATO " ; Dato1 Wait 2 Cls Loop FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 81
  • 90.
    INTERRUPCIONES Suponga que tiene un programa de Bascom que se encuentra en un bucle haciendo algo complicado y requiere mucho tiempo. Usted quiere ser capaz de detener esta tarea y cambiar el programa para hacer algo más. La solución de hardware obvia es añadir un botón STOP para su AVR. Normalmente, se pulsa el botón con el siguiente fragmento de programa: ... Config Pind.2 as Input ... ... Do ... ... ...someting complicated... ... ... ... If Pind.2 = 0 Then Lcd "Stop!" Goto Othertask End If Loop ... ... OtherTask: FISEI ... ... Octavo Electrónica 2009 – 2010 FISEI - UTA 82
  • 91.
    El problema fundamentalde este ejemplo es que podemos pasar tanto tiempo haciendo la tarea complicada, que al pulsar el botón STOP a menudo no se detecta cuando se pulso el Boton de stop. Obviamente necesitamos otro mecanismo para reaccionar a pulsar el botón STOP de manera independiente del programa principal. Las interrupciones son para cambiar el flujo del programa para responder a externos, así como eventos de controlador interno $regfile = "m8def.dat" $crystal = 1000000 $hwstack = 32 $swstack = 10 $framesize = 40 Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 Config Lcdpin = Pin , Db6 = Portb.3 , Db7 = Portb.4 Config Lcdpin = Pin , E = Portb.5 , Rs = Portb.6 Config Lcdmode = Port Config Pind.6 = Output Config Pind.2 = Input Config Int0 = Falling Dim Wtime As Byte On Int0 Stopbutton Cls Wtime = 255 Enable Interrupts Enable Int0 Do Set Portd.6 Waitms Wtime Reset Portd.6 Waitms Wtime Loop Stopbutton: Lcd "stop!" Wait 1 Cls Return End FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 83
  • 92.
    SLEEP Y WAKE-UP,WATCH DOG Se utilizan normalmente en aplicaciones de batería cuando el controlador no tiene nada que hacer y desea ahorrar energía. El ATMEGA8 puede hacer el SLEEP de dos maneras: La declaración de inactividad se detiene el reloj del controlador, pero la UART, las interrupciones externas y el temporizador / contador de interrupciones seguir funcionando. Todas estas interrupciones pueden despertar el controlador. Wake-up detiene el reloj del controlador, pero las interrupciones externas se mantienen funcionando y puede despertar el controlador, $regfile = "m8def.dat" $crystal = 1000000 Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 Config Lcdpin = Pin , Db6 = Portb.3 , Db7 = Portb.4 Config Lcdpin = Pin , E = Portb.5 , Rs = Portb.6 Config Lcdmode = Port Config Pind.6 = Output Config Int0 = Low Level On Int0 Button Enable Interrupts Enable Int0 Do Set Portd.6 Wait 1 Reset Portd.6 Cls Lcd "power apagado" Lowerline Lcd "push boton" Powerdown Loop Button: Cls Lcd "despierta!" Wait 1 Return End Después de parpadear el LED y escribir un mensaje a la pantalla LCD, Desmantelamiento "se utiliza para detener el reloj del controlado. Al pulsar el botón se FISEI despierta el controlador Octavo Electrónica 2009 – 2010 FISEI - UTA 84
  • 93.
    WATCHDOG Bascom puede proporcionar una función de vigilancia. n vigilante es un truco para restablecer su control si el programa de alguna manera se atasca o "cuelga". Un vigilante es un contador de tiempo que tendrá que ponerse a cero de vez en cuando. Si se bloquea el programa, no será capaz de restablecer la vigilancia y cuando los tiempos de vigilancia a cabo, se restablecerá el controlador. Esto a menudo se utiliza en aplicaciones críticas donde tiene que estar seguro de que el controlador se reiniciará pase lo que pase. Un programa decente debe lidiar con un tiempo de vigilancia en una forma sensata. El tiempo de espera vigilante es una situación muy grave, tal vez causada por un error de diseño de hardware o de software. En cualquier caso, cuando se utilizan perros guardianes, siempre incluyen algún tipo de mecanismo de información, o bien nunca se sabrá acerca de estos posibles errores. Un organismo de control tiene que estar configurado para un tiempo de espera específicas: Config Watchdog 16 | 32 | 64 | 128 | 256 | 512 | 1024 | 2048 que van desde 16 hasta 2048 milisegundos. El organismo de control tiene que ponerse a cero antes del tiempo de espera. Reset Watchdog Para evitar un reinicio del controlador. El organismo de control puede ser iniciado y se detuvo con un Start Watchdog Stop Watchdog $regfile = "m8def.dat" $crystal = 1000000 Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 Config Lcdpin = Pin , Db6 = Portb.3 , Db7 = Portb.4 Config Lcdpin = Pin , E = Portb.5 , Rs = Portb.6 Config Lcdmode = Port Config Pind.6 = Output Config Watchdog = 2048 Do Cls Set Portd.6 Wait 2 Reset Portd.6 Lcd "WD correr" FISEI Lowerline Lcd "wait 2 secs..." Start Watchdog Idle Loop End Octavo Electrónica 2009 – 2010 FISEI - UTA 85
  • 94.
    Después de queel perro guardián de inicio, el controlador se pone en Idle, detener el reloj del controlador. Como el organismo de control se ejecuta en un reloj independiente, se puede y se restablecerá el controlador después de app dos segundos. CIRCUITO PROGRAMADOR DE AVR PROGRAMADOR ISP BASCOM soporta al STK200, STK200+ y STK300 programador ISP de Atmel. Éste es un programador de puerto de impresora paralelo muy fiable. La mayoría de los programas se probó con el STK200. Para aquéllos que no tienen este equipo programador les muestro el esquema siguiente de cómo hacer su propio programador. FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 86
  • 95.
    El PG302 esun programador serial. Funciona y se visualiza exactamente como el software PG302. Seleccione el programador en Opciones de menú del Programador, o clic derecho en el botón o en las opciones del programa en el menú. EJEMPLO DEL CABLE DE PROGRAMACIÓN Este programador es muy simple y usted puede hacer dentro de 30 minutos. Lo que necesitas es un terminal DB25 (conector macho), cable, conectores. Las conexiones que se debe realizar son las siguientes. La numeración del pin MCU son para los 8535 y 8515. Usted puede usar una resistencia pequeña de 100-220 ohm en serie con la linea D0, D2 y D3 evitando un corto circuito que sus LPT ponen a babor en el evento cuando los pines de MCU son altos. Se probó sin estas resistencias y ningún problema ocurrió. El siguiente grafico muestra las conexiones a realizar: FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 87
  • 96.
    FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 88
  • 97.
    FISEI CHIPS Octavo Electrónica 2009 – 2010 FISEI - UTA
  • 98.
    AT86RF401 Se muestra el entorno de distribución de pines, si desea información adicional se debe buscar los Datasheet de los Chips en www.datasheetcatalog.com AT90S1200 FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 89
  • 99.
    AT90S2313 AT90S2323 FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 90
  • 100.
    AT90S2333 AT90S2343 Cuando usas el AT90S2343 con Bascom-AVR y el STK200, el jumper del programador debe estar en ext-clk. FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 91
  • 101.
    AT90S4414 AT90S4433 FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 92
  • 102.
    AT90S4434 AT90S8515 FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 93
  • 103.
    AT90S8535 AT90PWM2-3 FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 94
  • 104.
    AT90CAN128 FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 95
  • 105.
    AT90USB162 ATtiny12 ATtiny13 FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 96
  • 106.
    ATtiny15 ATtiny22 ATtiny24 ATtiny25 FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 97
  • 107.
    ATtiny26 ATtiny44 ATtiny45 FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 98
  • 108.
    ATtiny48 ATtiny84 ATtiny85 FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 99
  • 109.
    ATtiny88 ATtiny261 FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 100
  • 110.
    ATtiny861 ATtiny2313 ATMEGA8 FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 101
  • 111.
    ATMEGA16 ATMEGA32 FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 102
  • 112.
    ATMEGA32U ATMEGA48 FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 103
  • 113.
    ATMEGA48P ATMEGA88 FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 104
  • 114.
    ATMEGA88P FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 105
  • 115.
    ATMEGA64 FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 106
  • 116.
    ATMEGA103 FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 107
  • 117.
    ATMEGA128 ATMEGA1284P FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 108
  • 118.
    ATMEGA161 ATMEGA162 FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 109
  • 119.
    ATMEGA163 ATMEGA164P FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 110
  • 120.
    ATMEGA165 ATMEGA168 FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 111
  • 121.
    ATMEGA168P ATMEGA169 FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 112
  • 122.
    ATMEGA323 ATMEGA324P FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 113
  • 123.
    ATMEGA325 ATMEGA328P FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 114
  • 124.
    ATMEGA329 ATMEGA406 FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 115
  • 125.
    ATMEGA603 FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 116
  • 126.
    ATMEGA640 FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 117
  • 127.
    ATMEGA644P ATMEGA645 FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 118
  • 128.
    ATMEGA649 FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 119
  • 129.
    ATMEGA2560 FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 120
  • 130.
    ATMEGA2561 FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 121
  • 131.
    ATMEGA8515 ATMEGA8535 FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 122
  • 132.
    ATXMEGA128A1 FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA 123
  • 133.
    FISEI Octavo Electrónica 2009 – 2010 FISEI - UTA