Unidad 2: Programación C (ATmega)
Ing. Oscar Alonso Rosete Beas
Semana 22 Marzo Rev:3 ciclo 2021-1
oscarrosete.com
oscarrosete.com
2.1. Introducción a los lenguajes de programación en microcontroladores.
2.2. Arquitectura y lenguaje de programación Ensamblador.
2.3. Modos de direccionamiento.
2.4. Memoria RAM.
2.5. Lenguaje C.
oscarrosete.com
3.1. Puertos paralelo de Entrada/Salida.
3.2. Manejo de Temporización básica y contadores.
3.3. Interrupciones.
3.4. Puertos Seriales.
3.5. Convertidores A-D y D-A.
oscarrosete.com
oscarrosete.com
Comments
Los comentarios puede tener las siguientes formas:
// [Texto]
/*
Texto
Texto continua
*/
oscarrosete.com
Continuación de líneas
Como en lenguaje C, las lineas del codigo fuente pueden continuarse al dejar como el ultimo caracter en la linea como una diagonal (\).
Decimal (default) | 10 |
---|---|
Hexadecimal | 0x0a |
Binario | 0b00001000 |
Octal | 077 |
oscarrosete.com
Puedes forzar a una constante a ser Long o unsigned integer agregando una secuencia de uno o mas caracteres al finalizar la constante.
U o u para unsigned integer
l o L para Long
Por ejemplo 45U es de tipo unsigned int.
45UL es de tipo unsigned long int
45ull es de tipo unsigned long long int
Extraído de https://gcc.gnu.org/wiki/avr-gcc
oscarrosete.com
AVR GCC | Bits | Rango | c99 alternate |
---|---|---|---|
signed char | 8 | -128 a127 | int8_t |
unsigned char | 8 | 0 a 255 | uint8_t |
short int/short/signed short int/signed short | 16 | -32768 a 32767 | |
unsigned short int | 16 | 0 a 65535 | |
unsigned int | 16 | uint16_t | |
unsigned long | 32 | uint32_t |
También existen: signed int, long int, unsigned long int, long long int, unsigned long long int. Así como tipos de datos alternos presentados en el estandar c99 y disponibles en GCC. u para definir si tiene signo, #_t numero de bits, int para diferenciar entero de decimal.
Ejemplo de declaración y definición de variable.
unsigned int bar=42;
oscarrosete.com
oscarrosete.com
El operador & (bitwise AND) in C toma 2 números como operandos y realiza la operación AND con cada bit de los 2 números. El resultado de una operación And es 1 si ambos bits son 1.
El operador | (bitwise OR) en C toma 2 números como operandos y realiza la operación OR con cada bit de los 2 números. El resultado de la operación es 1 si cualquiera de los bits es 1.
El operador ^ (bitwise XOR) en C realiza la operación XOR con cada bit. El resultado es 1 si los 2 bits son diferentes.
El operador ~ (bitwise NOT) en C toma un número y realiza la inversión de todos los bits en el.
oscarrosete.com
El operador << (left shift) en C hace un desplazamiento a la izquierda de los bits del primer operando, el segundo operando decide la cantidad de espacios a desplazar.
El operador>> (right shift) en C hace un desplazamiento a la derecha de los bits del primer operando, el segundo operando decide la cantidad de espacios a desplazar.
Ejemplo
(1<<4)= 0001 0000
Palabras clave
De manera similar al lenguaje ensamblador se puede hacer referencia a los registros de los puertos de entradas y salidas haciendo utilizacion de las palabras claves DDR,PIN,PORT.
Ejemplos para el ATmega328p:
DDRB,DDRC,DDRD.
PORTB,PORTC,PORTD.
PINB,PINC,PIND
PORTB=2;
PORTC=0b00010000
oscarrosete.com
Palabras clave
De manera similar al lenguaje ensamblador se puede hacer referencia a los registros de los puertos de entradas y salidas haciendo utilizacion de las palabras claves DDR,PIN,PORT.
Referencia a la posición de los bits específicos del microcontrolador:
PORTB4=5 ; PINC3, DDRD2;
Ejemplo:
(1<<PORTB4)=(1<<4)= 0001 0000
DDR2=1 es una operación incorrecta ya que DDR2 es un número, equivalente a escribir 2=1
oscarrosete.com
Preprocessor Directives
AVRGCC considera todas las lineas que comienzan con # como su primer caracter una directiva de preprocesamiento.
Para profundizar dar click en la imagen inferior.
oscarrosete.com
Establecer un bit (asignar un 1 lógico):
DDRD = DDRD | (1 << 4);
Vaciar un bit (asignar un 0 lógico):
DDRD &= ~(1<<mySwitch);
Alternar el valor de un bit:
DDRD ^= (1<<mySwitch);
Establecer un conjunto de bits (asignar un 1 lógico):
DDRD = DDRD | (1 << 4)| (1<<3);
oscarrosete.com
Lectura de bit individual
status=(PIND & (1<<mySwitch) != 0)
Lectura de múltiples bits
if(!(PIND & (1 << PORTD4)) || !(PIND & (1 << PORTD5)) || !(PIND & (1 << PORTD6)) || !(PIND & (1 << PORTD7)))
oscarrosete.com
oscarrosete.com
Consideraremos 10 ms de transitorio para eliminar el rebote
oscarrosete.com
Propuesta 1
Detect first edge from high to low→ do nothing for 10 ms(delay) → read the switch again and if it's low → continue on.
same on button release as long as you see high edge→ 10 ms delay→ read switch, it is high? → Continue on
oscarrosete.com
oscarrosete.com
oscarrosete.com
oscarrosete.com
oscarrosete.com
oscarrosete.com
oscarrosete.com
oscarrosete.com
oscarrosete.com
Terminals mode
Components mode
oscarrosete.com
oscarrosete.com
Simulación de encendido de LED utilizando ATmega328p programado en lenguaje ensamblador.
Simulación del mismo código en software libre Emulare
oscarrosete.com
oscarrosete.com
Los pins/terminales son cables conectados al microcontrolador.
Son la interfaz del microcontrolador
Los voltajes de los pines son controlados a partir de un "sketch"
oscarrosete.com
oscarrosete.com
Los pins/terminales de salida son controlados por el Arduion.
El voltaje es determinado a partir del "sketch"
Otros componentes pueden ser controlados a través de sus salidas.
oscarrosete.com
Los pins/terminales de entrada son controlados por otros componentes.
Arduino lee el voltaje en esas terminales
Le permite responder a eventos e información.
Digital vs Analógico
Algunos pins son únicamente digitales.
Algunos pines pueden ser entradas analógicas