Помогите разобраться со счётчиками.

Обсуждаем контроллеры компании Atmel.
Ответить
Открыл глаза
Сообщения: 58
Зарегистрирован: Сб ноя 12, 2016 09:41:00

Сообщение narius985 »

Что-то я не понимаю. пределитель у меня стоит 1024, значит за 1 секуду счётчик считает до 3906. но почему когда я симулирую в протеусе, там задержка намного больше чем 1 секунда. что так, ведь у меня по сравнению когда считает до 3906. МК атмега8.
#define F_CPU 4000000l
#include
#include
#include
unsigned char i;
unsigned char temp, direction;
void wait1 (void)
{
TCNT1 = 0;
while (TCNT1 < 3906){};
}
void segchar (unsigned char seg)
{
switch (seg)
{
case 1: PORTD = 0b11111001; break;
case 2: PORTD = 0b10100100; break;
case 3: PORTD = 0b10110000; break;
case 4: PORTD = 0b10011001; break;
case 5: PORTD = 0b10010010; break;
case 6: PORTD = 0b10000010; break;
case 7: PORTD = 0b11111000; break;
case 8: PORTD = 0b10000000; break;
case 9: PORTD = 0b10010000; break;
case 0: PORTD = 0b11000000; break;
}
}
ISR (TIMER1_COMPA_vect)
{
for (i=0;i<10;i++)
{
segchar(i);
wait1();
}
}

int main(void)
{
DDRC = 0x00;
PORTC |= (1 << PC0); // Подключаем внутренний подтягивающий резистор
DDRD = 0xFF;
PORTD = 0x00;

TCCR1B = (1 << CS12)|(1 << CS10)|(1 << WGM12); //предделитель clk/1024, режим таймера СТС
OCR1A = 3906; // Выбор коэффициента деления
TIMSK |= (1 << OCIE1A); // Разрешение прерывания по совпадению

temp = 0; // Присвоение начального значения

sei(); // Разрешение прерываний

while(1)
{

}
}
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

а зачем задержка в задержке?
у тебя таймер и так настроен так, чтобы прерывание вызывалось с нужной частотой, а в нём ты ещё таймер мучаешь
функция wait1(); нафиг не нужна

Добавлено after 2 minutes 47 seconds:
и цикл фор тоже не нужен, само прерывание и есть цикл:
прерывание()
{
вывод(i);
i++;
если (i>9) i=0;
}
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
Открыл глаза
Сообщения: 58
Зарегистрирован: Сб ноя 12, 2016 09:41:00

Сообщение narius985 »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3164519#p3164519"]а зачем задержка в задержке?
у тебя таймер и так настроен так, чтобы прерывание вызывалось с нужной частотой, а в нём ты ещё таймер мучаешь
функция wait1(); нафиг не нужна

Добавлено after 2 minutes 47 seconds:
и цикл фор тоже не нужен, само прерывание и есть цикл:
прерывание()
{
вывод(i);
i++;
если (i>9) i=0;
}[/uquote]
сделал всё как ты сказал, всё равно счёт идёт не 1 секунда, а больше
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

частоту ему в свойствах кристалла вбей

Добавлено after 34 seconds:
ему - это протеусу
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
Эиком - электронные компоненты и радиодетали
Открыл глаза
Сообщения: 58
Зарегистрирован: Сб ноя 12, 2016 09:41:00

Сообщение narius985 »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3164531#p3164531"]частоту ему в свойствах кристалла вбей

Добавлено after 34 seconds:
ему - это протеусу[/uquote]
вот что я написал и всё равно ничего не поменялось
Вложения
Безымянный.png
(135.46 КБ) 219 скачиваний
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

у тебя фьюзами 1 мГц выставлен - попробуй внешнее тактированик туда выставить или кварц

Добавлено after 1 minute 51 second:
и ватчдог выключи, раз не используется
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
Открыл глаза
Сообщения: 58
Зарегистрирован: Сб ноя 12, 2016 09:41:00

Сообщение narius985 »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3164544#p3164544"]у тебя фьюзами 1 мГц выставлен - попробуй внешнее тактированик туда выставить или кварц

Добавлено after 1 minute 51 second:
и ватчдог выключи, раз не используется[/uquote]
всё сработало, спасибо тебе добрый человек

Добавлено after 1 minute 10 seconds:
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3164544#p3164544"]у тебя фьюзами 1 мГц выставлен - попробуй внешнее тактированик туда выставить или кварц

Добавлено after 1 minute 51 second:
и ватчдог выключи, раз не используется[/uquote]
слушай а если я буду не в протеусе, а в реальной жизни делать, мне что тоже фьюзы менять что ли придётся, или как.
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

есть внутренний RC генератор - от его частот и пляши; вроде можно выбрать 1, 2, 4 и 8 мегагерц, а если нужна точность ставь кварц и ориентируйся на его частоту
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Открыл глаза
Сообщения: 58
Зарегистрирован: Сб ноя 12, 2016 09:41:00

Сообщение narius985 »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3164555#p3164555"]есть внутренний RC генератор - от его частот и пляши; вроде можно выбрать 1, 2, 4 и 8 мегагерц, а если нужна точность ставь кварц и ориентируйся на его частоту[/uquote]
а смыссл вообще в программе пи ать строку #define F_CPU 4000000L, если всё равно частота фьюзами выставляется
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

настраивается фьюзами. с ними надо быть осторожным - не правильно поставишь и кристалл останется без генератора (переключится на внешний) и тогда программатор просто так его уже не увидит

Добавлено after 1 minute 24 seconds:
это для функции DELAY если эта переменная будет отличаться от реальной частоты - программные задержки будут неправильны

Добавлено after 2 minutes 58 seconds:
также эту константу используют многие функции работы с периферией (с экранами например) для выставления задержек
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

[uquote="narius985",url="/forum/viewtopic.php?p=3164557#p3164557"]а смыссл вообще в программе пи ать строку #define F_CPU 4000000L, если всё равно частота фьюзами выставляется[/uquote]
Так делать и не следует. Следует задавать в Makefile макрос -DF_CPU=4000000L чтобы она подставлялась во ВСЕ используемые файлы. Некоторые среды разработки позволяют это же делать графически.
Вообще, эта макроконстанта нужна для задержек, иногда автоматической настройки периферии и прочего.
Ответить

Вернуться в «AVR»