sysprog-basic/beep/main.c

52 lines
1.1 KiB
C
Raw Normal View History

2023-10-27 12:21:16 +02:00
/*
* Control PB5 with the two buttons. One button disables, the other enables.
* The board uses interrupts for this. PB5 will quickly oscilate between on and
* off to make cool sounds with a summer.
*/
2023-10-27 10:57:47 +02:00
#define F_CPU 16000000UL
#define __AVR_ATmega328P__
2023-10-27 12:21:16 +02:00
#include <util/delay.h>
#include <avr/interrupt.h>
2023-10-27 10:57:47 +02:00
#include <avr/io.h>
2023-10-27 12:21:16 +02:00
int beep = 0;
int sound = 0;
// code for INT0
ISR(INT0_vect) { beep = 1; }
// code for INT1
ISR(INT1_vect) { beep = 0; PORTB &= ~(1 << PORTB5); sound = 0;}
2023-10-27 10:57:47 +02:00
int main(void) {
2023-10-27 12:21:16 +02:00
DDRB = 0xff; // write to B
DDRD = 0; // read from D
PORTD |= (1 << PORTD2) | (1 << PORTD3); // pull up D2 and D3
2023-10-27 10:57:47 +02:00
PORTB = 0;
2023-10-27 12:21:16 +02:00
// enable external interruprs
EIMSK |= (1 << INT0);
EIMSK |= (1 << INT1);
// trigger when anything changes
EICRA |= (1 << ISC00); // for INT0
EICRA |= (1 << ISC10); // for INT1
sei(); // interrupt magic macro
2023-10-27 10:57:47 +02:00
while (1) {
2023-10-27 12:21:16 +02:00
if (beep) {
2023-10-27 10:57:47 +02:00
PORTB |= (1 << PORTB5);
2023-10-27 12:21:16 +02:00
_delay_us(sound);
2023-10-27 10:57:47 +02:00
PORTB &= ~(1 << PORTB5);
2023-10-27 12:21:16 +02:00
_delay_us(sound);
sound++;
if (sound > 1000) {
sound = 0;
}
2023-10-27 10:57:47 +02:00
}
}
}