C - atmega328p - я не понимаю, что не так
Я не понимаю, почему мой код не работает (doISR). Что должно делать:
- есть ходовой огонь (6 светодиодов) и 3 кнопки. Мне нужно нажать кнопку в нужное время (кнопка 1, если светодиод 1 или 2 горит.... и т. Д.). если это правильно: увеличьте скорость, если нет: сбросьте.
Бьюсь об заклад, это грубая ошибка, но я не понимаю:)
void wait(void) {
while (!(TIFR1 & (1 << OCF1A))) // wait
;
TIFR1 |= (1 << OCF1A); // delete Interrupt flag
}
volatile bool ISRhasHappend = false;
ISR(PCINT0_vect) {
ISRhasHappend = true;
}
int main(void) {
OCR1A = 3125 - 1; //2 seconds
TCCR1B |= (1 << WGM12); //turn on CTC mode
TCCR1B |= (1 << CS12) | (1 << CS10); //Prescalemode 101 -> 1024 Takt
DDRB = (1 << PCINT5);
DDRC = 0x3f;
PCICR = 0x3f; //Pin Change Interrupt Control Register
PCMSK0 = (1 << PCINT0) | (1 << PCINT2) | (1 << PCINT4);
sei();
doRunningLight();
if (ISRhasHappend == true) {
doISR();
}
}
void doISR() {
//while timee >0
for(int x=3125;x>0;x=x-250){
//if LEDs 0+1 on, and button0 pressed ...etc
if ((PORTC & (0b00000011)) && (PINB & (1 << PINB0)) || (PORTC &
(0b00001100)) && (PINB & (1 << PINB2)) || (PORTC & (0b00110000)) &&
(PINB & (1 << PINB4))) {
//All led lights up
PORTC |= 0x3f;
wait();
//reduce timer if catched the light
OCR1A = x;
}
else {
//turn signal
for (int y = 1; y < 5; y++) {
PORTB ^= (1 << PCINT5);
wait();
}
//back to 3124 if failed
OCR1A = 3125 - 1;
}
}
ISRhasHappend = false;
}
void doRunningLight(){
while(1) {
for (int i = 0; i<6; i++){
PORTC |= (1<<i);
wait();
PORTC &= ~(1<<i);
}
}
}
1 ответ
Функция doRunningLight()
никогда не возвращается, поэтому код, который вы написали после него, чтобы проверить ISRhasHappend
и позвонить doIsr
никогда не побежит. Вам нужно будет подумать о другом способе обработки ваших событий, возможно, без использования блокировок задержки.
Я также хотел бы спросить, нужно ли вам на самом деле прерывание смены булавки. Нажатие кнопок достаточно медленное, чтобы ваш микроконтроллер мог их обнаружить, считывая штифт в основном цикле.