Add interrupt notes
This commit is contained in:
210
interrupts/pin-interrupt-notes.md
Normal file
210
interrupts/pin-interrupt-notes.md
Normal file
@@ -0,0 +1,210 @@
|
||||
# External Interrupt Configuration (ATmega328P)
|
||||
|
||||
## SREG (Status Register)
|
||||
|
||||
SREG is AVR status register with 8-bit status:
|
||||
|
||||
- Bit 0 → Carry Flag (C) – for ALU operations
|
||||
- Bit 1 → Zero Flag (Z) – result is zero
|
||||
- Bit 2 → Negative Flag (N) – result is negative
|
||||
- Bit 3 → Two’s Complement Overflow Flag (V) – arithmetic overflow
|
||||
- Bit 4 → Sign Bit (S) – N ⊕ V
|
||||
- Bit 5 → Half Carry Flag (H) – carry from bit 3 to 4
|
||||
- Bit 6 → Bit Copy Storage (T) – used in bit operations
|
||||
- Bit 7 → Global Interrupt Enable (I) – Important for interrupt
|
||||
|
||||
### Enable Global Interrupt
|
||||
SREG |= (1 << 7);
|
||||
// or
|
||||
sei();
|
||||
|
||||
### Disable Global Interrupt
|
||||
SREG &= ~(1 << 7);
|
||||
// or
|
||||
cli();
|
||||
|
||||
---
|
||||
|
||||
## External Interrupt Pins
|
||||
|
||||
- PD2 → INT0
|
||||
- PD3 → INT1
|
||||
|
||||
---
|
||||
|
||||
## EICRA (External Interrupt Control Register A)
|
||||
|
||||
Controls how external interrupts trigger.
|
||||
|
||||
### ISC (Interrupt Sense Control)
|
||||
|
||||
| ISCx1 | ISCx0 | Mode |
|
||||
|------|------|--------------------|
|
||||
| 0 | 0 | Low Level |
|
||||
| 0 | 1 | Any Logical Change |
|
||||
| 1 | 0 | Falling Edge |
|
||||
| 1 | 1 | Rising Edge |
|
||||
|
||||
### Bit Positions
|
||||
|
||||
- INT0 → ISC01 (bit1), ISC00 (bit0)
|
||||
- INT1 → ISC11 (bit3), ISC10 (bit2)
|
||||
|
||||
---
|
||||
|
||||
# Interrupt Trigger Modes (INT0)
|
||||
|
||||
## 1. Low Level (00)
|
||||
|
||||
EICRA &= ~((1 << ISC01) | (1 << ISC00));
|
||||
|
||||
Bit calculation:
|
||||
- (1 << ISC01) = 00000010
|
||||
- (1 << ISC00) = 00000001
|
||||
- OR = 00000011
|
||||
- NOT = 11111100
|
||||
- Result → ISC01=0, ISC00=0
|
||||
|
||||
---
|
||||
|
||||
## 2. Any Logical Change (01)
|
||||
|
||||
EICRA &= ~(1 << ISC01);
|
||||
EICRA |= (1 << ISC00);
|
||||
|
||||
Bit calculation:
|
||||
- Clear ISC01 → 0
|
||||
- Set ISC00 → 1
|
||||
- Result → 01
|
||||
|
||||
---
|
||||
|
||||
## 3. Falling Edge (10)
|
||||
|
||||
EICRA |= (1 << ISC01);
|
||||
EICRA &= ~(1 << ISC00);
|
||||
|
||||
Bit calculation:
|
||||
- Set ISC01 → 1
|
||||
- Clear ISC00 → 0
|
||||
- Result → 10
|
||||
|
||||
---
|
||||
|
||||
## 4. Rising Edge (11)
|
||||
|
||||
EICRA |= (1 << ISC01) | (1 << ISC00);
|
||||
|
||||
Bit calculation:
|
||||
- (1 << ISC01) = 00000010
|
||||
- (1 << ISC00) = 00000001
|
||||
- OR = 00000011
|
||||
- Result → ISC01=1, ISC00=1
|
||||
|
||||
---
|
||||
|
||||
## INT1 (Same Logic)
|
||||
|
||||
Replace:
|
||||
- ISC01 → ISC11
|
||||
- ISC00 → ISC10
|
||||
|
||||
Example (Rising Edge INT1):
|
||||
|
||||
EICRA |= (1 << ISC11) | (1 << ISC10);
|
||||
|
||||
---
|
||||
|
||||
# Practical Note (Real Hardware Behavior)
|
||||
|
||||
- Button press is not 100% stable
|
||||
- Causes:
|
||||
- Mechanical bounce
|
||||
- Loose wiring / plug-in noise
|
||||
- Floating inputs
|
||||
|
||||
### Recommendation
|
||||
|
||||
- Avoid: Any Logical Change (too sensitive)
|
||||
- Prefer:
|
||||
- Falling Edge (more stable detection)
|
||||
- Or implement HOLD logic in software
|
||||
|
||||
---
|
||||
|
||||
## EIMSK (External Interrupt Mask Register)
|
||||
|
||||
Controls enabling/disabling of interrupts.
|
||||
|
||||
### Bit Positions
|
||||
|
||||
- Bit 0 → INT0 enable
|
||||
- Bit 1 → INT1 enable
|
||||
|
||||
---
|
||||
|
||||
## Enable / Disable Interrupt Lines
|
||||
|
||||
### Enable INT0
|
||||
EIMSK |= (1 << INT0);
|
||||
|
||||
### Disable INT1
|
||||
EIMSK &= ~(1 << INT1);
|
||||
|
||||
---
|
||||
|
||||
## Why Disable Unused Interrupts
|
||||
|
||||
- Prevent false triggering from floating pins
|
||||
- Reduce noise impact
|
||||
- Ensure controlled initialization
|
||||
- Avoid unintended behaviour
|
||||
|
||||
---
|
||||
|
||||
## Interrupt Execution Flow
|
||||
|
||||
1. Configure trigger in EICRA
|
||||
2. Enable interrupt in EIMSK
|
||||
3. Enable global interrupt (sei)
|
||||
4. Event occurs → CPU jumps to ISR
|
||||
|
||||
---
|
||||
|
||||
## ISR (Interrupt Service Routine)
|
||||
|
||||
ISR is executed automatically when interrupt occurs.
|
||||
|
||||
---
|
||||
|
||||
## Flag-Based Handling
|
||||
|
||||
### Global Flag
|
||||
volatile uint8_t flag = 0;
|
||||
|
||||
- `volatile` required (value changes outside normal flow)
|
||||
|
||||
---
|
||||
|
||||
## ISR Definitions
|
||||
|
||||
### INT0 Interrupt
|
||||
ISR(INT0_vect)
|
||||
{
|
||||
flag = 1;
|
||||
}
|
||||
|
||||
### INT1 Interrupt
|
||||
ISR(INT1_vect)
|
||||
{
|
||||
flag = 1;
|
||||
}
|
||||
|
||||
---
|
||||
|
||||
## Important Notes
|
||||
|
||||
- Keep ISR short
|
||||
- No delay or heavy processing inside ISR
|
||||
- Use flag and handle logic in main loop
|
||||
- Always use `volatile` for shared variables
|
||||
Reference in New Issue
Block a user