簡體   English   中英

C-atmega328p-我不明白怎么了

[英]C - atmega328p - I don't understand what is wrong

我不理解為什么我的代碼不起作用(doISR)。 它應該做什么:

-有一個行駛燈(6個LED)和3個按鈕。 我需要在正確的時間按下按鈕(按鈕1,如果LED 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);
       }
   }
}

函數doRunningLight()永遠不會返回,因此您在代碼后編寫的用於檢查ISRhasHappend並調用doIsr將永遠不會運行。 您可能需要考慮一種不同的方式來處理事件,可能無需使用阻塞延遲循環。

我還要問您是否真的需要一個引腳更改中斷。 按下按鈕的速度足夠慢,以使您的微控制器應該能夠通過讀取主循環中的引腳來檢測到它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM