在Arduino上使用AVR,试图让pin7开启和关闭闪光灯

时间:2015-07-23 18:07:31

标签: arduino avr

我试图让它打开和关闭第7针,但我遇到了一些问题。这样做的正确方法是什么?我相当肯定我的问题在于两个" state"之间的toggleLED功能。线。

   #include <avr/io.h>

int state = 1;
char ticks = 0;

void toggleLED(void);

int main(void) {
    DDRB = (1 << PD7);        // set pin 7 to output
    TIMSK0 = 0;             // no interrupts
    TCCR0B = 5;             // divide clock by 1024
    PORTB = (1<<PD7);

    while(1) {
        while((TIFR0 & 0x01) == 0) {}    // loop until flag is set

        TIFR0 = 1;              // clear the flag
        ticks++;
        if(ticks == 1) {
            ticks = 0;
            toggleLED();
        }
    }
} 

 void toggleLED(void) {
     if(state == 1) {
        PORTB = 1;
        state = 0;
     } else {
        PORTB = 0;
        state = 1;
     }
}

2 个答案:

答案 0 :(得分:0)

您的main功能设置了PB7。您的toggleLED功能切换PB0。引脚7可能是别的东西,我们需要知道这个硬件运行在哪,告诉引脚7是什么。

答案 1 :(得分:0)

 

这个怎么样?

#include <avr/io.h>

ISR (TIMER0_COMPA_vect)
  {
  PIND = (1 << PIND7);        // toggle D7
  }  

int main(void) 
  {
    DDRD   = (1 << PORTD7);        // set pin D7 to output
    TCCR0A = 0;                
    TCCR0B = (1 << CS00) | (1 << CS02);  // prescaler of 1024
    TIMSK0 = (1 << OCIE0A);    // Timer/Counter0 Output Compare Match A Interrupt Enable
    OCR0A  = 249;              // count up to 250
    sei ();                    // want interrupts now
    while (true) ;             // all done!
  } 

以62.5 Hz的速率切换引脚7。 (即频率为31.25 Hz,可见)。

理论值:

 16e6 / 1024 / 250 = 62.5 Hz

或让硬件为您完成:

#include <avr/io.h>

int main(void) 
  {
    DDRD   = (1 << PORTD6);        // set pin 6 to output
    TCCR0A = (1 << COM0A0);        // toggle OC0A on compare match               
    TCCR0B = (1 << CS00) | (1 << CS02);  // prescaler of 1024
    OCR0A  = 249;                 // count up to 250
  } 

请注意,现在它位于引脚D6(芯片上的引脚12)上,因为它使用的是硬件定时器输出。