Например TDA7294

Форум РадиоКот • Просмотр темы - Timer0 не работает ни на одном контроллере
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Ср апр 24, 2024 11:29:33

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 24 ]  1,  
Автор Сообщение
Не в сети
 Заголовок сообщения: Timer0 не работает ни на одном контроллере
СообщениеДобавлено: Сб май 23, 2020 13:43:35 
Встал на лапы
Аватар пользователя

Зарегистрирован: Вт апр 21, 2020 07:44:24
Сообщений: 118
Откуда: Сумы, Украина
Рейтинг сообщения: 0
Доброго времени всем. Сижу осваиваю таймеры на atmega8. Играюсь с разными режимами работы и т.д. Только вот непоняточка вышла одна, timer0 работающий в proteus не работает в железе, хотя параллельно ему работает timer1. Я сначала подумал, что контроллер гавкнул, заменил- результат тот же. Потом решил переключить на timer2, при таких же настройках он заработал на всех камнях, а вот нулевой не хочет. Даже 328-ю мегу взял, и на ней ничего не заработало... Поправте меня, можт это я туплю и его отдельно где включать нужно?

Спойлер
Код:
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

char dig[] = {0b10000001, 0b11110011, 0b01001001, 0b01100001, 0b00110011, 0b00100101, 0b00000101, 0b11110001, 0b00000001, 0b00100001, 0b00000000};
char razr[] = {0b11111110, 0b11111101, 0b11111011, 0b11110111};
unsigned char display[2];
unsigned char  i, a=0;
unsigned int z=0;
unsigned char dig1, dig2, dig3, dig4;

ISR(TIMER0_OVF_vect)
{
    TCNT0=178;
    a++;
    if (a>10)
    {
        z++;
        a=0;
    }
}


void write_display(unsigned char *data)
{
    unsigned char mask,i;
   
    for(i = 0; i < 2; i++)
    {
        mask = 0x80;
       
        for(char k = 0; k < 8; k++)
        {
            // Сравниваем каждый бит с единицей
            if(data[i] & mask)
            {
                PORTB |= (1 << 0); // DATA 1
                PORTB |= (1 << 1); // CLK 1
                PORTB &= ~(1 <<1); // CLK 0
            }
            else
            {
                PORTB &= ~(1 << 0); // DATA 0
                PORTB |= (1 << 1); // CLK 1
                PORTB &= ~(1 << 1); // CLK 0
            }
            mask = mask >> 1; // Сдвигаем биты
        }
    }
    // Защелкиваем регистр
    PORTB |= (1 << 2);
    PORTB &= ~(1 << 2);
}



ISR (TIMER1_COMPA_vect)
{
   
    dig4=dig[z % 10000 / 1000];
    dig3=dig[z % 1000 / 100];
    dig2=dig[z % 100 / 10];
    dig1=dig[z % 10];
   
    display[0] =  razr[3];
    display[1] = ~ dig4;
    write_display(display);
   
    display[0] =  razr[3];
    display[1] =  dig[10];
    write_display(display);
   
   
    display[0] =  razr[2];
    display[1] = ~ dig3;
    write_display(display);
   
    display[0] =  razr[2];
    display[1] =  dig[10];
    write_display(display);
   
    display[0] =  razr[1];
    display[1] =  ~dig2;
    write_display(display);
   
    display[0] =  razr[1];
    display[1] =  dig[10];
    write_display(display);

    display[0] =razr[0];    // в крайний левый символ
    display[1] =~ dig1;        // выводится цифра
    write_display(display);
   
    display[0] =  razr[0];    // в крайний левый символ
    display[1] =  dig[10];        // выводится цифра
    write_display(display); // и посылается на 74hc595
   
}
/*
*/
int main(void)
{
    DDRB = 0xFF;
    PORTB = 0x00;
    DDRC=0xff;
    PORTC=0x03;
    TCCR0A=0;
    TCNT0=178;
   
    TCCR0B=(1<<CS02)|(1<<CS00);
   
    TIMSK0|=1<<TOIE0;
   
    TCCR1A = 0x00;
    TCCR1B = (1<<WGM12) | (1<<CS11)  | (1<<CS10);
    TCNT1H = 0;
    TCNT1L = 0;
    OCR1A=5;
   
    TIMSK1 |= (1<<OCIE1A);
   
    sei();

    while (1)
    {
    }
}

