Timer1 en modo FastPWM para un Servomotor CLK
8MHz
Prescaler
8
TOP
19,999
TCCR1A COM1A1 COM1A0 COM1B1 COM1B0 7 6 5 4
FOC1A F OC1A 3
FOC1B 2
WGM11 1
WGM10 0
CS12 2
CS11 1
CS10 0
TCCR1B ICNC1 7
ICES1 6
5
WGM13 4
WGM12 3
Para establecer el Timer1 en modo FastPWM donde TOP = ICR1, se necesitan establecer los siguientes bits: WGM13 – 1 WGM12 – 1 WGM11 – 1 WGM10 – 0
Para establecer el prescaler en 8 se deben establecer los CS10..12 de esta manera: CS12 – 0 CS11 – 1 CS10 – 0
ICR1 debe contener el valor TOP de 19 999, por lo tanto se deben de inicializar los siguientes registros como se indica: ICR1H – 0b01001110 ICR1L – 0b00011111
Ahora el Timer1 está configurado para poder proveer hasta dos salidas PWM en los pines OC1A y OC1B. Para activarlas, el puerto D tiene que estar configurado como salida. Además es necesario establecer los registros OCR1xH y OCR1xL (donde x es A o B dependiendo del canal a usar). Para calcular los valores a cargar a estos registros se usará la siguiente fórmula:
Donde V va de 1 a 2 (puede variar dependiendo del servo).
Finalmente para inicializar el PWM se deben de cambiar los bits 7 y 6 (para el canal A) o el 5 y 4 (para el canal B) en modo non-inverting (10).
ADC (Analog to Digital Converter) ADMUX (ADC Multiplexer Selection) REFS1 7
REFS0 6
ADLAR 5
MUX4 4
MUX3 3
MUX2 2
MUX1 1
MUX0 0
Los bits REFS1-0 del registro determinan como se tomará el voltaje de referencia, como describe la siguiente tabla. Valor de bits 00
Modo de operación
01
AVCC with external capacitor at AREF pin Reserved
10 11
AREF, internal Vref turned off
Internal 2.56V Vref with external capacitor at AREF pin
Los bits MUX4-0 sirven para configurar el pin del Puerto A que tomaremos como entrada para realizar la conversión con el ADC. Para la lectura de un pin sin ninguna comparación se inicializa esos bits en el número del pin del puerto A que se desea usar (por ejemplo si se va a usar el pin 4 se debe de introducir 00100 a los bits del registro, el cual equivale a un cuatro en binario).
El bit ADLAR determina cómo quedará almacenado el resultado de la conversión en los registros ADCH y ADCL, 0 para alinearlo a la derecha y 1 para alinearlo a la izquierda.
SFIOR (Special Function Input/Output Register) ADTS2 7
ADTS1 6
ADTS0 5
4
ACME 3
PUD 2
PSR2 1
PSR10 0
El ADC funciona en 2 modos diferentes:
Free running – El ADC se mantiene realizando conversiones constantemente y actualizando cada vez el contenido de registro de datos del ADC. “
”
Single Conversion – Al utilizar este modo de operación, cada una de las conversiones debe ser inicializada por algún evento (trigger). “
”
Los bits ADTS2-0 del registro establecen el modo de operación del ADC, como lo describe la siguiente tabla. Si se desea emplear algún trigger (diferente al free running mode) el bit ADATE del registro ADCSRA deberá ser configurado en 1. ADTS2-0
Trigger Source
000
Free Running Mode
001
Analog Comparator
010
External Interrupt Request 0
011
Timer/Counter0 Compare Match
100
Timer/Counter0 Overflow
101
Timer/Counter1 Compare Match B
110
Timer/Counter1 Overflow
111
Timer/Counter1 Capture Event
ADCSRA (ADC Control and Status Register) ADEN 7
ADSC 6
ADATE 5
ADIF 4
ADIE 3
ADPS2 2
ADPS1 1
ADPS0 0
El bit ADEN (ADC Enable) del registro determina si el ADC estará activado (1) o desactivado (0).
El bit ADSC (ADC Start Conversion) se usa cuando el ADC está en modo Free Running. Se le pone un 1 para indicarle el inicio de la primera conversión.
El bit ADATE (ADC Auto Trigger Enable) activa el trigger para iniciar la conversión.
El bit ADIF (ADC Interrupt Flag) es una bandera que se activa cuando se genera una interrupción de una conversión, y se desactiva con el reti.
El bit ADIE (ADC Interrupt Enable), si está activo, genera una interrupción cada vez que se termina una conversión.
Los bits ADPS2-0 (ADC Prescaler Select Bits) determinan el prescaler que se empleará para dividir la frecuencia de reloj del microprocesador.
USART (Universal Synchronous and Asynchronous serial Receiver and Transmitter) El USART del ATmega8535 puede funcionar de cuatro modos diferentes según la configuración de su reloj: Normal Asíncrono Asíncrono de doble velocidad Síncrono Maestro Síncrono Esclavo
UDR – USART I/O DATA REGISTER Este registro es utilizado como buffer para transmisión o recepción, es decir que en este registro deben ponerse los datos que se desea enviar por el serial, o bien pueden leerse los datos recibidos (este buffer únicamente puede ser leído o modificado cuando la bandera UDRE del registro UCSRA está en 1. Si se trata de escribir un dato y la bandera no está habilitada el dato será ignorado. Si se escribe un dato, este es almacenado en el registro de transmisión serial y será enviado a través del pin TxD. El buffer de recepción consiste en un FIFO de dos niveles, el cual cambiará de estado cada vez que se acceda al buffer, es por ello que resulta importante no usar instrucciones como SBI o CBI en este registro. Y debe tenerse también cuidado en el uso de instrucciones como SBIC o SBIS, puesto que también cambiarán el contenido del FIFO.
UCSRA – USART CONTROL AND STATUS REGISTER A RXC 7
TXC 6
UDRE 5
FE 4
DOR 3
PE 2
U2X 1
MPCM 0
El bit RXC (USART Receive Complete) del registro es una bandera que estará activa cuando haya datos sin leer en el buffer de recepción, y se limpiará cuando los datos hayan sido leídos. La bandera puede ser empleada para activar la interrupción de Recepción. El bit TXC (USART Transmit Complete) es una bandera que se activa cuando la totalidad de los datos han sido enviados y no hay datos nuevos en el buffer de transmisión. Se
limpia automáticamente cuando la interrupción de transmisión se ejecuta o puede limpiarse escribiéndole un 1. Esta bandera puede generar una interrupción.
El bit UDRE (USART Data Register Empty) es una bandera que indica que el registro de transmisión UDR está listo para recibir nuevos datos, si UDRE es 1, el buffer está vacío y por lo tanto pueden enviarse nuevos datos. Esta bandera puede generar una interrupción. El bit FE (Frame Error) se activa cuando existe un error en los datos que se reciben. El bit DOR (Data OverRun) se activa cuando se detecta un “Overrun”. Esto ocurre cuando el buffer de recepción está lleno y hay un byte en espera de ser recibido. EL bit PE (Parity Error) se activa cuando se detecta un error de paridad en la recepción (solamente funciona si el chequeo de paridad se encuentra habilitado (UPM1 = 1)). El bit U2X (Double the USART Transmission Speed) funciona solamente cuando se está empleando la transmisión asíncrona, y debe quedar como 0 cuando se está empleando la operación síncrona. Si el contenido de este bit es 1, se reducirá el divisor para la tasa de transferencia de datos de 16 a 8, lo cual producirá una transmisión asíncrona al doble de velocidad. Con el bit MPCM (Multi-processor Communication Mode) se puede habilitar el modo de multi-procesadores, de manera que todas las señales que se reciban y que no contengan la información relativa a la dirección de la que provienen serán ignoradas (más información en la página 162 del datasheet).
UCSRB – USART CONTROL AND STATUS REGISTER B RXCIE 7
TXCIE 6
UDRIE 5
RXEN 4
TXEN 3
UCSZ2 2
RXB8 1
TXB8 0
El bit RXCIE (RX Complete Interrupt Enable) habilita la interrupción generada por la bandera RXC, es decir que se generará una interrupción cada vez que se reciba un dato. El bit TXCIE (TX Complete Interrupt Enable) habilita la interrupción generada por la bandera TXC, lo que quiere decir que se generará una interrupción cada vez que la totalidad de los datos hayan sido enviados y no haya en el buffer ninguna información pendiente para enviar. El bit UDRIE (USART Data Register Empty Interrupt Enable) habilita la interrupción generada por la bandera UDRE. El bit RXEN (Receiver Enable) sirve para habilitar la recepción de datos en el pin RxD, si este bit tiene un 0, entonces no podrán recibirse datos ni funcionarán las banderas FE, DOR ni PE. El bit TXEN (Transmitter Enable) sirve para habilitar la transmisión de datos.
Los bits UCSZ2-0 (Character Size) sirven para configurar el número de bits de datos que se emplearán en la transmisión y en la recepción. En este registro solamente se encuentra el UCSZ2, mientras que el UCSZ1 y UCSZ0 se encuentran en el registro UCSRC. UCSZ2 0 0 0 0 1 1 1 1
UCSZ1 0 0 1 1 0 0 1 1
UCSZ0 0 1 0 1 0 1 0 1
Character Size 5 bit 6 bit 7 bit 8 bit Reserved Reserved Reserved 9 bit
El bit RXB8 (Receive Data Bit 8) funciona como el noveno bit de la recepción si se está trabajando con datos de 9 bits. Debe ser leído antes de consultar el registro UDR. El bit TXB8 (Transmit Data Bit 8) funciona como el noveno bit de transmisión, debe ser escrito antes de consultar el registro UDR.
UCSRC – USART CONTROL AND STATUS REGISTER C URSEL 7
UMSEL 6
UPM1 5
UPM0 4
USBS 3
UCSZ1 2
UCSZ0 1
UCPOL 0
El bit URSEL (Register Select) sirve para seleccionar entre el acceso al registro UCSRC y el registro UBRRH. Cuando se va a escribir algún bit del registro UCSRC este bit deberá contener un 1. El bit UMSEL se utiliza para seleccionar entre la operación síncrona o asíncrona del USART (0 para asíncrona y 1 para síncrona). Los bits UPM1-0 (Parity Mode) sirven para configurar el USART de modo que se genere paridad y se realice el chequeo de la misma. Si se encuentra habilitada, el microprocesador automáticamente generará y enviará los bits de paridad correspondientes a cada dato, y realizará las comparaciones pertinentes para saber si los datos recibidos se encuentran íntegros. UPM1
UPM0
Parity Mode
0 0 1
0 1 0
1
1
Disabled Reserved Enabled, Even Parity Enabled, Odd Parity
El bit USBS (Stop Bit Select) selecciona los números de bits de “stop” que ser án enviados por el transmisor. Si se establece en 0 será de 1 bit, y si se establece en 1 será de 2 bits. Los bits UCSZ1-0 (Character Size) se usan junto con el bit UCSZ2 como ya se había mencionado. Estos indican cuantos bits serán empleados para la transmisión y recepción de información. El bit UCPOL (Clock Polarity) se emplea únicamente en la transmisión síncrona, debe quedar como 0 cuando se está empleando la comunicación asíncrona. UCPOL 0 1
Transmitted Data (Output of TxD pin) Rising XCK Edge Falling XCK Edge
Changed Received Data Sampled (Input on RxD Pin) Falling XCK Edge Rising XCK Edge
UBRRL Y UBRRH – USART BAUD RATE REGISTERS UBRRH URSEL 15
14
13
12
5
UBRR7-0 4 3
11
UBRR11-8 10 9
8
2
0
UBRRL 7
6
1
*El registro UBRRH comparte la ubicación con el registro UCSRC. Toda la información sobre el acceso a este registro aparece en la página 163 del datasheet.
El bit URSEL (Register Select) selecciona entre el acceso al registro UBRRH y el UCSRC. URSEL deberá contener 0 cuando se vaya a escribir información en el registro UBRRH. Los bits 14-12 no son importantes para la comunicación serial. Los bits UBRR11-0 (USART Baud Rate Register) contienen la información referente a la tasa de transferencia con la que trabajará el USART.
Reloj Interno del USART
La comunicación serial del AVR emplea un reloj interno, que es posible configurar de acuerdo a las necesidades de la transmisión, la tasa de transferencia que se desea emplear y la frecuencia del oscilador del microprocesador. Un contador decreciente es cargado con el contenido de UBRR cada vez que llega al valor de 0, esto produce un cambio en el estado del reloj interno del USART. Para calcular la tasa de transferencia se pueden utilizar las siguientes formulas. Modo d e operación
Modo asíncrono normal (U2X = 0) Modo asíncrono a doble velocidad (U2X = 1) Modo síncrono maestro
Ecuación para calcular la tasa (Baud Rate)
Ecuación para calcular el valor de UBRR
*El (baud rate) de transferencia está definida en bits por segundo.
*Los valores de UBRR van de 0 a 4095.
Inicialización del USART El USART debe ser inicializado antes de realizar cualquier tipo de comunicación. Este proceso de inicialización consiste en especificar los bauds a los que se trabajará, establecer el modo de operación y habilitar la transmisión o la recepción, dependiendo del uso que se les vaya a dar. Si se empleará el USART controlado por interrupciones, es importante que la bandera de interrupciones globales (la que se habilita con la instrucción sei) se encuentre deshabilitada al momento de hacer la inicialización (Es decir que la instrucción sei deberá ser escrita después de haber inicializado el USART). Si durante alguna parte del programa se desea reinicializar el USART para cambiar los bauds a los que se está trabajando o el modo de funcionamiento, se debe tener cuidado de no estar realizando una transmisión o recepción de información en ese momento, para ello se pueden revisar las banderas TXC y RXC.