Перейти к содержанию

mappy89

Members
  • Постов

    316
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные mappy89

  1. Доброго времени суток. Задался целью сделать генератор прямоугольных импульсов на atmega16 с регулируемой частотой и длительностью импульса, поэтому возникло несколько вопросов:

    - нужно ли использовать ЦАП или достаточно будет на прерывание от таймера повесить что то вроде PORTA^=(1<<1);

    - каким образом задаётся время импуьлса? прокатит ли вариант с использованием delay в прерывании от таймера, например

    PORTA|=(1<<1);
    _delay_ms(100); // время импульса 100 мсек
    PORTA&=~(1<<1);
    

    какие вообще подводные камни есть при создании генератора на контроллере?

    Заранее спасибо.

  2. Здраствуйте, имеется микроконтроллер atmega16 с внешним кварцом на 8 МГц и частотомер. Вопрос: каким образом измеряется частота МК внешним частотомером?

    Пробовал померить на ногах, куда подключён кварц, но из за этого таймер сбивается, а использовать дополнительную ногу с запрограммированной подачей/откючением 5 в от таймера неохото (т.к. измерения частоты нужны для метрологов )

  3. Спасибо за подсказки

    hd44780, не понял приведённый Вами пример из -за магических чисел =) Вы могли бы привести пример установки таймера на прерывание , скажем, 1кГц при частоте 8 МГц?

    Для 1 секунды у меня получилось следующее:

    void SetupTIMER1 (void)
    {
    
    TCCR1B = (1<<CS12); // делитель на 256
    TCNT1 = 34285;   //     
        /* Enable timer 1 overflow interrupt. */
        TIMSK = (1<<TOIE1);
    }
    
    ISR (TIMER1_OVF_vect)
    {
    timer++; 
    TCNT1 = 34285;
    }   
    

    А чкакой делитель нужно установить для прерывания 1000 раз в секунду?

  4. Доброго времени суток, включив в схему кварц на 8МГц задался вопросом, как настроить прерывани я таймера с интервалом 1 секунда

    void SetupTIMER1 (void)
    {
    
    TCCR1B = (1<<CS02)|(1<<CS01); //External clock source on T0 pin. Clock on falling edge. прерывания от внешнего источника
    TCNT1 = 65536-62439; //коррекция счетчика, чтобы время было ровно 1 секунда - данный участок кода я не понял
    /* Enable timer 1 overflow interrupt. */
    TIMSK = (0<<TOIE1);
    }
    
    

    Подкорректируйте, пожалуйста, мой код, если он неверен, и помтгите разобраться со строкой "TCNT1 = 65536-62439; ", а именно как скорректировать счётчик на время 1 секунда

    Заранее спасибо

  5. Доброго всем дня.

    Вопрос ,по моему, уже задавался, но проблема так и осталась: включение жк-дисплея DV-20400S 4-х строчный (hd44780), а точнее отображение символов на нём после подачи питания, происходит нерегулярно. Т.е. происходит инициализация, а затем просто чистый дисплей, однако если "замкнуть" пальцем с 1 по 6 контакты дисплея, символы иногда появляются.

    Дисплей включён по стандартной схеме, никаких конденсаторов и дополнительных элементов помимо резисторов и контроллера нет, программа на МК рабочая. В чём здесь может быть проблема?

    Заранее спасибо.

  6. Добрый день.

    Имеется TX буфер, в который записываются отправляемые данные из USARTA. Буфер - массив unsigned char. По умолчанию пустой, т.е. в каждой ячейке его содержится '\0' (как показывает Протеус)

    Чтобы отослать новую порцию данных, очищаю Tx буфер такой функцией (упрощена):

    
    void USART_clear()
    {
    for (int i=0; i<16; i++)
    USART_SendStr('\0');
    }
    

    Однако после этого протеус выдаёт значения элементов буфера 0xFF, соответсвенно приёмник вместо пустых ячеек видит какую то кашу. Как нужно правильно очищать такой буфер?

×
×
  • Создать...