_________________
Хочется всё и сразу, а получаешь нихрена и постепенно...


Вернуться наверх
 
 Заголовок сообщения: Re: Timer0 не работает ни на одном контроллере
СообщениеДобавлено: Сб май 23, 2020 14:21:08 
Тестовая прошивка для мега328П… фьюзы заводская установка (1 МГц).
На выводе РВ5 подключается светодиод. Светик переключается по переполнению таймера0. При замыкании вывода РD2 на общий (GND), светик начнёт мигать значительно медленней.

пробуй
прошивка:
Вложение:
Test Timer_0.hex


Вернуться наверх
   
 
Не в сети
 Заголовок сообщения: Re: Timer0 не работает ни на одном контроллере
СообщениеДобавлено: Сб май 23, 2020 14:42:15 
Встал на лапы
Аватар пользователя

Зарегистрирован: Вт апр 21, 2020 07:44:24
Сообщений: 118
Откуда: Сумы, Украина
Рейтинг сообщения: 0
пробуй


Спасибо. Так-то работает. Мне интересно где я ошибся. Ведь Т1 и Т2 работают сообща, а Т0 и Т1 не хотят...

_________________
Хочется всё и сразу, а получаешь нихрена и постепенно...


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
 Заголовок сообщения: Re: Timer0 не работает ни на одном контроллере
СообщениеДобавлено: Сб май 23, 2020 15:03:52 
Я не пишу на Си… потому твою программу понять не могу. Просто ты теперь уверен, что МК тут не причём. Ошибка в программе… :)

Так ты пробуешь настроить счёт по внешнему выводу Т0? А от чего такты на него поступают?

Добавлено after 5 minutes 29 seconds:
Ведь Т1 и Т2 работают сообща, а Т0 и Т1 не хотят...

Входа Т2 у меги8 и 328 нет. :) Вывод Т0 относится к таймеру0, а вывод Т1 к таймеру1. У таймера2 нет входа для внешнего тактирования.


Вернуться наверх
   
 
Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Timer0 не работает ни на одном контроллере
СообщениеДобавлено: Сб май 23, 2020 15:07:14 
Встал на лапы
Аватар пользователя

Зарегистрирован: Вт апр 21, 2020 07:44:24
Сообщений: 118
Откуда: Сумы, Украина
Рейтинг сообщения: 0
Самсусамыч, Не-не, то я так таймеры обозвал. Я просто не пойму одного, три таймера, в моей программе использую два, один из них управляет ч-х разрядным индикатором, друго просто инкрементирует переменную. Так вот в связке таймер0, таймер1- работает таймер1, в связке таймер2, таймер1 работают оба, при том что таймер0 и таймер2 настроены идентично по переполнению, а таймер1 всегда по совпадению.
Интересно, что в обеих случаях всё это работает в протеусе...

_________________
Хочется всё и сразу, а получаешь нихрена и постепенно...


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
 Заголовок сообщения: Re: Timer0 не работает ни на одном контроллере
СообщениеДобавлено: Сб май 23, 2020 15:34:07 
Я не смогу тебе помочь, так как не понимаю Си… имей просто ввиду, что у меги8 и меги238 таймера не одинаковые… то есть настройки для 8_й не подойдут для 328_й.


Вернуться наверх
   
 
Не в сети
 Заголовок сообщения: Re: Timer0 не работает ни на одном контроллере
