Страница 1 из 1
Помогите с таймером на atmega8
Добавлено: Сб окт 11, 2014 13:19:43
sirha
Никак не могу разобраться с таймером
пытаюсь разобраться с самым простым переполнением но ничего непонимаю
Тактовая частота микроконтроллера Fcpu = 8000000 Гц
Период тактового сигнала микроконтроллера Tcpu = 1/Fcpu
Период тактового сигнала таймера Т0 равен Tt0 = (1/Fcpu)/k = k/Fcpu
это я понил,все посчитал но ничего не получается
Код: Выделить всё
#include <mega8.h>
#include <delay.h>
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
PORTD.0=0;
TCNT1H=0xE1;
TCNT1L=0x7C;
}
void main(void)
{
DDRD=0x01; // как выход
TIMSK=0x04;
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0xE1;
TCNT1L=0x7C;
#asm("sei")
while (1)
{
PORTD.0=1;
}
}
посчитал переполнение таймера для 1 секунды
почему в реальности светодиод горит но не тухнет?
еле еле мерцает и горит, как будто мигает очень быстро
где ошибка ?
хочется чтобы светодиод горел 1 сек и тух на 1 секунду
вроде бы все правильно написал
Re: Помогите с таймером на atmega8
Добавлено: Сб окт 11, 2014 14:37:04
Pink-Pank
Зачем тем нафлудил? Тебе же написали в "Таймерах и счетчиках".
Светодиод у тебя тухнет, но потом тут же обратно зажигается циклом while. И происходит это настолько быстро, что ты не успеваешь этого даже заметить.
Re: Помогите с таймером на atmega8
Добавлено: Сб окт 11, 2014 14:41:52
sirha
Pink-Pank писал(а):
Светодиод у тебя тухнет, но потом тут же обратно зажигается циклом while. И происходит это настолько быстро, что ты не успеваешь этого даже заметить.
но я же сделал задержку где он тухнет
Re: Помогите с таймером на atmega8
Добавлено: Сб окт 11, 2014 14:44:13
Pink-Pank
Где у тебя там какая задержка? Ты его тушишь в прерывании и тут же возвращаешься в главный цикл, где зажигаешь.
Re: Помогите с таймером на atmega8
Добавлено: Сб окт 11, 2014 14:45:48
sirha
Pink-Pank писал(а):Где у тебя там какая задержка?
TCNT1H=0xE1;
TCNT1L=0x7C;
а это разве не задержка??
я могу написать delay_ms но вреде в прерываниях так писать нельзя
Re: Помогите с таймером на atmega8
Добавлено: Сб окт 11, 2014 14:49:43
Pink-Pank
Это не задержка. Это изменение значения счетчика таймера. У тебя просто таймер будет чаще срабатывать благодаря таким манипуляциям.
В прерываниях так писать можно. Но не нужно. Я бы программистам, которые такое пишут в прерываниях, руки бы отрывал. Но если у тебя кроме диода в камне ничего больше не будет - то можешь и так решить эту проблему. А вообще, правильным вариантом будет кусок кода из твоего поста в "таймерах". заводишь переменную и в прерывании меняешь ее значение на обратное и в нем же отправляешь ее новое значение в порт. а в главном цикле вообще ничего не делаешь. А вообще, можешь и без переменной значение порта менять.

Re: Помогите с таймером на atmega8
Добавлено: Сб окт 11, 2014 14:59:46
sirha
Спасибо огромное

Re: Помогите с таймером на atmega8
Добавлено: Сб окт 11, 2014 15:03:43
Pink-Pank
"Спасибо" под моей авой находится!

Re: Помогите с таймером на atmega8
Добавлено: Сб окт 11, 2014 15:16:01
ks0
sirha писал(а):Тактовая частота микроконтроллера Fcpu = 8000000 Гц
Период тактового сигнала микроконтроллера Tcpu = 1/Fcpu
Период тактового сигнала таймера Т0 равен Tt0 = (1/Fcpu)/k = k/Fcpu
Только (1/Fcpu)*k если k целое
Re: Помогите с таймером на atmega8
Добавлено: Сб окт 11, 2014 15:18:23
sirha
Код: Выделить всё
#include <mega8.h>
#include <delay.h>
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
PORTD.0=1;
}
void main(void)
{
PORTD=0x00;
DDRD=0x01; // как выход
TIMSK=0x04;
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0xE1;
TCNT1L=0x7C;
#asm("sei")
while (1);
}
почему тут светодиод загорается но не тухнет не пойму?
ведь на порту весит ноль PORTD=0x00; прерывание же выполниться и опять должен ноль появиться
Re: Помогите с таймером на atmega8
Добавлено: Сб окт 11, 2014 15:20:54
ks0
Re: Помогите с таймером на atmega8
Добавлено: Сб окт 11, 2014 15:24:30
sirha
Работает))
обьясните почему так происходит
Re: Помогите с таймером на atmega8
Добавлено: Сб окт 11, 2014 15:25:05
Pink-Pank
Либо так:
либо так:
обьясните почему так происходит
А это все от невнимательности и спешки.

А если серьезно, то в каждом прерывании у тебя меняется значение порта на противоположное. А в том куске, что ты написал, оно всегда устанавливается в одно и то же значение. И пофиг ему, что до этого оно 0-м было - после прерывания-то его никто в 0 обратно не скидывает
Re: Помогите с таймером на atmega8
Добавлено: Сб окт 11, 2014 15:38:09
sirha
Pink-Pank писал(а): И пофиг ему, что до этого оно 0-м было - после прерывания-то его никто в 0 обратно не скидывает
странно конечно
ведь счетчик постоянно считает а регистр
обратно не присваивается
Не понимаю вот эту надпись-
как тут меняется значение 1 и 0 ?
обьясните пожалуста
^ - побитное или с отрицанием
1 и 1
0 и 0
все это равно 0
1 и 0 равно 1
токо я все равно не пойму нужно сравнивать два бита типо
равен 1 биту =
00000001
не понятно все равно как изменяется значение
Re: Помогите с таймером на atmega8
Добавлено: Пн окт 13, 2014 07:08:44
Pink-Pank
А чего, собственно, не понятно?
Имеется у тебя в порту какое-то значение. Допустим, 0.
Операция исключающее или этого значения с числом 1 дает в результате 1 (значения разные - 1, значения одинаковые - 0). Ты эту единицу загоняешь в порт.
При следующем срабатывании таймера у тебя в порту прошлая 1-ца. Операция исключающего или с числом 1 в этом случае уже дает 0, который отправляется в порт, как новое значение.
И т.д.
Другими словами, исключающее или с 0 не меняет значения, а с 1-цей меняет на противоположное.
Re: Помогите с таймером на atmega8
Добавлено: Вт окт 14, 2014 10:22:40
sirha
Понял c трудом,а как PIND.0=1?; PIND - ЭТО ВРОДЕ ЗНАЧЕНИЕ ВХОДА ,не пойму - это вроде операция в основном для кнопок,как тут светодиод зажигается и гаснет?
Re: Помогите с таймером на atmega8
Добавлено: Вт окт 14, 2014 13:09:47
Pink-Pank
В новых релизах МК сделали возможность изменения значения выхода на противоположный при отправке в этот порт единицы. Смотрите новейшие даташиты. Раньше этот порт имел смысл только при чтении (для кнопок, как Вы выразились)