Ejercicio 1 - Asignar una entrada a una salida '-------------------------------------------------------------'------------------------------------------------------------' EDBexperiment1.ba EDBexperiment1.bass ' Experiment 1 for the Educational Development Board ' (c) 1995-2006, MCS Electronics ' Fileversion 1.0 '-------------------------------------------'-----------------------------------------------------------------------------' 'Objetivo: 'Este programa asigna el valor del Pind.7 al Pinb.1. ' 'Conclusiones: Deberás de ser capaz de commutar el estado de un led l ed presionando un interruptor.
$regfile = "m88def.dat" 'Le "m88def.dat" 'Le dice a Bascom que chip usamos $crystal = 8000000 'Frecuenci 'Frecuencia a del cristal en Hz Config Pind.7 = Input 'Configura Pin D7 como entrada Config Pinb.1 = Output 'Configura Output 'Configura Pin B1 como salida
Do 'Realiza un bucle infinito entre Do ..... Loop
Portb.1 = Pind.7 'Asigna la salida con el valor de la entrada Loop
End 'Marca el final del programa
Ejercicio 2 - Rotar 8 Led´s '-------------------------------------------------------------'------------------------------------------------------------' EDBexperiment2.ba EDBexperiment2.bass ' Experiment 2 for the Educational Development Board ' (c) 1995-2006, MCS Electronics ' Fileversion 1.0 '-------------------------------------------'-----------------------------------------------------------------------------' 'Objetivo: 'Este programa rota los LED´s en el portD. ' 'Conclusiones: 'Ver el efecto de movimiento en los LED´s
$regfile = "m88def.dat" 'Le decimos a Bascom que chip usamos $crystal = 8000000 Config Portd = Output 'Configura el Pin D7 como salida
Portd = &B1111110 'Empezamos poniendo el PORTD.0 bajo (Led encendido)
Do Rotate Portd , Right , 1 'Mueve los bits una posición a la derecha 'Ahora PD1 deberá iluminarse y PD0 se apagará Waitms 500 'Espera 500 ms, de lo contrario no verás la rotación
Loop 'Siempre veremos dos LED´s encendidos End 'Fin del programa Analizando el código observamos: El tipo de chip que utilizamos. La velocidad del oscilador. La directiva CONFIG PORTD nos permite configurar rapidamente un puerto como entrada o salida. La declaración ROTATE, desplaza todos los bits de la variable a la izquierda o a la derecha. Todos los bits se conservan por lo que no se cambiarán bits de la variable. Esto significa que si rotamos una variable byte con un valor 1 (&B00000001), ocho veces la variable será la misma.
WAITMS, suspende la ejecución del programa por un tiempo dado en ms. (1-65535) La instrucción de control DO...LOOP ejecuta un bucle indefinido, para salir de este bucle se utiliza EXIT DO.
END Marca el final del programa.
Configuración de puertos I/O AVR utiliza dos registros para configurar sus puertos de E/S, DDRB y PORTB (Hay un par de registros por cada puerto del microcontrolador). Los 8 bits en el PORTB son iguales cuando se utilizan como pines I/O digitales. PORTB.x es un pin general de I/O digital. El bit DDBn en el registro DDRB, selecciona la dirección de este pin, si DDBn es establecido a "1", PORTBn es configurado como un pin de entrada, si DDBn es borrado "0", el PORTBn es configurado como un pin de salida. Si se establece el PORTBn a "1" cuando el pin se configura como un pin de entrada, la resistencia de pull-up es activada. Para conmutar la resistencia de pull-up a Off, el PORTBn ha de ser limpiado "0" o el pin tiene que ser configurado como una salida. Por default cuando energizamos un micro DDRn y PORTn estan en "0". Esto pone los puertos en un estado de alta impedancia (Tri-state)
IMPORTANTE, cuando d eseemos operar con los pines de entrada utilizaremos po r ejemplo, PINB .
Ejercicio 3 - Destellar un LED '-------------------------------------------------------------' EDBexperiment3.bas ' Experiment 3 for the Educational Development Board ' (c) 1995-2006, MCS Electronics ' Fileversion 1.0 '-------------------------------------------------------------' 'Objetivo: 'Este progrma hace destellar un Led ' 'Conclusiones: 'Deberás ver destellar el Led
$regfile = "m88def.dat" 'Le decimos a Bascom que chip usamos $crystal = 8000000 Config Pind.1 = Output 'Configura el PIND1 como salida
Do 'Realiza un bucle infiinito entre Do..Loop Set Portd.1 'Activa el Pind.1 Waitms 250 'Espera un momento para que puedas ver esto Reset Portd.1 'Desactiva el Pind.1 Waitms 250 'Espera un momento para que puedas ver esto Loop End Puedes obtener el m is mo resultado pero co n un código mas com pacto de la siguiente manera:
Do Toggle Portd.1 'Alterna el Pind.1 On /Off Waitms 250 'Espera un momento para que puedas ver esto Loop Con Toggle puedes invertir fácilmente el estado del Pin de un Port. El Pin tiene que ser configurado como una salida antes de utilizar Toggle.
Ejercicio 4 -Comunicación Serie Parte I -------------------------------------------------------------' EDBexperiment6a.bas ' Experiment 6a for the Educational Development Board ' (c) 1995-2006, MCS Electronics ' Fileversion 1.0 '-------------------------------------------------------------' 'Objetivo: 'Enviar el mensaje "Hola Mundo" al puerto COM del ordenador ' 'Conclusiones: 'Deberás ser capaz de imprimir algo por el puerto COM (RS-232)
$regfile = "m8def.dat" $crystal = 8000000 $baud = 19200 'Definimos la tasa de baudios en 19200 Do Print "Hola Mundo" 'La declaración PRINT envía un string a la UART Wait 3 'Detiene el programa por 3 segundos Loop End
Variables y Constantes VARIABLES Son estructuras de datos que, como su nombre indica, pueden cambiar de contenido a lo largo de la ejecución de un programa. Para poder utilizarlas debemos crearla, asignarle un nombre y declarar que tipo de datos contendrá. La sintaxis es la siguiente: Dim Edad as Byte "DIM" crea la variable, le asigna el nombre "EDAD" y declara que contendrá un "BYTE" que es un número dentro del rango de 0-255. Ya estamos listos para poder utilizarla y lo que haremos será asignarle el valor45. Edad = 45 En este caso el signo "=" es un operador de asignación, no de comparación. Dim Apellidos as String * 20
Este es un caso especial de variable por que es la única que puede contener una cadena de datos alfanuméricos (letras y números) y por eso a la sintaxis que hemos visto anteriormente debemos agregarle su longitud. "DIM" crea la variable, le asigna el nombre "Apellidos" y declara que contendrá una cadena "STRING" de 20 caracteres de longitud Apellidos = "Faria Aguilar"
Como puedes notar: Lo que deseamos asignar a la variable lo delimitamos entre comillas.
Declaramos que la variable contendrá 20 caracteres pero solo utilizamos 13. Esto es para poder almacenar algún apellido que pueda ser más largo, los espacios se cuentan. CONSTANTES En programacion, las constantes son tipos de datos (con valores numéricos o de cadena) que permanecen invariables, sin posibilidad de cambiar el valor que tienen durante el curso del programa. Su sintaxis es: Const Pi = 3.1415926535897932384 Const Mascota = "Tester"
Ejercicio 5 -Comunicación Serie Parte II '-------------------------------------------------------------' EDBexperiment6b.bas ' Experiment 6b for the Educational Development Board ' (c) 1995-2006, MCS Electronics ' Fileversion 1.0 '-------------------------------------------------------------' 'Objetivo: 'Este programa muestra cómo utilizar las declaraciones Print, Chr() y Waitkey() . ' 'Conclusions: 'Ahora estarás preparado para utilizar la UART '
$regfile = "m8def.dat" $crystal = 8000000 $baud = 19200 Dim Akey As Byte 'Declaramos una variable del tipo byte Print Print "Hola, pulsa cualquier tecla alfanumerica ..." Akey = Waitkey() 'Waitkey espera hasta que se recibe un caracter de la UART Print Akey Wait 1 Print Print "Gracias!, Como puedes ver el controlador imprime un numero," Print "pero no es la tecla que tu pulsaste." Wait 1 Print Print "Presiona la tecla ENTER..." Akey = Waitkey() Print Akey Print Print "El numero que ves es el valor ASCII de la tecla que pulsaste." Print "Tenemos que convertir el numero a la tecla ..."
Print 'Notice what this line does Print "Por favor, presiona de nuevo una tecla alfan umérica ..." Akey = Waitkey() Print Chr (akey) 'Notice what this does Print "Eso esta bien!" Wait 1 Print Print "Para una gran cantidad de funciones, una sola tecla no es suficiente ..." Print "Ahora escribe tu nombre y pulsa enter para confirmar." Dim Inputstring As String * 12 'Declara una variable string
Do Akey = Waitkey() If Akey = 13 Then Goto Thanks 'On enter key goto thanks Inputstring = Inputstring + Chr (akey) 'Assign the string
Loop Thanks:
Print "Gracias " ; Inputstring ; " !" 'Notice what ; does Wait 1 Print Print "Echa un vistazo al codigo del programa y trata de entender" Print "como funciona este programa. Asimismo, pulsa F1 en las declaraciones." Print Print "Si has entendido todo, continua con el siguiente experimento." Print Print "No he colocado los acentos porque en la simulacion no se representan correctamente." End
Ejercicio 5 -Comunicación Serie Parte III '-------------------------------------------------------------' EDBexperiment6c.bas ' Experiment 6c for the Educational Development Board ' (c) 1995-2006, MCS Electronics ' Fileversion 1.0 '-------------------------------------------------------------' 'Objetivo: 'Este programa muestra como usar las declaraciones Open, Close e Inkey() ' 'Conclusiones: 'Deberas ser capaz de trabajar con el software UART
$regfile = "m8def.dat" $crystal = 8000000 $baud = 19200
Dim B As Byte Waitms 100 'Abrir un canal de salida Tx
Open "comb.1:19200,8,n,1" For Output As #1 Print #1 , "salida serie"
'Abrir un canal Rx de entrada
Open "comb.2:19200,8,n,1" For Input As #2 ''Dado que no existe una relacion entre los pines de entrada salida 'No se produce eco de las teclas presionadas.
Print #1 , "Presiona cualquier tecla alfanumerica" 'Con INKEY() podemos comprobar si hay datos disponibles 'Para utilizarla con el software UART debes proporcionar el canal
Do B = Inkey(#2) 'Almacena en un Byte 'Cuando el valor> 0 tenemos algo If B > 0 Then
Print #1 , Chr (b) 'Imprime el caracter End If Loop
Close #2 'Cierra el canal Close #1 End IMPORTANTE: En este ejemplo s e utiliza la emu lación del puerto por so ftware. El ATmega8 dispo ne de un p uerto serie por hardware. Si neces itas, más pu erto s serie d eberás uti lizar esta emu lación p or s oft war e.
Calculadora de Ports para micros AVR He hecho este programita para ayudar a los que empiezan y se hacen un lío en l a cabeza para configurar las entradas y salidas de los micros AVR. Su uso es muy sencillo, cuando se inicia el programa el PORTx y DDRx están a cero lo que significa que el puerto en cuestión está configurado como alta impedancia (Tri-state), cuando pulsamos sobre el bit deseado alternaremos su configuración y veremos esta acción reflejada inmediatamente en los cuadros de texto. En cualquier momento podemos alternar la visualización del resultado en binario, hexadecimal o decimal.
Podéis descargar el archivo desde aquí.
Bucle FOR - NEXT $regfile = "m8def.dat" $crystal = 4000000 'Configuración del Port Portb = &H00 Ddrb = &HFF 'Declaración de las variables
Dim X As Byte 'Variable de control del bucle. Do For X = 0 To 7 'Ejecuta el bucle For ... Next 8 veces. Set Portb.x 'Activa un bit del PortB determinado por la variable X Waitms 200 Reset Portb.x 'Desactiva el bit . Next X Portb = &HFF 'Activa todas las salidas del PORTB
Waitms 400 For X = 7 To 0 Step -1 'STEP produce un salto ascendente o descendente. Reset Portb.x Waitms 200 Next X Loop End
FOR var = start TO end [STEP value] EL bucle FOR - Next es muy util cuando sabemos de antemano las veces que ha de ejecutarse Está compuesto por : var : variable de control del bucle.
start : valor de inicio del contador
end :valor que pone fin a la variable var STEP : El valor de" "var" se incrementará/decrementará cada vez que se encuentre con NEXT. Este parámetro es opcional.
Instrucciones IF-THEN-ELSE-END IF Ejecuta de forma condicional un grupo de instrucciones, dependiendo del valor de una expresión. La forma es la siguiente: IF Portb.0 =1 then 'Si Portb.0 = 1 entonces Print "ACTIVADO" 'Envie el mensaje "ACTIVADO" por el puerto serie Else 'de lo contrario Print "DESACTIVADO" 'Envie el mensaje "DESACTIVADO" por el puerto serie Endif 'Fin_del_SI La instrucción ELSE es opcional. IF Portb.0 =1 then Print "ACTIVADO" Endif
Instrucción SELECT-CASE-END-SELECT Ejecuta uno de varios grupos de instrucciones, según el valor de una expresión. Si tienes una estructura con muchos IF - THEN, esta instrucciones te pueden ser de gran ayuda. Dim I As Byte Do Input "Ingrese valor (0-255) " , I Select Case I Case 1 : Print "1" Case 2 : Print "2" Case 3 To 5 : Print "3-5" Case Is >= 10 : Print ">= 10" Case Else : Print "Caso no declarado" End Select Loop
End
Nota que la expresion booleana como => 3 es precedida por la palabra clave Is.