Страница 1 из 1
Вопрос по коду СИ(Таймер)
Добавлено: Чт янв 21, 2021 22:09:51
shrus43
Вопрос по таймеру,запускаю функцию Taimer_zaderhgka(); все работает,только мне надо несколько раз запускать ее в разных местах кода,естественно второй раз она не работает так как обнулил регистр TCCR1B,если я делаю вторую такую же функцию например Taimer_zaderhgka_1();только в этом регистре заново выставляю источник тактирования TCCR1B=0b00000010;,тобишь как я думаю запускаю таймер и после выполнения условия его опять обнуляю,вторая задержка работает,только вот работает не коректно,изредко через некоторое время на микросекунды еле заметно включается пин периодически,это в протэусе видно и в железе точно так же,я понимаю,что что-то не так делаю ввиду своей не грамотности в этом деле,пробовал всякие манипуляции с флагами и переменными адекватного ничего не получилось,подскажите пожалуйста как правильно запускать и останавливать один и тот же таймер несколько раз. МК атмега 328,другие таймеры будут использоваться для других дел
static void Taimer_zaderhgka(void)
{
if(PIND.4==0&&TCNT1L==0x00&&TCNT1H==0x00){PORTB.1=0;PORTB.2=0;PORTB.4=0;PORTB.3=0;}//
if(PIND.4==0&&TCNT1L==0x00&&TCNT1H==32)
{PORTB.1=1;PORTB.2=0;PORTB.4=0;PORTB.3=0;TCNT1L=0;TCNT1H=0;TCCR1B=0;}//#asm("cli")
//таймер дотикал до 32 включился пин 1 порта В,обнулили и выключили источник тактирования,что бы не мигал
}
Re: Вопрос по коду СИ(Таймер)
Добавлено: Чт янв 21, 2021 22:58:40
NStorm
Кто мешает каждый раз перед вызовом функции выставлять TCCR1B в нужное значение?
Re: Вопрос по коду СИ(Таймер)
Добавлено: Чт янв 21, 2021 23:10:31
shrus43
я так и делал,но вторая задержка либо не работает,либо какая то из двух не коректно,если флагами блочить,ну я всякие варики попробовал,но чет не получается,не хватает грамотности в этом деле,в книжках не нашел решение данной проблемы,подмигивает изредко через некоторое время,с пин включает оптопару и через нее магнитный пускатель включается,когда это кратковременное включение пина через некоторое время начинается,то даже пускатель не успевает разомкнуть свои контакты,настолько мала и еле заметная,не мешает но смущает ппц,какое-то не верное написание кода
Re: Вопрос по коду СИ(Таймер)
Добавлено: Пт янв 22, 2021 00:36:56
parovoZZ
Предделитель сбрасывай.
Re: Вопрос по коду СИ(Таймер)
Добавлено: Пт янв 22, 2021 00:53:12
shrus43
Сброшен TCCR1B=0;
Re: Вопрос по коду СИ(Таймер)
Добавлено: Пт янв 22, 2021 03:26:54
Аlex
вторая задержка работает,только вот работает не коректно,изредко через некоторое время на микросекунды еле заметно включается пин
Каким боком пин может относиться к задержке ?
Вы смешали всё в кучу, отсюда и проблемы. Делайте задержку как отдельную единицу кода, а работу с портом - отдельно.
Re: Вопрос по коду СИ(Таймер)
Добавлено: Пт янв 22, 2021 08:15:15
NStorm
А еще, код надо выкладывать вот так, а не так, как вы. Чтобы читать было можно:
Код: Выделить всё
static void Taimer_zaderhgka(void) {
if (PIND.4 == 0 && TCNT1L == 0x00 && TCNT1H == 0x00) {
PORTB.1 = 0;
PORTB.2 = 0;
PORTB.4 = 0;
PORTB.3 = 0;
}
if (PIND.4 == 0 && TCNT1L == 0x00 && TCNT1H == 32) { //таймер дотикал до 32 включился пин 1 порта В,обнулили и выключили источник тактирования,что бы не мигал
PORTB.1 = 1;
PORTB.2 = 0;
PORTB.4 = 0;
PORTB.3 = 0;
TCNT1L = 0;
TCNT1H = 0;
TCCR1B = 0;
}
}
И пишите также, чтобы сами видели что где. Писанина в одну строчку - бред.
Re: Вопрос по коду СИ(Таймер)
Добавлено: Пт янв 22, 2021 09:51:51
OKF
[uquote="NStorm",url="/forum/viewtopic.php?p=3964892#p3964892"]И пишите также, чтобы сами видели что где. Писанина в одну строчку - бред.[/uquote]
Не только бред, но и быдлокодинг. Неуважение ни себя, ни других.
Re: Вопрос по коду СИ(Таймер)
Добавлено: Пт янв 22, 2021 10:07:29
parovoZZ
[uquote="shrus43",url="/forum/viewtopic.php?p=3964818#p3964818"]Сброшен TCCR1B=0;[/uquote]
В предделителе нет такого регистра.
Re: Вопрос по коду СИ(Таймер)
Добавлено: Пт янв 22, 2021 10:48:29
NStorm
Вообще это делается не так. Высталвяется пин и запускается таймер в режиме CTC со счетом до нужного значения. А в прерывании выставляем порт назад как надо.
Re: Вопрос по коду СИ(Таймер)
Добавлено: Сб янв 23, 2021 08:45:10
Demiurg
Рекомендую почитать цикл статей Татарчевского. Применение
SWITCH технологии при разработке прикладного программного обеспечения для микроконтроллеров. На многое глаза раскроет. Сразу скажу, не бойтесь сложностей, поймёте потом, что на самом деле все просто.
Re: Вопрос по коду СИ(Таймер)
Добавлено: Сб янв 23, 2021 09:47:27
NStorm
Какое же неудачное и я бы даже сказал дурацкое название для статей о конечных автоматах на switch/case. Статьи с виду нормальные (мельком глянул первые 2 части), но название что-то прям совсем не о том... "SWITCH технологии" как-то ужасно звучит.
Мне кажется ТС рано в КА еще. Хотя бы с азами программирования для начала надо разобраться. Применение масок, нормальный стиль кода и т.д. Чтобы вместо вот этой простыни научиться писать PORTB &= _BV(PB0)|_BV(PB1)|_BV(PB2)|_BV(PB3), и т.д. Потом с таймерами разобраться, режимами и практическому применению. А уже потом, когда и если понадобится что-то более сложное, где нужно реализовывать несколько задач - тогда уже и почитать что-нибудь про КА.
Re: Вопрос по коду СИ(Таймер)
Добавлено: Сб янв 23, 2021 15:01:17
Demiurg
Switch-Case технология. Всё правильно. И ни фига не рано. Я эти статьи читал ещё на этапе ассемблера. Язык не важен. Важен сам подход. Псевдопараллельность процессов-задач.
А свитч кейс или индексный переход - тоже не важно.