Menu

Adskeeper - header widge

728x90

468x60

Navbar

Thursday, November 5, 2020

Atmega32 Timer/Counter1 in Timer Mode

A Short Detail of Timer/Counter1


Timer/Counter1 module of Atmega32 is superior to Timer/Counter0. It has some advanced features over the previous one's:



  • 16-bit wide made of two 8-bit registers
  • Input capture mode
  • Improved PWM mode
  • Four interrupt source

It has two Timer/Counter registers working as a pair of two 8-bit low and high register - TCNT1H and TCNT1L. As a result the Timer/Counter registers is 16-bit in total.

Atmega32 Timer/Counter1 in Timer Mode
Timer/Counter1 Register -TCNT1H and TCNT1L

There are more additional Timer/Counter control registers and interrupt flag. But we only list some in-use registers in this post.

Timer/Counter1 Control Register B (TCCR1B) contain functions setting of this module working in timer mode.

Atmega32 Timer/Counter1 in Timer Mode
Timer/Counter1 Control Register B

Clock Select bit (CS12:10) of this register set the clock source of Timer/Counter1.

Atmega32 Timer/Counter1 in Timer Mode
Timer/Counter1 Clock Select bit

Interrupt occurs at the maximum counting of this 16-bit Timer/Counter at 65536. Then the Timer/Counter1 overflow interrupt flag (TOV1) is set.

Atmega32 Timer/Counter1 in Timer Mode
Timer/Counter Interrupt Flag Register - TIFR

Programming Timer/Counter1 in Timer Mode

In this Timer/Counter1 timer mode example, the program configure this module to make a timer tick of 262ms. This timer tick is a result of its interrupt at overflow. At the interrupt time PC2 of Port C toggles.

Atmega32 Timer/Counter1 in Timer Mode
Schematic diagram of this example post

We have a calculation below.

Microcontroller instruction cycle with its 16MHz clock frequency is,

1/16000000 = 62.5ns

With a clock selection of Clk/64 we get,

64*62.5ns = 4us.

Sixteen bit Timer/Counter1 register counts up to 65536 value to generate the interrupt flag. The duration before the TOV1 is set is,

65536*4us = 262ms.

For every 262ms PC2 toggles an output LED.

/*
 * timer_1_example.c
 *
 * Created: 12/19/2020 8:57:35 PM
 * Author : aki-technical
 */ 
#include <avr/io.h>
int main(void)
{
    /*Select Timer Mode, CLK/64*/
TCCR1B=(1<<CS11)|(1<<CS10);
/*PC2 Output*/
DDRC=(1<<2);
/*Clear Timer Overflow Flag 1*/
TIFR=(1<<TOV1);
    while (1) 
    {
/*Check for overflow*/
if (TIFR&(1<<TOV1))
{
/*Clear this flag*/
TIFR=(1<<TOV1);
/*Toggle PB2*/
PORTC^=0x04;
}
    }
}

Let see the simulation result in software. 

Atmega32 Timer/Counter1 in Timer Mode
Simulation result in Proteus

Click here to download this example file.


Wednesday, October 7, 2020

ATMega32 SPI and Nokia 5510 LCD Interfacing

Overview

The Nokia 5510 mobile phone came with a 84x48 graphical LCD display. This display is a  monochrome dot matrix with controller PCD8544 from NXP semiconductor. The PCD8544 interfaces to the MCU using the high speed SPI communication interface.

A Nokia 5510 LCD module from an Ali Express Store.

This eight-pins module has its pin function as descripted below:

  1. VCC - Positive supply voltage (from 2.7 V to 3.3 V)
  2. GND - Ground connection
  3. SCE - Chip Select (active low)
  4. RST - Reset (active low)
  5. D/C - Data/Command mode ( low for command and high for data)
  6. DIN - SPI MOSI
  7. SCLK - SPI serial clock
  8. LED - LED backlight supplies at 3.3V maximum voltage
The LCD command is the instruction that force the internal setup - for example choosing the display bias, or selecting between the horizonal and vertical orientation. 

The LCD data is graphical data that will show on the output screen of the LCD module.

LCD Command

Writing the commands to the controller is the first thing to set up the display before displaying the text or other graphical data on the LCD screen. The MCU must clear the D/C pin with a specific SPI instruction to command the LCD controller. The picture below shows all the command from the device datasheet.

Commands for the PCD8544 matrix LCD controller

Within those byte of instruction there are some bits to explain that list below.

Explanations of each bit

There are many details due to the device's specification. Here I descript only some basic and most used commands.
The display can be selected to show in a horizontal or a vertical mode. The screen could be,
  1. displays blank
  2. operates in normal mode
  3. displays all segments
  4. display an inverse video
The controller could be set to power down or become active up to the MCU command to the controller. The display bias voltage set the LCD contrast. It's configured in software using the LCD command, and more other stuffs.

The SPI communication to this controller work in two modes - a single byte transmission and a multiple bytes transmission.

ATMega32 AVR Interfacing and Programming With The Nokia 5510 LCD Module

For an introductory example using this device, I follow the recommended instruction created by the LCD controller's vendor to make a proper operation for this device.

The LCD module is a Spark Fun Nokia 5510 module I bought from E Bay. With this simple example the display show only text and displaying the time since it's powered up.

The displaying text is a set of font I get from the Arduino play ground website.

Schematic

ATMega32 SPI and Nokia 5510 LCD Interfacing
Schematic Diagram

C Source Code In Atmel Studio 7



Click here to download the zip file of this working example. The simulation result could be seen below.