СообщениеДобавлено: Сб май 23, 2020 15:37:45 
Встал на лапы
Аватар пользователя

Зарегистрирован: Вт апр 21, 2020 07:44:24
Сообщений: 118
Откуда: Сумы, Украина
Рейтинг сообщения: 0
Я не смогу тебе помочь, так как не понимаю Си… имей просто ввиду, что у меги8 и меги238 таймера не одинаковые… то есть настройки для 8_й не подойдут для 328_й.

Это я вкурсе, даташит под рукой, я просто сат8 портировал на ат328 чтоб убедиться, что программа не работает, а не контроллер сдох.

_________________
Хочется всё и сразу, а получаешь нихрена и постепенно...


Вернуться наверх
 
 Заголовок сообщения: Re: Timer0 не работает ни на одном контроллере
СообщениеДобавлено: Сб май 23, 2020 15:48:06 
Могу только тестовую прошивку тебе написать для проверки твоего МК с данными таймерами по твоему описанию, а ты уже прикидывай что к чему. Только меги8 у меня нет... есть только шильд ардуино нано на меге 328П... :)


Вернуться наверх
   
 
Не в сети
 Заголовок сообщения: Re: Timer0 не работает ни на одном контроллере
СообщениеДобавлено: Сб май 23, 2020 16:09:21 
Встал на лапы
Аватар пользователя

Зарегистрирован: Вт апр 21, 2020 07:44:24
Сообщений: 118
Откуда: Сумы, Украина
Рейтинг сообщения: 0
Самсусамыч, Спасибо большое, я думаю пока не стОит))

_________________
Хочется всё и сразу, а получаешь нихрена и постепенно...


Вернуться наверх
 
 Заголовок сообщения: Re: Timer0 не работает ни на одном контроллере
СообщениеДобавлено: Сб май 23, 2020 16:11:42 
:) Ладно.


Вернуться наверх
   
 
Не в сети
 Заголовок сообщения: Re: Timer0 не работает ни на одном контроллере
СообщениеДобавлено: Сб май 23, 2020 16:59:30 
Встал на лапы
Аватар пользователя

Зарегистрирован: Вт апр 21, 2020 07:44:24
Сообщений: 118
Откуда: Сумы, Украина
Рейтинг сообщения: 0
написал тестовую прошивку для таймера0, чтоб диодом помигать... Работает. Выходит, что два таймера мешают друг-другу, почему-то...

_________________
Хочется всё и сразу, а получаешь нихрена и постепенно...


Вернуться наверх
 
 Заголовок сообщения: Re: Timer0 не работает ни на одном контроллере
СообщениеДобавлено: Сб май 23, 2020 17:23:52 
Если в прерывании какого либо таймера выполнение программы будет превышать время отсчёта другого таймера то да будут мешать. Если всё нормально, то не будут. Какое время по переполнению одного и другого?


Вернуться наверх
   
 
Не в сети
 Заголовок сообщения: Re: Timer0 не работает ни на одном контроллере
СообщениеДобавлено: Сб май 23, 2020 17:30:07 
Поставщик валерьянки для Кота

Карма: 20
Рейтинг сообщений: 253
Зарегистрирован: Вс июн 19, 2016 09:32:03
Сообщений: 2090
Рейтинг сообщения: 0
Выходит, что два таймера мешают друг-другу, почему-то...

Для начала не помешало бы про volatile почитать и добавить куда следует...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Timer0 не работает ни на одном контроллере
СообщениеДобавлено: Сб май 23, 2020 17:35:59 
Встал на лапы
Аватар пользователя

Зарегистрирован: Вт апр 21, 2020 07:44:24
Сообщений: 118
Откуда: Сумы, Украина
Рейтинг сообщения: 0
Выходит, что два таймера мешают друг-другу, почему-то...

Для начала не помешало бы про volatile почитать и добавить куда следует...

Читал, добавлял. Безрезультатно. Но ведь другой таймер с той же настройкой работает ..

