diff --git a/Arduino-Uno-Chip-Pinout-8894.jpg b/Arduino-Uno-Chip-Pinout-8894.jpg new file mode 100644 index 0000000..6834df5 Binary files /dev/null and b/Arduino-Uno-Chip-Pinout-8894.jpg differ diff --git a/LED Blink Input Output/GPIO-notes-pins.md b/LED Blink Input Output/GPIO-notes-pins.md index 8195342..d3ee3f2 100644 --- a/LED Blink Input Output/GPIO-notes-pins.md +++ b/LED Blink Input Output/GPIO-notes-pins.md @@ -29,7 +29,8 @@ Microcontroller pins are grouped as: - PC6 is RESET pin → DO NOT USE as GPIO - → can reset system + → can reset system + → can be used but condition is if reset is disabled. - PD0 and PD1 are Serial pins (RX TX) → used for USB upload and debugging diff --git a/PWM-generator/Makefile b/PWM-generator/Makefile new file mode 100644 index 0000000..e826b64 --- /dev/null +++ b/PWM-generator/Makefile @@ -0,0 +1,24 @@ +MCU = atmega328p +F_CPU = 16000000UL +CC = C:\Users\sharm\Desktop\Embedded Programming\avrprojects\avr8-gnu-toolchain-win32_x86_64\bin\avr-gcc +OBJCOPY = C:\Users\sharm\Desktop\Embedded Programming\avrprojects\avr8-gnu-toolchain-win32_x86_64\bin\avr-objcopy +AVRDUDE = ../avrdude +AVRDUDE_PROGRAMMER = arduino +AVRDUDE_PORT = COM8 +AVRDUDE_BAUD = 115200 + +CFLAGS = -mmcu=$(MCU) -DF_CPU=$(F_CPU) -Os -Wall + +all: main.hex + +main.elf: main.c + $(CC) $(CFLAGS) main.c -o main.elf + +main.hex: main.elf + $(OBJCOPY) -O ihex -R .eeprom main.elf main.hex + +upload: main.hex + $(AVRDUDE) -c $(AVRDUDE_PROGRAMMER) -p $(MCU) -P $(AVRDUDE_PORT) -b $(AVRDUDE_BAUD) -D -U flash:w:main.hex:i + +clean: + rm -f main.elf main.hex \ No newline at end of file diff --git a/PWM-generator/main.c b/PWM-generator/main.c new file mode 100644 index 0000000..f7562b9 --- /dev/null +++ b/PWM-generator/main.c @@ -0,0 +1,33 @@ +#include + +int main(void) { + // 1. Set PB1 (OC1A) as output + DDRB |= (1 << PB1); + + // 2. Fast PWM mode (WGM13:0 = 14) + TCCR1A = (1 << COM1A1) | (1 << WGM11); + TCCR1B = (1 << WGM12) | (1 << WGM13); + + // 3. Prescaler = 8 (start timer) + TCCR1B |= (1 << CS11); + + // 4. Set TOP value (frequency) + ICR1 = 19999; // ~50 Hz (good for visible LED dimming demo) + + // 5. Initial duty cycle + OCR1A = 0; + + while (1) { + // Increase brightness + for (uint16_t i = 0; i < 2000; i++) { + OCR1A = i * 10; // increase duty + for (volatile uint32_t d = 0; d < 5000; d++); // small delay + } + + // Decrease brightness + for (int16_t i = 2000; i > 0; i--) { + OCR1A = i * 10; + for (volatile uint32_t d = 0; d < 5000; d++); + } + } +} \ No newline at end of file diff --git a/Readmore.md b/Readmore.md new file mode 100644 index 0000000..54b267f --- /dev/null +++ b/Readmore.md @@ -0,0 +1,15 @@ +# Timer Interrupt (ATmega328P) + +## Goal +Generated 1ms interrupt using Timer1 + +## Key Registers +- TCCR1B → mode + prescaler +- OCR1A → compare value +- TIMSK1 → enable interrupt + +## Logic +Timer counts → match OCR1A → ISR runs → ms++ + +## Result +LED blink using ms counter (non-blocking) diff --git a/Timer-Interrupt/Makefile b/Timer-Interrupt/Makefile new file mode 100644 index 0000000..e826b64 --- /dev/null +++ b/Timer-Interrupt/Makefile @@ -0,0 +1,24 @@ +MCU = atmega328p +F_CPU = 16000000UL +CC = C:\Users\sharm\Desktop\Embedded Programming\avrprojects\avr8-gnu-toolchain-win32_x86_64\bin\avr-gcc +OBJCOPY = C:\Users\sharm\Desktop\Embedded Programming\avrprojects\avr8-gnu-toolchain-win32_x86_64\bin\avr-objcopy +AVRDUDE = ../avrdude +AVRDUDE_PROGRAMMER = arduino +AVRDUDE_PORT = COM8 +AVRDUDE_BAUD = 115200 + +CFLAGS = -mmcu=$(MCU) -DF_CPU=$(F_CPU) -Os -Wall + +all: main.hex + +main.elf: main.c + $(CC) $(CFLAGS) main.c -o main.elf + +main.hex: main.elf + $(OBJCOPY) -O ihex -R .eeprom main.elf main.hex + +upload: main.hex + $(AVRDUDE) -c $(AVRDUDE_PROGRAMMER) -p $(MCU) -P $(AVRDUDE_PORT) -b $(AVRDUDE_BAUD) -D -U flash:w:main.hex:i + +clean: + rm -f main.elf main.hex \ No newline at end of file diff --git a/Timer-Interrupt/main.c b/Timer-Interrupt/main.c new file mode 100644 index 0000000..335d247 --- /dev/null +++ b/Timer-Interrupt/main.c @@ -0,0 +1,39 @@ +#include +#include +#include + +volatile uint32_t ms = 0; + +void timer1_init(void) { + TCCR1A = 0; + TCCR1B = 0; + TCNT1 = 0; + + TCCR1B |= (1 << WGM12); + OCR1A = 249; + TIMSK1 |= (1 << OCIE1A); + TCCR1B |= (1 << CS11) | (1 << CS10); + sei(); +} + +ISR(TIMER1_COMPA_vect) { + ms++; +} + +void delay_ms(uint32_t delay){ + uint32_t start = ms; + while ((ms - start) < delay) { + } +} + +int main(void) { + DDRC |= (1<