ATmega8 GPIO
ATmega8 Provides GPIO pins (General Purpose Input Output) for digital operation that may be digital input or digital output. Atmega8 having 3 PORTs (PORTB, PORTC, PORTD) AND they give 23 GPIO pins.
PORTB – 8 GPIO pins (PB0 – PB7)
PORTC – 7 GPIO pins (PC0 – PC6)
PORTD – 8 GPIO pins (PD0 – PD7)
ATmega8 Datasheet here
We can take any one of digital line to produce digital output so let’s see how its work!!
Some Digital output devices like LED, Seven Segment, Relays, LED matrix, digital Watch etc. here we interface one led with ATmega8


CIRCUIT CONNECTION:


In the above discussion as we know ATmega8 having 3 PORTs and each PORT having some GPIO pins (i.e. 23 GPIO pins in ATmega8), now the thing is we can connect our Led to anyone these GPIO pins
Here I connect Led +ve lead to PORTB0 (i.e. PB0) through a resistor (220E) because led required 2-3v but ATmega8 uC output is 5v that’s why we need a resistor in series with led. and Led -ve lead connected to Gnd pin of ATmega8 as per circuit diagram shown above.
How to calculate resistor value:
Lets take led draw current = 10mA-18mA
Led need voltage = 3v
So voltage drop across resistor = 2v
R = V/I
= 2v/10mA = 200E (for 10mA)
R = V/I
So, in 112E or 200E led will glow in full brightness for safety purpose we can put resistor little higher than we calculated theoretically so we can use any value in bet 150E to 330E so here I use 220E
= 2v/18mA = 112E (for 18mA)
NOTE:
Before we start coding, we should aware of 3 things which will help in programming i.e.
DDR(x) – Data direction resistor
As it name shows this syntax gives direction to the resistor whether its working for input operation or output operation.
DDR(x) = 1 used for output
DDR(x) = 0 used for input
PORT(x) – Output from pin x
This syntax used for produce high signal in a particular channel as it define
For example, PORTB = 0x01;
Means this command high the PB0 channel (on the other hand we can say PB0 became 5v)
PIN(x) – Input to pin x
This syntax is used for take input in a particular channel
For example, a digital sensor is connected to PORTC channel0(i.e. PC0)
So, syntax is (PINC & 0X01) == 0X00 I’ll explain this code in digital input session.
CODE:
#include
#include
void main(){
DDRB = 0X01;
while(1){//Infinity loop
PORTB = 0X01;
_delay_ms(1000);
PORTB = 0x00;
_delay_ms(1000);
}
}
CODE EXPLANATION:
#include:- it includes input output header file which is in avr folder; syntax like DDR, PROT, PIN are derive from this header file.
#include :- it includes delay header file which is in util folder; syntax like _delay_ms(), _delay_us() are derived from this header file.
DDRB = 0X01;


In the above code we take PORTB to program the led, as we know ATmega8 is 8bit uC so PORTB having 8bit register storage location like below


Now we connected led to PB0; led is a digital output device as shown below


As we discussed above in case of DDR(x) declaration we used ‘1’ for output and ‘0’ for input, here we take output from PB0 so PB0 bit location should be ‘1’ and rest of bit location (PB1, PB2,—-,PB7) that you can put either ‘0’ or ‘1’ it doesn’t matter but PB0 should be ‘1’
If you want to represent DDR(x) in binary it will be
DDRB = 0b00000001;
In HEX it will be
DDRB = 0x01; it is not case sensitive you can use either 0X01 or 0x01 but DDR(x) must be in uppercase
Note: here we use ‘B’ port channel to programme the led if you use ‘C’ port or ‘D’ port it would be like DDRC or DDRD
PORTB = 0X01;
As we discussed above in case of PORT(x) command ‘1’ used for generate HIGH signal(5v) and ‘0’ used for low signal(Gnd).
Like DDR(x), If you want to represent PORT(x) in binary it will be
PORTB = 0b00000001;// for ON the led
In HEX it will be
PORTB = 0x01; it is not case sensitive you can use either 0X01 or 0x01 but PORT(x) must be in uppercase
PORTB = 0x00; // for OFF the led
_delay_ms(1000);
This command produces 1000 milli second delay that is equal to 1 sec.
Note:
So whole code is about your led is ON for 1 sec and OFF for 1 sec it behaves like a blink circuit. For continuous ON n OFF here we use a infinity loop statement i.e. while (1)