_________________
Хочется всё и сразу, а получаешь нихрена и постепенно...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Timer0 не работает ни на одном контроллере
СообщениеДобавлено: Сб май 23, 2020 22:19:17 
Поставщик валерьянки для Кота

Карма: 12
Рейтинг сообщений: 532
Зарегистрирован: Ср июл 17, 2013 13:55:57
Сообщений: 1978
Рейтинг сообщения: 0
a и z обязательно как volatile объявлять. Что в другом месте якобы работает - ничего не показывает. Вам правильно сказали, что надо читать про volatile. Всё, что меняется в переменных обязано быть volatile, компилятор не знает о прерываниях толком и может выкинуть код манипуляций над переменной.
Если не поможет, попоробуйте на время убрать изменение TCNT0 в прерывании. Если и это не поможет - пишите, гляну детальнее.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Timer0 не работает ни на одном контроллере
СообщениеДобавлено: Сб май 23, 2020 22:25:22 
Встал на лапы
Аватар пользователя

Зарегистрирован: Вт апр 21, 2020 07:44:24
Сообщений: 118
Откуда: Сумы, Украина
Рейтинг сообщения: 0
NStorm, Здравствуйте. Поправил код под атмега8 с использованием volatile, но ничего не изменилось. TCNT0 не изменяется, там величина постоянная.
Спойлер
Код:
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
//#include <util/delay.h>

const char dig[] = {
    0b10000001, //0
    0b11110011, //1
    0b01001001, //2
    0b01100001, //3
    0b00110011, //4
    0b00100101, //5
    0b00000101, //6
    0b11110001, //7
    0b00000001, //8
    0b00100001, //9
    0b00000000};//пусто

const char razr[] = {
    0b11111110,
    0b11111101,
    0b11111011,
    0b11110111};

unsigned char display[2];
volatile unsigned char i, a=0;
volatile unsigned int  z=0;
unsigned char dig1, dig2, dig3, dig4;


void init_timer0()
{
    TCCR0 =(1<<CS02)|(1<<CS00);
    TCNT0  =255;
   
    TIMSK|=1<<TOIE0;
    sei();
}

void init_timer1()
{
    TCCR1A = 0x00;
    TCCR1B = (1<<WGM12) | (1<<CS11)  | (1<<CS10);
    TCNT1H = 0;
    TCNT1L = 0;
    OCR1A  =1;
    TIMSK |= (1<<OCIE1A);
    sei();
}

void counter0(void)
{
    a++;
   
}

ISR(TIMER0_OVF_vect)
{
    TCNT0=255;
    counter0();
}


void write_display(unsigned char *data)
{
    unsigned char mask,i;
   
    for(i = 0; i < 2; i++)
    {
        mask = 0x80;
       
        for(char k = 0; k < 8; k++)
        {
            // Сравниваем каждый бит с единицей
            if(data[i] & mask)
            {
                PORTB |= (1 << 0); // DATA 1
                PORTB |= (1 << 1); // CLK 1
                PORTB &= ~(1 <<1); // CLK 0
            }
            else
            {
                PORTB &= ~(1 << 0); // DATA 0
                PORTB |= (1 << 1); // CLK 1
                PORTB &= ~(1 << 1); // CLK 0
            }
            mask = mask >> 1; // Сдвигаем биты
        }
    }
    // Защелкиваем регистр
    PORTB |= (1 << 2);
    PORTB &= ~(1 << 2);
}



