tvořím malé piano, tlačítka jako vstup, piezo na výstupu, a pár LEDek na metronom.
Mám problém s čítačem, který se nedostává do přerušení tak často, jak bych potřeboval.
Zvolil jsem Timer0 a nastavil ho na přetečení do TCNT0 jsem zapsal 255, aby přerušení nastávalo co nejčastěji ve kterém se budou inkrementovat nějaké promněnné. Následně jsem chtěl změřit čas kdy přerušení nastane a kolik tiků budu potřebovat pro různé tóny, problém je v tom že přerušení nastává každých 0,319ms což jsou cca 3,1kHz a to je bohužel málo. Přidat krystal úplně nechci kvůli nízkému VCC kolem 3V.
Nějaký tip jak by se to nechalo vyřešit?
Kód: Vybrať všetko
volatile uint16_t count_C4= 0; //261Hz
volatile uint16_t count_Cs4= 0; //277Hz
volatile uint16_t count_D4= 0; //293Hz
volatile uint16_t count_Ds4= 0; //311Hz
volatile uint16_t count_E4= 0; //329Hz
volatile uint16_t count_F4= 0; //349Hz
volatile uint16_t count_Fs4= 0; //369Hz
volatile uint16_t count_G4= 0; //392Hz
volatile uint16_t count_Gs4= 0; //415Hz
volatile uint16_t count_A4= 0; //440Hz
volatile uint16_t count_As4= 0; //466Hz
volatile uint16_t count_B4= 0; //493Hz
int main (void) {
DDRB = 0b00000010; // set IO PB1 out
DDRD = 0b00000000; // set IO
DDRC = 0b00111100; // set IO PC2,3,4,5 out
PORTD |= (1 << PD0); // pull up
PORTD |= (1 << PD1); // pull up
PORTD |= (1 << PD2); // pull up
PORTD |= (1 << PD3); // pull up
PORTD |= (1 << PD4); // pull up
PORTD |= (1 << PD5); // pull up
PORTD |= (1 << PD6); // pull up
PORTD |= (1 << PD7); // pull up
PORTB |= (1 << PB0); // pull up
PORTB |= (1 << PB2); // pull up
PORTB |= (1 << PB3); // pull up
PORTB |= (1 << PB4); // pull up
PORTB |= (1 << PB5); // pull up
PORTC |= (1 << PC0); // pull up
PORTC |= (1 << PC1); // pull up
TCNT0 = 255;
TCCR0 |= (1<<CS00); // NO PRESCALER
TIMSK = (1<<TOIE0); //Timer/Counter0 Overflow Interrupt Enable
sei(); // povolení globálního přerušení
while(1){
//C4
if(((PIND & (1 << PD0)) == 0) & (count_C4>=30)){
PORTB ^= (1 << PB1);
count_C4 = 0;
}
if(count_C4>=57){
count_A4 = 0;
}
//Cs4
if(((PIND & (1 << PD1)) == 0) & (count_Cs4>=30)){
PORTB ^= (1 << PB1);
count_Cs4 = 0;
}
if(count_Cs4>=57){
count_As4 = 0;
}
//D4
if(((PIND & (1 << PD2)) == 0) & (count_D4>=30)){
PORTB ^= (1 << PB1);
count_D4 = 0;
}
if(count_D4>=57){
count_D4 = 0;
}
//Ds4
if(((PIND & (1 << PD3)) == 0) & (count_Ds4>=30)){
PORTB ^= (1 << PB1);
count_Ds4 = 0;
}
if(count_Ds4>=57){
count_Ds4 = 0;
}
//E4
if(((PIND & (1 << PD4)) == 0) & (count_E4>=30)){
PORTB ^= (1 << PB1);
count_E4 = 0;
}
if(count_E4>=57){
count_E4 = 0;
}
//F4
if(((PIND & (1 << PD6)) == 0) & (count_F4>=30)){
PORTB ^= (1 << PB1);
count_F4 = 0;
}
if(count_F4>=57){
count_F4 = 0;
}
//Fs4
if(((PIND & (1 << PD5)) == 0) & (count_Fs4>=30)){
PORTB ^= (1 << PB1);
count_Fs4 = 0;
}
if(count_Fs4>=57){
count_Fs4 = 0;
}
//G4
if(((PIND & (1 << PD7)) == 0) & (count_G4>=30)){
PORTB ^= (1 << PB1);
count_G4 = 0;
}
if(count_G4>=57){
count_G4 = 0;
}
//Gs4
if(((PINB & (1 << PB0)) == 0) & (count_Gs4>=30)){
PORTB ^= (1 << PB1);
count_Gs4 = 0;
}
if(count_A4>=57){
count_A4 = 0;
}
//A4
if(((PINB & (1 << PB4)) == 0) & (count_A4>=30)){
PORTB ^= (1 << PB1);
count_A4 = 0;
}
if(count_A4>=57){
count_A4 = 0;
}
//As4
if(((PINB & (1 << PB3)) == 0) & (count_As4>=30)){
PORTB ^= (1 << PB1);
count_As4 = 0;
}
if(count_As4>=57){
count_As4 = 0;
}
//B
if(((PINB & (1 << PB2)) == 0) & (count_B4>=30)){
PORTB ^= (1 << PB1);
count_B4 = 0;
}
if(count_B4>=57){
count_B4 = 0;
}
} //while
} //main
ISR (TIMER0_OVF_vect){ // 0,319ms
TCNT0 = 255;
count_C4 ++; //261Hz
count_Cs4++; //277Hz
count_D4 ++; //293Hz
count_Ds4++; //311Hz
count_E4 ++; //329Hz
count_F4 ++; //349Hz
count_Fs4++; //369Hz
count_G4 ++; //392Hz
count_Gs4++; //415Hz
count_A4 ++; //440Hz
count_As4++; //466Hz
count_B4 ++; //493Hz
PORTC ^= (1 << PC2); // debug
}