Avr proyecta programación en C. ¿Ya estás programando microcontroladores? ¡Entonces vamos a ti! Qué entorno de desarrollo usar para programar el microcontrolador seleccionado

Los microcontroladores son dispositivos pequeños pero muy útiles para aquellos que desean crear varias cosas robóticas o automatizadas sorprendentes en el hogar. En el marco de este artículo, la programación AVR para principiantes, se considerarán varios aspectos y matices de este proceso.

información general

Los microcontroladores se pueden encontrar en todas partes. Se encuentran en refrigeradores, lavadoras, teléfonos, máquinas de fabricación, hogares inteligentes y muchos otros dispositivos técnicos. Su uso generalizado se debe a la posibilidad de reemplazar circuitos de dispositivos analógicos más complejos y de gran escala. La programación de MK AVR le permite proporcionar un control autónomo sobre los dispositivos electrónicos. Estos microcontroladores se pueden considerar como una computadora simple que puede interactuar con equipos externos. Así, pueden abrir/cerrar transistores, recibir datos de sensores y mostrarlos en pantallas. Además, los microcontroladores pueden realizar varios procesamientos de información de entrada como una computadora personal. Si aprende a programar AVR desde cero y alcanza el nivel de un profesional, se abrirán posibilidades casi ilimitadas para controlar varios dispositivos utilizando puertos de E / S, así como para cambiar su código.

Un poco sobre AVR

En el marco del artículo se considerará una familia de microcontroladores fabricados por Atmel. Tienen un rendimiento bastante bueno, lo que les permite ser utilizados en muchos dispositivos de aficionados. Ampliamente utilizado en la industria. Se puede encontrar en esta técnica:

  1. Doméstico. Lavadoras, refrigeradores, hornos de microondas y más.
  2. Móvil. Robots, comunicaciones, etc.
  3. Informática. Sistemas de control de periféricos, placas base.
  4. Entretenido. Joyas y juguetes para niños.
  5. Transporte. Sistemas de seguridad de vehículos y gestión de motores.
  6. Equipo industrial. Sistemas de control de máquinas.

Esto, por supuesto, no es todas las áreas. Se utilizan cuando es ventajoso utilizar no un conjunto de chips de control, sino un microcontrolador. Esto es posible debido al bajo consumo de energía y para la escritura de programas se utilizan lenguajes C y Ensamblador, ligeramente modificados para la familia de microcontroladores. Dichos cambios son necesarios debido a las capacidades informáticas débiles, que se calculan, por regla general, en decenas de kilobytes. La programación AVR sin aprender estos lenguajes no es posible.

¿Cómo conseguir tu primer microcontrolador?

La programación AVR requiere:

  1. Disponibilidad del entorno de desarrollo necesario.
  2. En realidad, los propios microcontroladores.

Consideremos el segundo punto con más detalle. Existen tres posibilidades para adquirir el dispositivo requerido:

  1. Compre directamente el propio microcontrolador.
  2. Obtenga un dispositivo como parte del diseñador (por ejemplo, Arduino).
  3. Ensamble el microcontrolador usted mismo.

No hay nada complicado en el primer párrafo, así que pasemos inmediatamente al segundo y al tercero.

Obtenga un dispositivo como parte del diseñador

Se elegirá como ejemplo el conocido Arduino. También es una plataforma conveniente para el desarrollo rápido y de alta calidad de varios dispositivos electrónicos. La placa Arduino incluye un determinado conjunto de componentes con los que trabajar (hay varias configuraciones). Debe incluir un controlador AVR. Este enfoque le permite comenzar rápidamente a desarrollar el dispositivo, no requiere habilidades especiales, tiene oportunidades significativas en términos de conectar tableros adicionales y también puede encontrar mucha información en Internet sobre preguntas de interés. Pero no estuvo exento de inconvenientes. Al comprar un Arduino, una persona se priva de la oportunidad de sumergirse más profundamente en la programación AVR, para conocer mejor el microcontrolador, los detalles de su trabajo. Una línea relativamente estrecha de modelos también se suma a lo negativo, por lo que a menudo tienes que comprar placas base para tareas específicas. Una característica es también el hecho de que la programación en "SI" aquí difiere bastante de la forma estándar. A pesar de todas sus deficiencias, Arduino es adecuado para que los principiantes aprendan. Pero no se debe abusar.

Autoensamblaje

Cabe señalar que los microcontroladores AVR son bastante amigables para los principiantes. Puedes montarlos tú mismo con componentes asequibles, sencillos y económicos. Si hablamos de los profesionales, este enfoque le permite conocer mejor el dispositivo, elegir de forma independiente los componentes necesarios, ajustar el resultado final a los requisitos presentados, el uso de lenguajes de programación estándar y bajo costo. De las desventajas, solo se puede notar la complejidad del autoensamblaje, cuando se lleva a cabo por primera vez, y no hay conocimientos ni habilidades necesarios.

¿Como trabajar?

Entonces, digamos que el problema con el microcontrolador se ha resuelto. Además, se considerará que fue adquirido o comprado de forma independiente. ¿Qué más necesitas para dominar la programación AVR? Para este propósito, necesita un entorno de desarrollo (un bloc de notas regular también es adecuado como base, pero recomiendo detenerse en Notepad ++). Aunque existen otros programas para la programación de AVR, el software proporcionado podrá manejar todos los requisitos. También necesitas un programador. Se puede comprar en la tienda más cercana, ordenar en línea o ensamblarlo usted mismo. La placa de circuito impreso tampoco duele. No es obligatorio, pero su uso te permite ahorrar nervios y tiempo. También comprado / creado de forma independiente. Y el último es la fuente de alimentación. Para el AVR es necesario prever una tensión de alimentación de 5V.

¿Dónde y cómo estudiar?

No se pueden crear obras maestras desde cero. Esto requiere conocimiento, experiencia y práctica. Pero, ¿dónde puedes conseguirlos? Hay varias formas. Inicialmente, puede buscar de forma independiente la información necesaria en la red global. Puedes inscribirte en cursos de programación (a distancia o presenciales) para adquirir competencias laborales básicas. Cada enfoque tiene sus propias ventajas. Entonces, los cursos de programación remota serán más baratos y quizás gratuitos. Pero si algo no funciona, entonces, con sesiones cara a cara, un desarrollador experimentado podrá encontrar rápidamente la causa del problema. Además, no será superfluo familiarizarse con la literatura que está disponible gratuitamente. Por supuesto, no podrá dejar algunos libros, pero puede obtener conocimientos básicos sobre el dispositivo, programación en "SI", "Ensamblador" y otros momentos de trabajo.

puertos de E/S