ISR (TIMER1_COMPA_vect)
{
   
    dig4=dig[z % 10000 / 1000];
    dig3=dig[z % 1000 / 100];
    dig2=dig[z % 100 / 10];
    dig1=dig[z % 10];
   
    display[0] =  razr[3];
    display[1] = ~ dig4;
    write_display(display);
   
    display[0] =  razr[3];
    display[1] =  dig[10];
    write_display(display);
   
   
    display[0] =  razr[2];
    display[1] = ~ dig3;
    write_display(display);
   
    display[0] =  razr[2];
    display[1] =  dig[10];
    write_display(display);
   
    display[0] =  razr[1];
    display[1] =  ~dig2;
    write_display(display);
   
    display[0] =  razr[1];
    display[1] =  dig[10];
    write_display(display);

    display[0] =razr[0];    // в крайний левый символ
    display[1] =~ dig1;        // выводится цифра
    write_display(display);
   
    display[0] =  razr[0];    // в крайний левый символ
    display[1] =  dig[10];        // выводится цифра
    write_display(display); // и посылается на 74hc595
   
}
/*
*/
int main(void)
{
    DDRB  = 0xFF;
    PORTB = 0x00;
    DDRC  = 0xff;
    PORTC = 0x03;
    init_timer0();
    init_timer1();
   

    while (1)
    {
        if (a>10)
        {
            z++;
            PORTC^=1<<5;
            a=0;
        }
    }
}

_________________
Хочется всё и сразу, а получаешь нихрена и постепенно...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Timer0 не работает ни на одном контроллере
СообщениеДобавлено: Пн май 25, 2020 12:23:52 
Поставщик валерьянки для Кота

Карма: 12
Рейтинг сообщений: 532
Зарегистрирован: Ср июл 17, 2013 13:55:57
Сообщений: 1978
Рейтинг сообщения: 0
Цитата:
TCNT0 не изменяется, там величина постоянная.

Я имел в виду, не менять его в прерывании 1ой операцией. Вы его на 178 ставили. Я в ДШ не лазил чтобы проверить - некогда пока, но где-то встречал такое, что сразу в прерывании таймера нельзя менять его знаечение, иначе могут быть глитчи. Правда это может и вообще не об AVR было или вообще не было ) Но в порядке "почему бы и не проверить" написал.

А теперь вообще на 255 ставить - вот это плохая идея точно. У вас так из прерывания может никогда не вылезти МК, если прескейлер недостаточно большой будет.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Timer0 не работает ни на одном контроллере
СообщениеДобавлено: Пн май 25, 2020 13:30:42 
Вымогатель припоя

Карма: -8
Рейтинг сообщений: 49
Зарегистрирован: Вс дек 28, 2014 21:54:05
Сообщений: 615
Рейтинг сообщения: 0
Если не изменяется TCNT, значит, счётчик остановлен.

_________________
Я всё-всё узнAю и стану профессором.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Timer0 не работает ни на одном контроллере
СообщениеДобавлено: Пн май 25, 2020 13:32:31 
Мудрый кот

Карма: 20
Рейтинг сообщений: 145
Зарегистрирован: Вс дек 25, 2016 08:34:54
Сообщений: 1849
Рейтинг сообщения: 5
Alek_von_German, вы запрашиваете прерывание
Код:
   #define F_CPU 8000000UL
   TCCR1B = (1<<WGM12) | (1<<CS11)  | (1<<CS10);
   OCR1A  =1;
с частотой 32 мкс (31250 Гц),
а время выполнения вашего кода находящегося в прерывании
Код:
ISR (TIMER1_COMPA_vect)
~335 мкс (2985 Гц).


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Timer0 не работает ни на одном контроллере
СообщениеДобавлено: Пн май 25, 2020 20:27:52 
Встал на лапы
Аватар пользователя

Зарегистрирован: Вт апр 21, 2020 07:44:24
Сообщений: 118
Откуда: Сумы, Украина
Рейтинг сообщения: 0
Так. Это уже интересно. Значит выходит, что я таймером1 забираю всё время у таймера0? Грубо говоря. Мне нужно уменьшить значение таймера1?

_________________
Хочется всё и сразу, а получаешь нихрена и постепенно...


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 24 ]  1,  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: Bing [Bot] и гости: 38


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y