2015-05-13 4 views
0
#define F_CPU 8000000UL 
#include <avr/io.h> 

/* 
* main -- Main program 
*/ 
int main(void) 
{ 
    /* Set OC1A pin to be an output */ 
    DDRD|=(1<<5); 

    /* Set output compare register value */ 
    OCR1A = 4000; 


    /* Set timer counter control registers A and B so that 
    * - mode is - clear counter on compare match 
    * - output compare match action is to toggle pin OC1A 
    * - correct clock prescale value is chosen. 
    * TCCR1C can just stay as default value (0). 
    */ 

    TCCR1A |=(1<<COM0A0) | (1<<WGM12); 
    TCCR1B |= (0<<CS12) | (1<<CS11) | (1<<CS10) | (1<<WGM12) | (1<<WGM12); 

    while(1){ 

    } 
} 

У меня есть светодиод, связанный с портом OC1A, но он никогда не вспыхивает, какая-то помощь будет высоко оценена.таймеры в avr-c atmega324a

Я просмотрел лист данных и не понимаю, что еще нужно сделать, чтобы сделать светодиодную вспышку, я уверен, что это было бы просто для кого-то с любым знанием c.

+0

У Вас нет абсолютно никакой логики, что я можно увидеть, чтобы на самом деле сделать светодиодную вспышку (включение и выключение и т. д.). Начните с того, что перед тем, как играть с таймерами, загорится светодиод. – rost0031

+0

@ rost0031 Он пытается заставить светодиод мигать с помощью аппаратных таймеров. – duskwuff

+0

Хорошо, я вижу это сейчас. OP, вы уверены, что светодиод не мигает так быстро, что вы его не видите? Попробуйте отключить таймер и посмотрите, горит ли светодиод, вручную переключая выход. – rost0031

ответ

0

Прежде всего, при настройке регистров типа TCCR1A вам нужно просто назначить значение, которое вы хотите поместить в него, а не бит, который вы хотите установить с помощью того, что уже существует, поскольку вы получите нежелательное сочетание старый & новый.

Тогда попробуйте это изменить:

TCCR1A = (1 << COM1A0); //COM1A0 in stead of COM0A0, and WGM12 is not part of TCCR1A 
TCCR1B = (1 << CS11) | (1 << CS10) | (1 << WGM12); //No need to write (0 << x) for bits you don't want set, WGM12 is part of TCCR1B 

Если индикатор мигает слишком быстро, увеличьте OCR1A и/или изменить делитель (CS 10, 11 и 12)