Este es un tema extremadamente importante. Sin comprender cómo funcionan los puertos de E/S, no es posible programar el AVR en circuito. Después de todo, la interacción del microcontrolador con dispositivos externos se lleva a cabo precisamente a través de su mediación. A primera vista, un principiante puede pensar que el puerto es un mecanismo bastante confuso. Para evitar tal impresión, no consideraremos en detalle el esquema de su trabajo, sino que solo obtendremos una idea general de esto. Considere una implementación de software. Como ejemplo de dispositivo, se eligió el microcontrolador AtMega8, uno de los más populares de toda la familia AVR. Un puerto de E/S consta de tres registros que son responsables de su funcionamiento. A nivel físico, se realizan como piernas. Cada uno de ellos corresponde a un determinado bit en el registro de control. Cada pierna puede funcionar tanto para la entrada de información como para su salida. Por ejemplo, puede colgar una función de encendido LED o un procesamiento de pulsación de botón. Por cierto, los tres registros mencionados son: PORTx, PINx y DDRx. Cada uno de ellos es de ocho bits (recuerda que estamos considerando AtMega8). Es decir, un bit está ocupado por una cierta pierna.

Registrar operación

El más significativo en términos de orientación es el control DDRx. También es de 8 bits. Los valores para él se pueden escribir 0 o 1. ¿Cómo cambia la operación del controlador cuando se usan ceros y unos? Si un determinado bit se establece en 0, el pin correspondiente se cambiará al modo de entrada. Y será posible leer datos de dispositivos externos desde él. Si se establece en 1, entonces el microcontrolador podrá controlar algo (por ejemplo, instruir al transistor para que pase el voltaje y encienda el LED). El segundo más importante es PORTx. Es el encargado de gestionar el estado de las piernas. Veamos un ejemplo. Digamos que tenemos un puerto de salida. Si configuramos uno lógico en PORTx, se envía una señal desde el microcontrolador al dispositivo de control para comenzar a trabajar. Por ejemplo, encienda el LED. Cuando se establece en cero, se extinguirá. Es decir, no hay necesidad de trabajar con el registro de control DDRx todo el tiempo. Y finalmente, hablemos de PINx. Este registro es responsable de mostrar el estado del pin del controlador cuando se establece en el estado de entrada. Cabe señalar que PINx solo puede funcionar en modo de lectura. No se le puede escribir nada. Pero para leer el estado actual de la pierna no hay problema.

Trabajando con análogos

Los AVR no son los únicos microcontroladores. Este mercado está repartido entre varios grandes fabricantes, así como entre numerosos dispositivos de imitación chinos y productos caseros. En muchos aspectos son similares. Por ejemplo, la programación de PIC/AVR no es muy diferente. Y si hay comprensión de una cosa, será fácil comprender todo lo demás. Pero aun así recomendamos comenzar el viaje con AVR debido a su estructura competente, facilidad de desarrollo y la presencia de una gran cantidad de materiales auxiliares, que pueden acelerar significativamente el proceso de desarrollo.

La seguridad

Al programar microcontroladores AVR en "SI" o "Ensamblador", es necesario trabajar con mucho cuidado. El hecho es que al configurar una cierta combinación de registros y cambiar la configuración interna, puede bloquear el microcontrolador de manera segura. Esto es especialmente cierto para los fusibles. Si no hay confianza en la corrección de sus acciones, es mejor negarse a utilizarlas. Lo mismo se aplica a los programadores. Si compra equipos de fábrica, flasheará los microcontroladores sin problemas. Al ensamblar con sus propias manos, puede surgir una situación triste en la que el programador bloqueará el dispositivo. Esto puede ocurrir tanto por un error en el código del programa, como por problemas en el mismo. Por cierto, sobre un punto más (esta vez positivo), que se mencionó anteriormente de pasada, pero nunca se reveló por completo. Ahora casi todos los microcontroladores modernos tienen la función de programación en circuito. ¿Qué significa? Digamos que el dispositivo fue soldado en el tablero. Y para cambiar su firmware, ahora no necesita soldarlo, porque dicha interferencia puede dañar el microcontrolador. Basta con conectarlo a los pines apropiados y reprogramarlo a través de ellos.

¿Qué modelo elegir?

Como parte del artículo, se consideró AtMega8. Este es un microcontrolador bastante mediocre para sus características, que, sin embargo, es suficiente para la mayoría de los oficios. Si desea crear algo a gran escala, puede tomar monstruos ya peculiares como Atmega128. Pero están diseñados para desarrolladores más experimentados. Por lo tanto, si no hay suficiente experiencia, es mejor comenzar con dispositivos pequeños y simples. Además, son mucho más baratos. De acuerdo, una cosa es bloquear accidentalmente un microcontrolador por cien rublos, y otra muy distinta, por quinientos. Es mejor llenar su mano y comprender los diversos aspectos del funcionamiento, para no perder cantidades significativas en el futuro. Inicialmente, puede comenzar con AtMega8 y luego navegar según sus necesidades.

Conclusión

Entonces, el tema de la programación AVR se consideró en los términos más generales. Por supuesto, hay mucho más que decir. Entonces, por ejemplo, no se consideró el marcado de microcontroladores. Y puede decir mucho. Entonces, básicamente, los microcontroladores funcionan a un voltaje de 5V. Mientras que la presencia, por ejemplo, de la letra L puede indicar que solo 2,7 V son suficientes para que el dispositivo funcione. Como puede ver, a veces el conocimiento sobre el marcado puede jugar un papel muy importante en términos de la operación correcta y duradera de los dispositivos. . El tiempo de funcionamiento de los microcontroladores también es un tema interesante. Cada dispositivo está diseñado para un período determinado. Entonces, algunos pueden trabajar mil horas. ¡Otros tienen un stock garantizado de 10,000!

Decidí escribir un pequeño artículo introductorio para aquellos que comenzaron a programar microcontroladores por primera vez y nunca antes habían estado familiarizados con el lenguaje C. No vamos a entrar en detalles, pero sí un poco de todo, para tener una idea general de cómo trabajar con CodeVisionAVR.

Se puede encontrar información más detallada en inglés en el Manual de usuario de CodeVision, y también recomiendo el sitio http://somecode.ru con videos tutoriales sobre C para microcontroladores y el libro "Cómo programar en C" de Deitel, este es el único buen libro con el que yo mismo comencé.

Comencemos con el hecho de que no importa qué acciones hagamos, al final, todo se reduce al firmware del microcontrolador. El proceso de firmware en sí es el siguiente: usando un programa determinado, se selecciona un archivo de firmware, se seleccionan parámetros, se presiona un botón y se actualiza directamente el firmware, que, de hecho, es una copia. Al igual que copia música o documentos de una computadora a una unidad flash USB, la física del proceso es la misma.

El firmware en sí tiene la extensión .hex y es un conjunto de instrucciones, en forma de unos y ceros, que es comprensible para el microcontrolador. ¿Dónde puedo conseguir el firmware? Puede descargarlo de sitios de electrónica o escribirlo usted mismo. Puede escribirlo en programas especiales llamados entorno de desarrollo. Entre los más conocidos para mí están AVR Studio, IAR, CodeVision, WinAVR… Es imposible decir cuál de estos entornos es mejor o peor, a cada cual. Podemos decir que estos programas difieren principalmente en conveniencia, lenguaje de programación y precio. Dentro de este sitio, solo se considera CodeVision.

