我试图让它打开和关闭第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;
}
}
答案 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)上,因为它使用的是硬件定时器输出。