Added first implementation of hardware interrupt, and example for GPIO usage.
This commit is contained in:
parent
cf4cd2813b
commit
1f3e31c295
|
@ -0,0 +1,37 @@
|
||||||
|
/*
|
||||||
|
This example showcases digital input and output using the AVR chip's GPIO
|
||||||
|
pins. For all pins, we first have to configure them as either input or output.
|
||||||
|
We do this by writing to the DDRx register (data direction register) either a 1
|
||||||
|
(for output) or 0 (for input).
|
||||||
|
|
||||||
|
We can set the output of a pin by writing to PORTx, using bitwise operators.
|
||||||
|
|
||||||
|
Reading can be done by reading from PINx, using bitwise operators.
|
||||||
|
*/
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <util/delay.h>
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
// Pin 12 == Port B4, aka 4th bit on the B register.
|
||||||
|
// Set pin 12 as output.
|
||||||
|
DDRB |= 1 << PORTB4;
|
||||||
|
// Set pin 5 as input.
|
||||||
|
DDRD &= ~(1 << PORTD5);
|
||||||
|
// Write a 0 to pin 12 initially.
|
||||||
|
PORTB &= ~(1 << PORTB4);
|
||||||
|
uint8_t led = 0;
|
||||||
|
while (1) {
|
||||||
|
// Write current led status to pin 12.
|
||||||
|
if (led) {
|
||||||
|
PORTB |= 1 << PORTB4;
|
||||||
|
} else {
|
||||||
|
PORTB &= ~(1 << PORTB4);
|
||||||
|
}
|
||||||
|
led = !led;
|
||||||
|
_delay_ms(1000.0);
|
||||||
|
// Read input from pin 5. If it's HIGH, keep the LED on.
|
||||||
|
uint8_t pin5Value = (PIND & (1 << PIND5)) >> PIND5;
|
||||||
|
if (pin5Value) led = 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
24
src/gympal.c
24
src/gympal.c
|
@ -1,19 +1,33 @@
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
|
#include <avr/interrupt.h>
|
||||||
#include <util/delay.h>
|
#include <util/delay.h>
|
||||||
|
|
||||||
|
volatile uint8_t a = 0;
|
||||||
|
|
||||||
void updatePin12(uint8_t status) {
|
void updatePin12(uint8_t status) {
|
||||||
PORTB = status << PORTB4;
|
PORTB = status << PORTB4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ISR(PCINT2_vect) {
|
||||||
|
uint8_t value = (PIND & (1 << PIND5)) >> PIND5;
|
||||||
|
PORTB = value << PORTB4;
|
||||||
|
}
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
|
PCICR |= 1 << PCIE2;
|
||||||
|
PCMSK2 |= 1 << PCINT21;
|
||||||
|
sei();
|
||||||
// Pin 12 == Port B4, aka 4th bit on the B register.
|
// Pin 12 == Port B4, aka 4th bit on the B register.
|
||||||
// Set pin 12 as output.
|
// Set pin 12 as output.
|
||||||
DDRB = 1 << PORTB4;
|
DDRB |= 1 << PORTB4;
|
||||||
uint8_t ledOn = 1;
|
// Set pin 5 as input.
|
||||||
|
DDRD &= ~(1 << PORTD5);
|
||||||
|
PORTB &= ~(1 << PORTB4);
|
||||||
while (1) {
|
while (1) {
|
||||||
updatePin12(ledOn);
|
// updatePin12(ledOn);
|
||||||
ledOn = !ledOn;
|
// ledOn = !ledOn;
|
||||||
_delay_ms(1000.0);
|
// _delay_ms(1000.0);
|
||||||
|
// DO NOTHING! rely on interrupt.
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
Loading…
Reference in New Issue