Descubrimos el entorno, ahora tratemos el proceso de escribir el firmware. En CodeVision, primero debe crear un proyecto. Se puede crear usando el asistente de código o vacío. En cualquier caso, debe seleccionar el tipo de microcontrolador utilizado y especificar su frecuencia. Al usar el asistente, se le pedirá que seleccione la configuración inicial y genere el código fuente con la configuración. A continuación, aparecerá una ventana en la que puede editar este código. Aunque puede escribir su código fuente en el bloc de notas y luego adjuntarlo al proyecto en la configuración.

Un archivo de código fuente es un conjunto de comandos en un lenguaje de programación, la tarea de CodeVision es traducir estos comandos a código binario, su tarea es escribir este código fuente. CodeVision entiende el lenguaje C, los archivos de código fuente tienen la extensión ".c". Pero CodeVision tiene algunas construcciones que no se usan en C, por lo que a muchos programadores no les gusta, y el lenguaje usado se llama C similar. Sin embargo, esto no impide escribir proyectos serios. Muchos ejemplos, un generador de código, un gran conjunto de bibliotecas le dan a CodeVision una gran ventaja. Lo único negativo es que es de pago, aunque existen versiones gratuitas con código limitado.

El código fuente debe contener un encabezado con el tipo de microcontrolador utilizado y la función principal. Por ejemplo, se utiliza ATtiny13

#incluir vacío principal (vacío) ();

#incluir vacío principal (vacío) ();

Antes de la función principal, puede conectar las bibliotecas necesarias, declarar variables globales, constantes, configuraciones. Una biblioteca es un archivo separado, generalmente con una extensión ".h", que ya tiene un código preescrito. En algunos proyectos, podemos necesitar este código, pero en otros no lo necesitamos. Por ejemplo, en un proyecto usamos LCD y en otro no. Puede conectar la biblioteca para trabajar con la pantalla LCD "alcd.h" de la siguiente manera:

#incluir #incluir vacío principal (vacío) ();

#incluir #incluir vacío principal (vacío) ();

Las variables son áreas de memoria en las que puedes poner algunos valores. Por ejemplo, agregamos dos números, el resultado debe guardarse en algún lugar para usarlo en el futuro. Primero debe declarar una variable, es decir, asignar memoria para ello, por ejemplo:
inti=0;
esos. declaramos la variable i y le pusimos el valor 0, int es el tipo de variable, o en otras palabras, significa el tamaño de la memoria asignada. Cada tipo de variable solo puede almacenar un cierto rango de valores. Por ejemplo, int se puede escribir números de -32768 a 32767. Si necesita usar números con una parte fraccionaria, entonces la variable debe declararse como un flotante, para los caracteres use el tipo char.

bit, _Bit 0 o 1 carácter -128 a 127 carácter sin signo 0 a 255 int -32768 a 32767 int sin signo 0 a 65535 int largo -2147483648 a 2147483647 int largo sin signo 0 a 4294967295 float ±1.175e- 38 a ±38.402e

Dentro de la función principal, el programa principal ya se está ejecutando. Después de ejecutar la función, el programa se detendrá, por lo que hacen un ciclo while infinito que hace girar el mismo programa todo el tiempo.

void main(void ) ( while (1 ) ( ) ; ) ;

vacío principal (vacío) (mientras que (1) (););

Puede escribir un comentario en cualquier parte del código fuente, no afectará de ninguna manera el funcionamiento del programa, pero ayudará a tomar notas en el código escrito. Puede comentar una línea con dos barras diagonales //después de eso, el compilador ignorará la línea completa o varias líneas /**/, por ejemplo:

/*Operaciones matemáticas básicas:*/ int i= 0 ; //declarando la variable i y asignándole el valor 0//Suma: i = 2 + 2 ; //Resta: i = 2 - 2 ; //después de ejecutar esta expresión, la variable i será igual a 0// Multiplicación: i = 2 * 2 ; //después de ejecutar esta expresión, la variable i será igual a 4//División: i = 2 / 2 ; //después de ejecutar esta expresión, la variable i será igual a 1

/*Operaciones matemáticas básicas:*/ int i=0; //declarando la variable i y asignándole el valor 0 //Suma: i = 2+2; //después de ejecutar esta expresión, la variable i será igual a 4 //Resta: i = 2-2; //después de ejecutar esta expresión, la variable i será igual a 0 //Multiplicación: i = 2*2; //después de ejecutar esta expresión, la variable i será igual a 4 //División: i = 2/2; //después de ejecutar esta expresión, la variable i será igual a 1

A menudo, un programa necesita saltar de una pieza de código a otra, dependiendo de las condiciones, para esto existen operaciones condicionales if(), por ejemplo:

if(i>3) //si i es mayor que 3, entonces asigne a i el valor 0 ( i=0; ) /*si i es menor que 3, luego vaya al siguiente código después del cuerpo de la condición, es decir después de corchetes ()*/

Además, si se puede usar junto con otra cosa, de lo contrario

si yo<3) //если i меньше 3, то присвоить i значение 0 { i=0; } else { i=5; //иначе, т.е. если i больше 3, присвоить значение 5 }

También hay un operador de comparación "==" que no debe confundirse con "=" asignar. La operación inversa no es igual a "!=", digamos

if(i==3)//si i es 3, establezca i en 0 ( i=0; ) if(i!=5) //si i no es 5, establezca i en 0 ( i=0; )

Pasemos a cosas más complejas: funciones. Digamos que tiene un fragmento de código que se repite varias veces. Además, este código es bastante grande en tamaño. Escribirlo cada vez es inconveniente. Por ejemplo, en el programa, la variable i se cambia de alguna manera, cuando presiona el botón 0 y 3 del puerto D, se ejecuta el mismo código que, según el valor de la variable i, enciende los pines del puerto B.