ATMega32 SPI and Nokia 5510 LCD Interfacing
Simulation Result

Wednesday, September 30, 2020

AVR ATMega32 USART Receiver Interrupt Programming Example

We have already discussed about the USART module of the ATMega32 with some details and its programming example in AVR C. The transmitter interrupt is occur whenever the transmitter has complete the data transfer. It set the USART Transmit Complete (TXC). Similarly, the receiver interrupt is occur whenever the it has complete the data reception. It set the USART Receiver Complete (RXC).

However in this section I don't want to discuss all this interrupt capabilities. Here I show only how to program the USART interrupt on the receiver side.

It's similar to the introductory post, but here I use the receiver interrupt to get the data from the buffer. Using the interrupt it is more time effective. We can see this advantage just a large program contain a lot of working codes.

We must do this setting to get the USART interrupt working.
  1. Enable the RX Complete Interrupt Enable (RXCIE) of the UCSRC register.
  2. Enable the Global Interrupt of the SREG register
  3. Write the Interrupt Service Routine (ISR) for the USART receiver interrupt.
The interrupt vector of the USART receiver complete is USART_RXC_vect . Within this ISR the programmer must read the data from the UDR, then clear the USART Receive Complete (RXC).

Let look at this example.

/*
 * uart_interrupt.c
 *
 * Created: 9/30/2020 9:14:17 PM
 * Author : aki-technical
 */ 

#include <avr/io.h>

#define F_CPU 16000000UL
#include <util/delay.h>
#include <avr/interrupt.h>

void uartInit(unsigned long baud){
unsigned int UBRR;
/*Baud rate calculator*/
UBRR=(F_CPU/(16*baud))-1;
UBRRH=(unsigned char)(UBRR>>8);
UBRRL=(unsigned char)UBRR;
/*Enable the transmitter and receiver with receiver
complete interrupt*/
UCSRB=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
/*asynchronous mode, 8-bit, 1-stop bit*/
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
sei();
}

void uartTransmit(unsigned char data){
/*Stay here until the buffer is empty*/
while(!(UCSRA&(1<<UDRE)));
/*Put the data into the buffer*/
UDR=data;
}

void uartString(unsigned char *data){
while(*data) uartTransmit(*data++);
}

char rcvData=0;

int main(void)
{
DDRC=0xFF;
uartInit(9600);
uartString("USART Receiver Interrupt Example.\r");
while (1)
{
PORTC=rcvData;
}
}

/*Interrupt Vector for the USART*/
ISR(USART_RXC_vect){
/*Read the data from buffer*/
rcvData=UDR;
/*Clear the interrupt flag*/
UCSRA|=(1<<RXC);
}

Click here to download the zip file of this working example.

AVR ATMega32 USART Receiver Interrupt Programming Example
Schematic Diagram

PORTC displays the received data from the terminal.
 

If you want a standard PCB for ATMega32 micro-controller, you can order my AVR Microcontroller project from PCBWay with a reasonable price. Click here to get a free $5 credit for new account.


 

Adskeep- Standard Ads

336x280

Search This Blog

Labels

23K256 (1) 24C16B (2) 25AA010A (2) 8051 (7) 93AA46B (1) ADC (34) Analog Comparator (1) Arduino (16) ARM (13) AT89C52 (7) ATMega32 (58) ATMega644P (27) AVR (87) AVR PCB (2) Bootloader (1) CCS PICC (31) Change Notify Interrupt (CNI) (2) DAC (2) DHT11 (4) Display (135) Distance Sensor (3) dot matrix (1) ds1307 (10) DS18B20 (5) ds3231 (1) ds3232 (2) dsPIC (5) dsPIC30F1010 (3) dsPIC30F2010 (5) EEPROM (5) Environment Sensor (5) ESP32 (1) esp8266 (1) Graphical LCD (2) I2C (38) ILI9341 (1) Input/Output (76) Interrupt (22) IoT PCB (1) Keil (5) Keypad (16) KS0108 (2) LCD (75) LM35 (3) Master/Slave (2) MAX7221 (1) MCP23017 (8) MCP23S17 (7) MCP4921 (1) MCP4922 (2) Meter (3) MikroC (2) Module PCB (1) Motor (15) MPLABX (73) Nokia 5110 LCD (4) OLED (2) One-Wire (7) Oscillator (8) PCB (12) PCD8544 (3) PCF8574 (10) PIC (108) PIC12F (3) PIC16 (105) PIC16F628A (3) PIC16F630 (2) PIC16F716 (4) PIC16F818 (11) PIC16F818/819 (3) PIC16F84A (16) PIC16F876A (2) PIC16F877A (9) PIC16F88 (2) PIC16F887 (60) PIC18 (19) PIC18F1220 (5) PIC18F2550 (5) PIC18F4550 (12) PICKit2 (1) PICMicro PCB (4) Pin Change Interrupt (1) PWM (12) RTC (12) SBN0064G (1) Sensor (13) SH1106 (3) Shift Register (13) Shift Registers (12) SN74HC595N (2) Software TWI (2) SPI (39) ST7735 (1) STM32 (11) STM32 Black Pill (1) STM32 Blue Pill (12) STM32 HAL (5) STM32CubeIDE (13) STM32F103C8T6 (9) STM32F401CCU6 (1) SysTick (4) temperature sensor (13) TFT (1) TG12864A (1) Thermometer (22) Timer/Counter (32) TM1637 (2) twi (10) UART (8) Ultrasonic (4) Voltmeter (7) WDT (1) XC16 (2) XC8 (96)