vacío principal (vacío) (si (PIND.0== 0) // comprobar si el botón en PD0 está presionado(si (i== 0) //si i==0 habilita PB0( PORTB.0= 1 ; ) si (i== 5 ) // si i==5 habilita PB1(PORTB.1= 1 ; ) ) … si (PIND.3== 0 ) // hacer lo mismo al marcar el boton PD3( si (i== 0 ) ( PORTB.0= 1 ; ) si (i== 5 ) ( PORTB.1= 1 ; ) ) )

void main(void) ( if(PIND.0==0) //verifica si el botón en PD0 está presionado ( if(i==0) //if i==0 habilita PB0 ( PORTB.0=1; ) if( i==5) // if i==5 habilitar PB1 ( PORTB.1=1; ) ) … if(PIND.3==0)// hacer lo mismo al marcar el botón PD3 ( if(i= =0 ) ( PUERTO.0=1; ) si(i==5) ( PUERTO.1=1; ) ) )

En general, el código no es muy grande, pero podría ser muchas veces más grande, por lo que sería mucho más conveniente crear tu propia función.
Por ejemplo:

void i_check() ( si (i== 0 ) ( PORTB.0= 1 ; ) si (i== 5 ) ( PORTB.1= 1 ; ) )

void i_check() ( if(i==0) ( PORTB.0=1; ) if(i==5) ( PORTB.1=1; ) )

void significa que la función no devuelve nada, más sobre eso a continuación i_check() - este es el nombre de nuestra función, puede llamarla como quiera, yo la llamé así - comprobando i. Ahora podemos reescribir nuestro código:

void i_check() ( if(i==0) ( PORTB.0=1; ) if(i==5) ( PORTB.1=1; ) ) void main(void) ( if(PIND.0==0 ) //comprobar si el botón está presionado en PD0 ( i_check(); ) … if(PIND.3==0) ( i_check(); ) )

Cuando el código llega a la línea i_check(); luego saltará dentro de la función y ejecutará el código dentro. De acuerdo, el código es más compacto y claro, es decir. Las funciones ayudan a reemplazar el mismo código, con solo una línea. Tenga en cuenta que la función se declara fuera del código principal, es decir, a la función principal. Puede decir, sí, por qué necesito esto, pero al estudiar las lecciones, a menudo encontrará funciones, por ejemplo, borrar la pantalla LCD lcd_clear (): la función no toma ningún parámetro y no devuelve nada, pero borra la pantalla. A veces, esta función se usa casi todas las demás líneas, por lo que el ahorro de código es obvio.

Parece mucho más interesante usar una función cuando toma valores, por ejemplo, hay una variable c y hay una función de suma que toma dos valores enteros. Cuando el programa principal ejecuta esta función, los argumentos ya están entre paréntesis, por lo que "a" será igual a dos y "b" será igual a 1. La función se ejecutará y "c" será igual a 3 .

int c= 0 ; void sum(int a, int b) ( c= a+ b; ) void main(void ) ( sum(2 , 1 ) ; )

intc=0; void sum(int a, int b) ( c=a+b; ) void main(void) ( sum(2,1); )

Una de las funciones similares que se encuentran con frecuencia es la traducción del cursor en la pantalla LCD lcd_gotoxy(0,0); que, por cierto, también toma argumentos: coordenadas x e y.

Otra forma de usar la función, cuando devuelve un valor, ahora ya no será nulo, mejoremos el ejemplo anterior de la función de sumar dos números:

int c= 0 ; int sum(int a, int b) ( return a+ b; ) void main(void ) ( c= sum(2 , 1 ) ; )

intc=0; int sum(int a, int b) ( return a+b; ) void main(void) ( c=sum(2,1); )

El resultado será el mismo que la última vez c=3, pero tenga en cuenta que estamos asignando el valor de una función a la variable "c", que ya no es nula, sino que devuelve la suma de dos números del tipo int. Por lo tanto, no estamos atados a una variable específica "c", lo que agrega flexibilidad en el uso de funciones. Un ejemplo simple de una función de este tipo es la lectura de datos ADC, la función devuelve el valor medido result=read_adc();. Esto concluye las funciones.

Ahora pasemos a las matrices. Una matriz son variables enlazadas. Por ejemplo, tiene una tabla de senos con varios puntos, no creará variables int sinus1=0; int sinus2=1; etc una matriz se utiliza para esto. Por ejemplo, puede crear una matriz de tres elementos como esta:
int seno=(0,1,5);
los corchetes indican el número total de elementos de matriz. Puede asignar el valor del tercer elemento a la variable "c" de esta manera:
c=seno;
Tenga en cuenta que la numeración de los elementos de la matriz comienza desde cero, es decir, "c" se convierte en cinco. ¡Esta matriz no tiene ningún elemento sinusoidal!
A un elemento individual se le puede asignar un valor como este:
seno=10;

Es posible que ya haya notado que no hay variables de cadena en CodeVision. Esos. no puede crear una cadena variable hola="hola"; para hacer esto, deberá crear una matriz de caracteres individuales.

lcd_putchar(hola); lcd_putchar(hola); lcd_putchar(hola);

etc
Resulta bastante engorroso, aquí los ciclos vienen al rescate.
Por ejemplo, mientras que el bucle

while(PINB.0!=0) ( )

Mientras el botón no esté presionado, no haga nada: ejecute un ciclo vacío.

Otra versión del bucle for

ent yo; para (i= 0 ; yo< 6 ; i++ ) { lcd_putchar(hello[ i] ) ; }

ent yo; para(i=0;i<6;i++) { lcd_putchar(hello[i]); }

El significado es exactamente el mismo que para while, solo se agrega la condición inicial i=0 y la condición se ejecuta en cada bucle i++. El código dentro del ciclo se simplifica tanto como sea posible.

Una vez que haya escrito su programa, el código fuente se compila y, si no hay errores, recibirá el codiciado firmware en la carpeta del proyecto. Ahora puede flashear el microcontrolador y disfrutar del funcionamiento del dispositivo.

No intente utilizar inmediatamente ciclos, matrices y funciones en su firmware. Su tarea principal es hacer que el firmware funcione, así que hágalo como le resulte más fácil, no preste atención al tamaño del código. Llegará un momento en el que no solo querrás escribir código que funcione, sino escribirlo de manera hermosa y compacta. Entonces será posible adentrarse en la naturaleza del lenguaje C. Para aquellos que quieren dominar todo, recomiendo de inmediato el libro "Cómo programar en C" una vez más, hay muchos ejemplos y tareas. Instale Visual Studio, cree una aplicación de consola win32 y practique allí todo lo que desee.


La radioafición moderna no se puede imaginar sin microcontroladores, y esto es obvio. En las últimas décadas, los microcontroladores de diversos fabricantes se han generalizado en diversos campos de la actividad humana. A menudo se pueden encontrar en los dispositivos y diseños más inesperados. Somos testigos de la informatización y automatización de los procesos que nos rodean. La verdad es que sin conocimientos básicos de programación, se ha vuelto casi imposible crear dispositivos competitivos modernos...

Si está leyendo este artículo, probablemente desee comprender cómo funcionan los microcontroladores, y lo más probable es que tenga preguntas:

4. ¿Qué literatura estudiar?

Tratemos de responder a estas preguntas.

1. ¿Qué microcontrolador elegir para trabajar?

Los microcontroladores de 8 bits son muy populares entre los radioaficionados. FOTO Tecnología de microchips y AVR Atmel, 16 bits MSP430 empresas de TI, así como microcontroladores de 32 bits, arquitecturas BRAZO.

En la industria, de forma un poco diferente, el primer lugar por un amplio margen lo ocupa Electrónica Renesas en el segundo Escala libre, en el tercero Samsung, entonces vete Pastilla Y TI, luego todos los demás.
La popularidad está determinada por el precio y la disponibilidad, la disponibilidad de información técnica y el costo del soporte de software juegan un papel importante.

Estudiaremos microcontroladores AVR de 8 bits, familias Serie ATMEGA 8 y 16. La elección estuvo determinada, nuevamente, por la disponibilidad, la presencia de muchos desarrollos de aficionados y una gran cantidad de material educativo. La presencia de una variedad de componentes incorporados y la funcionalidad de esta familia.

2. ¿Qué entorno de desarrollo debo usar para programar el microcontrolador seleccionado?

Se han creado varios entornos de desarrollo integrado (IDE, entorno de desarrollo integrado) para el AVR.
IDE es un sistema de herramientas de software utilizado por los programadores para desarrollar software (SW), que incluye:
editor de texto,
compilador y/o intérprete,
construir herramientas de automatización
depurador

Los más comunes AVRStudio, ATmelStudio, WINAVR, CodeVision, banco de trabajo integrado IAR.
Para escribir programas, usaremos la libre ATmelStudio IDE versión 6 y más alto.
Puede descargar Atmel Studio desde el sitio web oficial después de registrarse (¡el registro es absolutamente gratuito y no lo obliga a nada!)

ATmelStudio te permite crear proyectos y escribir programas tanto en ensamblador como en C.

Inicialmente, siempre hay una pregunta: ¿qué lenguaje de programación elegir para escribir programas efectivos?

Responderé simplemente: debe poder escribir al menos dos lenguajes ensamblador y C. El ensamblador es simplemente necesario cuando necesita escribir subrutinas y macros rápidas y compactas, varios controladores de dispositivos. Pero, cuando necesita crear un proyecto grande basado en algoritmos complejos, sin saber SI, se puede gastar mucho tiempo, especialmente durante la depuración, y si desea transferir a otra plataforma, como PIC18 o STM, puede hacerlo. convertirse en un problema irresoluble.
Además, ahora existen plataformas informáticas de hardware arduino, cuyo trabajo requiere conocimientos del lenguaje C++.
Por tanto, escribiremos programas tanto en ensamblador como en C.

Para ver visualmente el resultado de su trabajo, sin usar un soldador o una placa de prueba, simplemente instale el programa Proteo.

3. ¿Cómo flashear el controlador y qué dispositivos y accesorios adicionales se necesitan para un trabajo conveniente con ellos?

Usamos datagorian. Además, deberá comprar placas de prueba, una fuente de alimentación con un voltaje de salida de 5 voltios. Puede usarlo como fuente de alimentación con ondas bajas usando un diodo zener de 5 voltios.
Quizás, con el tiempo, Igor y yo ofrezcamos un proyecto para ensamblar una placa de depuración.

4. ¿Qué literatura estudiar?

Y aquí, por ejemplo:
Programación práctica de AVR en ensamblador. Revich, 2011
1000 y un circuito de microcontrolador Vol. 1-2. Ryumik, 2010-2011
10 dispositivos prácticos en MK AVR Libro 1-2. Kravchenko, 2008-2009
Manual de autoinstrucciones para desarrolladores de dispositivos en MK AVR. Belov, 2008
Familias MK AVR Tiny y Atmega. Efstifeev, 2008
CodeVisionAVR. Una guía para principiantes. Lébedev, 2008
Control por microprocesador de dispositivos, tiristores, relés. Belov, 2008
Interfaces analógicas MK. Mayordomo, Pelota, 2007
Creamos dispositivos en MK AVR. Belov, 2007
MK AVR en la práctica de la radioafición. Análisis completo de ATTINY2313. Belov, 2007
Intercambio de datos de red e inter-red con MK. Vamos, 2007
AVR MK. práctica para principiantes. Hartov, 2007
Aplicación de Esquemas AVR, algoritmos, programas. Baranov, 2006
Microcontroladores AVR. Curso introductorio. Mortón, 2006
Medida, control y regulación con AVR. Trompeta, 2006
Programación en C para AVR y PIC MK. Shpak, 2006
Diseño de dispositivos en MK. Belov, 2005
MK - es simple, volúmenes 1-3. Frunce, 2002-2003
El lenguaje de programación C, 2ª edición. Kernigan, Ritchie, 2009
Programación de microcontroladores ATMEL en el lenguaje de S. Prokopenko, 2012

5. ¿Dónde puedo hacer preguntas en línea y obtener respuestas específicas?

Puede hacer preguntas en nuestro foro o en cualquier otro donde se traten temas sobre microcontroladores. Lo principal en los foros es formular correctamente las preguntas para recibir respuestas claras. Las preguntas abstractas no son bienvenidas, y lo más probable es que recibas duras críticas en lugar de una respuesta, ¡o tu pregunta quedará sin atención!

Ahora echemos un vistazo más de cerca a nuestro microcontrolador favorito, el ATMEGA 8.

Microcontrolador AVR de bajo consumo y alto rendimiento de 8 bits
Arquitectura RISC progresiva
130 instrucciones de alto rendimiento, la mayoría de las instrucciones ejecutadas en un ciclo de reloj
32 registros de trabajo de propósito general de 8 bits
Funcionamiento totalmente estático
Acercándose a 16 MIPS (a 16 MHz) de rendimiento
Multiplicador de 2 ciclos incorporado

Programa no volátil y memoria de datos
Flash autoprogramable en el sistema de 8 KB
Proporciona 1000 ciclos de borrado/escritura
Sector adicional de códigos de arranque con bits de bloqueo independientes
Modo de lectura/escritura simultáneo (Read-While-Write) proporcionado
EEPROM de 512 bytes
Proporciona 100.000 ciclos de borrado/escritura
SRAM integrada de 1 KB
Bloqueo programable para proteger el software del usuario

Periféricos integrados
Dos temporizadores/contadores de 8 bits con preescalador independiente, uno con modo de comparación
Un temporizador/contador de 16 bits con preescalador independiente y modos de captura y comparación
Contador en tiempo real con generador separado
Tres canales PWM
Convertidor de analógico a digital de 8 canales (en paquetes TQFP y MLF)
6 canales con precisión de 10 bits
Convertidor de analógico a digital de 6 canales (en paquete PDIP)
4 canales con precisión de 10 bits
2 canales con precisión de 8 bits
Interfaz serie de 2 hilos orientada a bytes
USART serial programable
Interfaz serie SPI (maestro/esclavo)
Temporizador de vigilancia programable con oscilador incorporado separado
Comparador analógico incorporado

Funciones especiales del microcontrolador
Reinicio de encendido y detector de voltaje de apagado programable
Oscilador RC calibrado incorporado
Fuentes de interrupción internas y externas
Cinco modos de bajo consumo: inactivo, ahorro de energía, apagado, espera y reducción de ruido ADC

Pines y paquetes de E/S
23 líneas de E/S programables
Paquete PDIP de 28 derivaciones, paquete TQFP de 32 derivaciones y paquete MLF de 32 derivaciones

Tensiones de funcionamiento
2.7 - 5.5V (ATmega8L)
4,5 - 5,5 V (ATmega8)

Frecuencia de operación
0 - 8 MHz (ATmega8L)
0 - 16 MHz (ATmega8)

diferencias entre ATMEGA16 y 8
Flash autoprogramable en el sistema de 16 KB

Interfaz JTAG (compatible con IEEE 1149.1)
Capacidad de escaneo periférico compatible con el estándar JTAG
Soporte de depuración en línea mejorado
Programación a través de la interfaz JTAG: Flash, memoria EEPROM, puentes y bits de bloqueo

Cuatro canales PWM/PWM

Convertidor A/D de 8 canales y 10 bits
8 canales no balanceados
7 canales diferenciales (solo paquete TQFP)
2 canales diferenciales con ganancia programable de 1x, 10x o 200x (solo paquete TQFP)

Seis modos de apagado: inactivo, ahorro de energía, apagado, espera, espera extendida y reducción de ruido ADC

32 líneas de E/S programables

Paquete PDIP de 40 derivaciones y paquete TQFP de 44 derivaciones

AtmelStudio

Si recién está comenzando, debe descargar e instalar el programa AtmelStudio desde la página oficial atmel.com
Después de instalar el programa AtmelStudio, puede comenzar a crear un proyecto.
Proyecto- este es su programa que escribirá, depurará y actualizará, después de la compilación, en la memoria del microcontrolador.

Para crear un proyecto, debe abrir el programa, aparecerá una pantalla de inicio,

y se abrirá la página de creación del proyecto

Para crear un nuevo proyecto, haga clic en Nuevo proyecto...
En este caso, se abrirá una nueva ventana donde podrá seleccionar el lenguaje de programación, el nombre del proyecto, su ubicación, el nombre del paquete con los archivos del proyecto y la posibilidad de crear un directorio para su uso posterior en otros proyectos cruzados. . Para crear un proyecto donde programaremos en ensamblador, debe seleccionar - ensamblador, luego cambie el nombre del proyecto, su ubicación y seleccione está bien.

La siguiente ventana aparecerá

Escoger megaAVR, 8 bits y encontrar el microcontrolador que necesitamos, elegimos ATmega8. En el lado derecho de la pantalla de bienvenida aparece una lista de dispositivos que funcionan con este microcontrolador, uno de los cuales podemos conectar. Escoger está bien.

Aparece la página del editor de texto, que le permite editar y depurar el programa. Mientras la página está limpia, se indica la hora y la fecha de creación y el nombre del archivo del proyecto, nombre de usuario. Hay una ventana de dispositivo de entrada y salida adicional, una ventana de informe de compilación de programa. ahora nosotros


Podemos programar en ensamblador.
De igual forma, se crea un proyecto para programar en lenguaje C.

Hay muchas herramientas de desarrollo para programar microcontroladores AVR, sin embargo, el más popular, por supuesto, debe reconocerse como el paquete Estudio AVR. Hay una serie de razones para tal popularidad: este es un paquete gratuito desarrollado por la compañía ATMEL, combina un editor de texto, un ensamblador y un simulador. El paquete AVR Studio también se usa junto con el hardware de depuración. Este artículo analiza cómo trabajar con el paquete mediante ejemplos, que ayudarán a los programadores novatos a comprender rápidamente la interacción de los componentes individuales de AVR Studio.

En la siguiente parte del artículo, hablaremos sobre la depuración de programas escritos en lenguaje C en el entorno AVR Studio.

El paquete AVR Studio tiene un sólido historial de desarrollo, que se refleja en la cantidad de versiones existentes. A fines de 2003, se lanzó la versión 4.08, que tiene varias adiciones útiles, y a principios de 2004, se lanzó una actualización (Service Pack 1), que agrega soporte para controladores AVR de tercera generación de la familia ATmega48. La producción de chips de esta familia está prevista para el segundo semestre de 2004.

El kit de distribución del paquete y el Service Pack se pueden descargar de www.atmel.com o puede obtener un CD con este kit de distribución del distribuidor ruso de ATMEL.

Es conveniente considerar el trabajo del paquete AVR Studio en cualquier programa específico. Como ilustración, consideraremos crear un proyecto para un programa simple que encenderá dos LED a la vez. Para mayor precisión, tomemos un microcircuito atmega128 y conecte dos LED a los pines 31 y 32 (estos son los bits 6 y 7 del puerto D del chip ATmega128). Controladores AVR tienen potentes etapas de salida, la corriente típica de cada salida es de 20 mA, la corriente de salida máxima es de 40 mA, y esto se aplica tanto a la corriente de entrada como a la de salida. En nuestro ejemplo, los LED están conectados mediante ánodos a las salidas del controlador y los cátodos están conectados a tierra a través de resistencias de extinción. Esto significa que el LED se enciende aplicando un "1" al pin del puerto correspondiente. El diagrama esquemático se muestra en la figura. El diagrama también muestra dos botones que se utilizarán en uno de los programas.

Aquí es apropiado hacer una pequeña digresión sobre la elección del tipo de microcircuito para el ejemplo más simple. De hecho, a primera vista puede parecer extraño por qué se necesita un cristal tan potente en un paquete de 64 pines cuando un microcircuito de 8 pines es suficiente. entiny12? Sin embargo, hay lógica en este enfoque. Se sabe que casi cualquier controlador AVR se basa en el mismo núcleo. En general, los controladores difieren en la cantidad de memoria, la cantidad de puertos de E/S y el conjunto de módulos periféricos. Características de cada controlador específico: vinculación de nombres lógicos de registros de E / S a direcciones físicas, direcciones de vectores de interrupción, definiciones de bits de puerto, etc. se describen en los archivos .inc que se incluyen con el paquete AVR Studio. Por lo tanto, utilizando un tipo específico de cristal, es posible depurar el programa tanto para él como para cualquier cristal más joven. Además, si usa el cristal más antiguo como chip de depuración, hoy es ATmega128, puede depurar un programa para casi cualquier controlador AVR, solo necesita no usar recursos de hardware que el microcontrolador de destino no tiene. Así, por ejemplo, es posible depurar un programa en el ATmega128 que se ejecutará en entiny13. En este caso, el código fuente seguirá siendo prácticamente el mismo, solo cambiará el nombre del archivo incluido de 128def.inc a tn13def.inc. Este enfoque también tiene sus ventajas. Por ejemplo, se pueden usar puertos de E/S "adicionales" para conectar indicador LCD, al que puede generar información de depuración. O use un emulador en circuito que se conecte al puerto JTAG del chip ATmega128 (el controlador ATtiny13 no tiene ese puerto). Por lo tanto, puede usar la única placa de depuración en la que está instalado el controlador AVR "superior" para depurar cualquier sistema desarrollado recientemente, naturalmente, también basado en microcontroladores AVR. Una de estas placas se llama AS-megaM. Fue ella quien se utilizó para crear los programas de ejemplo que se dan en el artículo. Este es un controlador universal de placa única basado en el chip ATmega128, que contiene RAM externa, dos puertos RS-232, puerto para conectar indicador LCD, programador en circuito y emulador EN JTAG HIELO. La placa también tiene un lugar para desoldar el chip FLASH-ROM de la serie AT45 en los casos TSOP32/40/48 y DAC de dos canales de la serie AD5302/ AD5312/ AD5322. Ahora, después de explicar las razones para usar un monstruo AVR para encender un par de LED, podemos continuar.

Al programar en el entorno AVR Studio, debe seguir la secuencia estándar de acciones:

  • Compilacion
  • La creación del proyecto comienza seleccionando la barra de menú Proyecto\Nuevo proyecto. En la ventana "Crear nuevo proyecto" que se abre, debe especificar el nombre del proyecto (en nuestro caso, muestra1) y el nombre del archivo de inicialización. Después de hacer clic en el botón "Siguiente", se abre la ventana "Seleccionar plataforma y dispositivo de depuración", donde se seleccionan la plataforma de depuración (simulador o emulador) y el tipo de microcontrolador.

    Puede elegir uno de los emuladores en circuito propuestos, tenga en cuenta que cada emulador tiene su propia lista de microcircuitos compatibles. Para este ejemplo, elegimos el simulador AVR y el chip ATmega128 como plataforma de depuración. Después de presionar el botón "Finalizar", nuestros ojos verán las ventanas de trabajo reales del paquete AVR Studio, que aún están vacías. El texto fuente del programa debe colocarse en la ventana derecha. Esto se puede hacer de dos maneras, ya sea escribiendo todo el texto directamente en la ventana del editor o cargando un archivo existente. A continuación se muestra el texto completo del programa más simple con comentarios.

    ; Ejemplo "control de LED"; escrito para placa de depuración AS-MegaM; Frecuencia del oscilador maestro 7,37 MHz; Los LED están conectados a los pines PD6 y PD7 y a través de resistencias, a un cable común. ; conexión del archivo de descripción de E/S del chip ATmega128 .incluye "m128def.inc" ; comienzo del programa comienzo: ; la primera operación es la inicialización de la pila; si esto no se hace, entonces una llamada a una subrutina o interrupción; no devolverá el control; el puntero de fin de pila se establece en la última dirección RAM interna - RAMEND ldi r16,low(RAMEND) out spl,r16 ldi r16,high(RAMEND) out sph,r16 ; para controlar los LEDs conectados a los pines PD6 y PD7, ; es necesario declarar estas conclusiones como vacaciones. ; para ello se escribe "1" en los bits correspondientes del registro DDRD (DataDiRection) ldi r16,(1<<6) | (1<<7) out DDRD,r16 ; основной цикл программы loop: ldi r16,(1<<6) ; светится один светодиод out PORTD,r16 rcall delay ; задержка ldi r16,(1<<7) ; светится второй светодиод out PORTD,r16 rcall delay ; задержка rjmp loop ; повторение цикла; процедура задержки; примерно полсекунды при частоте 7,37 МГц; три пустых вложенных цикла соответственно delay: ldi r16,30 ; 30 delay1: ldi r17,200 ; 200 delay2: ldi r18,200 ; и еще 200 итераций delay3: dec r18 brne delay3 dec r17 brne delay2 dec r16 brne delay1 ret ; возврат в главную программу

    Un proyecto puede constar de varios archivos, con un archivo designado como el principal. Todas las operaciones se realizan cómodamente con el botón contextual del ratón. Después de conectar el archivo fuente, las ventanas se ven así.

    Un proyecto se compila usando el comando \Project\Build o presionando el botón F7. El proceso de compilación se muestra en la ventana "Salida". Esta ventana se puede "sacar" con el comando \View\Output.

    En principio, ya hemos recibido un archivo de salida en formato .hex, que ya se puede cargar en el microcircuito y observar el parpadeo de los LED. Sin embargo, el propósito del artículo es mostrar el ciclo completo de trabajo en el entorno de AVR Studio, por lo que pasamos a la etapa de depuración. Esto se hace con el comando \Debug\Start Debugging.

    Ahora establecemos la frecuencia del cuarzo en 7,3728 MHz en la ventana "Opciones del simulador" para medir con precisión el tiempo de ejecución del programa.

    El resto de las opciones deben dejarse sin cambios. Ahora puede recorrer el programa usando el mouse o la tecla F11.

    El paquete AVR Studio contiene poderosas herramientas para ver y editar el estado de los registros internos y los puertos de entrada/salida del microcontrolador que se está depurando, así como el tiempo de ejecución del programa. Se accede a ellos a través de la ventana “I/O”.

    De hecho, la cantidad de información disponible a través de las ventanas gráficas de AVR Studio es tan amplia que, para lograr la máxima comodidad, la computadora debe usarse en una configuración de dos monitores.

    Para depurar nuestro ejemplo, para acceder a los bits del puerto D, expanda la línea I/O ATMEGA128 y luego la línea PORTD. Los tres registros para este puerto ahora están visibles, PORTD, DDRD y PIND. Para ver los campos Valor, Bits y Dirección, deberá expandir el borde derecho de la ventana, mientras empuja la ventana con el código fuente del programa.

    Ahora, pasando el programa en modo paso a paso, puede ver el cambio en los estados actuales de estos registros en el campo Bits. Es posible cambiar rápidamente el estado de cualquier bit de los registros del puerto, y esto se puede hacer escribiendo un nuevo código en el campo Valor o directamente haciendo clic en el bit de registro deseado.

    Para ejercicios independientes se propone el siguiente programa, que se diferencia del anterior en que dos botones controlan el encendido de los LEDs.

    ; Ejemplo "Control de LEDs desde botones"; escrito para placa de depuración AS-MegaM; Los LED están conectados a los pines PD6 y PD7 y a través de resistencias, a un cable común. ; botones - en PE4 y PE5 .incluir "m128def.inc" ; inicio del programa principal: ; inicialización de pila ldi r16, bajo (RAMEND) fuera spl, r16 ldi r16, alto (RAMEND) fuera sph, r16; inicializacion de leds ldi r16,(1<<6) | (1<<7) out DDRD,r16 ; инициализация выводов, к которым подключены кнопки (на вход) ; внутренние подтягивающие резисторы подключены; для этого в PORTE нужно установить соответствующие биты в единицы ldi r16,(1<<4) | (1<<5) out PORTE,r16 ; а в DDRE - в нули ldi r16,0 out DDRE,r16 ; бесконечный цикл forever: in r16,PINE ; теперь в r16 находится текущее "состояние" кнопок com r16 ; кнопка "нажимается" нулем, поэтому инвертируем регистр lsl r16 ; переносим биты 4,5 в позиции 6,7 lsl r16 ; и обновляем "показания" светодиодов andi r16,(1<<6) | (1<<7) out PORTD,r16 rjmp forever ; цикл выполняется бесконечно

    Por lo tanto, en el ejemplo de los programas más simples, se muestran algunas características del paquete AVR Studio. Debe entenderse que este es solo el primer conocimiento, lo que le permite acostumbrarse rápidamente a los comandos básicos del paquete. Mientras tanto, las posibilidades del paquete en consideración son mucho más amplias. Por ejemplo, aquí puede depurar programas escritos en lenguajes de alto nivel. En particular, el compilador C de ImageCraft usa el depurador AVR Studio "como un nativo". Para ello, al compilar el código fuente, debe configurar la opción para generar un archivo de salida en un formato compatible con AVR Studio. En este caso, es posible depurar en los códigos fuente.

    Otra de las muchas características del paquete AVR Studio es la posibilidad de conectar programas externos. Por ejemplo, para garantizar que se invoque el shell del programador en circuito AS2, se deben realizar varias operaciones simples.

    En el menú Herramientas de la ventana principal de AVR Studio, seleccione el elemento Personalizar;

    En la ventana Personalizar, seleccione el elemento Herramientas;

    Al hacer doble clic en el botón del mouse o presionar Insertar en el teclado, agregue un nuevo comando a la lista y asígnele el nombre "Programador AS2";

    Especifique la ruta al archivo ejecutable del programador ingresándolo directamente en el campo de entrada "Comando", o haciendo clic en el botón "..." a la derecha de este campo;

    Ahora en el menú Herramientas hay un elemento "Programador AS2".

    Las herramientas del paquete AVR Studio 4.08 le permiten conectar programas auxiliares: complementos. El primer complemento para AVR Studio es un programa de edición de gráficos que simplifica el proceso de inicialización de LCD, que puede ser controlado directamente por el controlador ATmega169 AVR. El tamaño lógico máximo del indicador LCD es de 100 segmentos, a cada elemento del indicador se le asigna un bit en un registro especial del controlador. Para simplificar el procedimiento rutinario de asignación de ciertos bits a cada segmento, se puede utilizar el programa anterior.

    Durante una visita a la "patria" de AVR, la oficina noruega de ATMEL, uno de los autores del artículo habló con Lars Kvenild, jefe del equipo de programación que creó y mantiene el paquete AVR Studio. Este hombre, un programador clásico, con barba, suéter y calzado con sandalias y calcetines, habló sobre las perspectivas para el desarrollo del paquete. La próxima versión (4.09) incluirá una interfaz para un nuevo emulador en circuito: JTAGICE mkII (también llamado AT JTAGICE2), que reemplazará a AT JTAGICE en la segunda mitad del año. Este emulador tiene dos diferencias significativas. Por un lado, se ha agregado soporte para una nueva interfaz de depuración de un solo cable para controladores AVR de gama baja, debugWIRE. ¡Esta interfaz es interesante porque no necesita pines adicionales del microcontrolador para su trabajo, ya que usa el pin de reinicio del microcontrolador para el intercambio! Por otro lado (esta expresión se puede entender literalmente), el emulador AT JTAGICE2 finalmente tendrá una interfaz USB para comunicarse con una computadora.

    Literatura

    1. Materiales de la jornada técnica Formación Técnica AVR. Atmel. Noruega. diciembre de 2003.
    2. Nikolai Korolev, Dmitry Korolev Microcontroladores AVR de segunda generación: herramientas para desarrolladores. // Componentes y tecnologías, 2003 No. 7
    3. Microcontroladores AVR de segunda generación: nuevas capacidades de hardware // Componentes y tecnologías. 2003. Nº 4.
    4. Nikolái Korolev, Dmitry Korolev. Microcontroladores AVR: grande en pequeño. //Esquematécnica", 2001, No. 5
    5. Nikolái Korolev, Dmitry Korolev. Microcontroladores AVR: software // Componentes y tecnologías, 2000. No. 4.
    6. Nicolás Korolev. AVR: hardware para desarrolladores // Componentes y tecnologías, 1999 No. 1
    7. Nicolás Korolev. Microcontroladores RISC de ATMEL // Chip-News 1998, No. 2
    8. Nikolai Korolev, Dmitry Korolev AVR: nuevos microcontroladores RISC de 8 bits de ATMEL // Microprocessor Review, 1998, No. 1

    Ministerio de Educación y Ciencia de la Federación Rusa

    institución educativa estatal

    educación profesional superior

    "ESTADO DE SAN PETERSBURGO

    UNIVERSIDAD TÉCNICA DEL MAR»

    E. V. Korotitsky, Yu. E. Korotitskaya

    Lenguaje C básico para microcontroladores avr

    Tutorial

    San Petersburgo

    1. Lenguaje C básico para microcontroladores avr

    El lenguaje Universal C se desarrolló como una herramienta para escribir el entorno operativo UNIX.

    El lenguaje C admite un paradigma de programación orientado a procedimientos, es decir Un paradigma es un conjunto interconectado de procedimientos.

    El lenguaje C se caracteriza por la concisión, un conjunto moderno de construcciones de control de flujo, estructuras de datos y un amplio conjunto de operaciones.

      1. El preprocesador del lenguaje C y sus comandos

    Un preprocesador (macroprocesador) es un componente del lenguaje C que procesa el código fuente de un programa antes de que pase por el compilador. El preprocesador lee líneas de texto y realiza acciones especificadas por líneas de comando. Si el primer carácter que no es un espacio en blanco en una línea es #, entonces el preprocesador considera esa línea como una línea de comando. Las líneas de comando se llaman directivas preprocesador.

    El preprocesador del compilador CodeVisionAVR tiene varias directivas. En mesa. 1 da una breve descripción de ellos.

    Pestaña. 1 - Directrices del preprocesador del compilador CodeVisionAVR

    Directiva

    Propósito

    Solía ​​estar incluido en el programa.

    otro archivo

    Sirve para reemplazar algunas unidades léxicas del lenguaje C por otras, así como para generar macros

    Se usa para anular el efecto de la directiva #define

    Se utiliza para la compilación condicional

    Se utiliza para cambiar las macros integradas _LINE_y _FILE_

    Le permite detener la compilación y mostrar un mensaje de error

    Se utiliza para incluir código ensamblador en el programa fuente.

    Habilita directivas de compilador especiales

    TODAS las directivas del preprocesador comienzan con #. NO coloque un punto y coma después de las directivas del preprocesador.

        1. directiva #include

    Ejemplo:

    Directiva # incluir

    #incluir "nombre de archivo" y #incluir<имя_файла>

    Nombre del archivo consta de un nombre de archivo.

    Directiva # incluir es ampliamente utilizado para incluir los llamados archivos de cabecera (archivos con extensión . h), que contiene definiciones de dispositivos periféricos y vectores de interrupción del microcontrolador utilizado, prototipos de funciones de biblioteca, prototipos de funciones definidas por el usuario, etc.

    #include "nombre de archivo.h"

        1. Directivas #define, #undef

    Directiva # definir sirve para sustituir algunas unidades léxicas del lenguaje C (constantes, palabras clave, operadores o expresiones) de uso frecuente por otras, las denominadas identificadores Los identificadores que reemplazan texto o constantes numéricas se denominan constantes nombradas. Los identificadores que reemplazan fragmentos de programa se denominan definiciones de macros, y las definiciones de macro pueden tener argumentos.

    Directiva # definir tiene dos formas sintácticas:

    #define el texto del identificador

    #define el texto del identificador (lista de parámetros)

    Antes de compilar el programa, el preprocesador según la directiva # definir reemplazará todos los identificadores encontrados en el programa con su texto correspondiente.

    Ejemplo:

    #define A 15 #define B (A+20) // Estas directivas serán reemplazadas en el texto del programa

    cada identificador A con el número 15, y cada identificador B con la expresión (15+20) junto con los paréntesis que lo rodean.

    Ejemplo:

    #define X(a,b,c) ((a)*(b)-(c)) // El preprocesador reemplazará el fragmento de acuerdo con esta directiva Y=X(k+m,k-m,n); por fragmento