Вопрос по коду СИ(Таймер)

Обсуждаем контроллеры компании Atmel.
Ответить
Открыл глаза
Сообщения: 64
Зарегистрирован: Вт сен 10, 2019 16:18:33

Сообщение 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 порта В,обнулили и выключили источник тактирования,что бы не мигал
}
Реклама
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

Кто мешает каждый раз перед вызовом функции выставлять TCCR1B в нужное значение?
Реклама
Открыл глаза
Сообщения: 64
Зарегистрирован: Вт сен 10, 2019 16:18:33

Сообщение shrus43 »

я так и делал,но вторая задержка либо не работает,либо какая то из двух не коректно,если флагами блочить,ну я всякие варики попробовал,но чет не получается,не хватает грамотности в этом деле,в книжках не нашел решение данной проблемы,подмигивает изредко через некоторое время,с пин включает оптопару и через нее магнитный пускатель включается,когда это кратковременное включение пина через некоторое время начинается,то даже пускатель не успевает разомкнуть свои контакты,настолько мала и еле заметная,не мешает но смущает ппц,какое-то не верное написание кода
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Сообщение parovoZZ »

Предделитель сбрасывай.
Реклама
Эиком - электронные компоненты и радиодетали
Открыл глаза
Сообщения: 64
Зарегистрирован: Вт сен 10, 2019 16:18:33

Сообщение shrus43 »

Сброшен TCCR1B=0;
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

вторая задержка работает,только вот работает не коректно,изредко через некоторое время на микросекунды еле заметно включается пин
Каким боком пин может относиться к задержке ?
Вы смешали всё в кучу, отсюда и проблемы. Делайте задержку как отдельную единицу кода, а работу с портом - отдельно.
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение 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;
  }
}
И пишите также, чтобы сами видели что где. Писанина в одну строчку - бред.
OKF
Это не хвост, это антенна
Сообщения: 1405
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

[uquote="NStorm",url="/forum/viewtopic.php?p=3964892#p3964892"]И пишите также, чтобы сами видели что где. Писанина в одну строчку - бред.[/uquote]
Не только бред, но и быдлокодинг. Неуважение ни себя, ни других.
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Сообщение parovoZZ »

[uquote="shrus43",url="/forum/viewtopic.php?p=3964818#p3964818"]Сброшен TCCR1B=0;[/uquote]
В предделителе нет такого регистра.
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

Вообще это делается не так. Высталвяется пин и запускается таймер в режиме CTC со счетом до нужного значения. А в прерывании выставляем порт назад как надо.
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Рекомендую почитать цикл статей Татарчевского. Применение
SWITCH технологии при разработке прикладного программного обеспечения для микроконтроллеров. На многое глаза раскроет. Сразу скажу, не бойтесь сложностей, поймёте потом, что на самом деле все просто.
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

Какое же неудачное и я бы даже сказал дурацкое название для статей о конечных автоматах на switch/case. Статьи с виду нормальные (мельком глянул первые 2 части), но название что-то прям совсем не о том... "SWITCH технологии" как-то ужасно звучит.
Мне кажется ТС рано в КА еще. Хотя бы с азами программирования для начала надо разобраться. Применение масок, нормальный стиль кода и т.д. Чтобы вместо вот этой простыни научиться писать PORTB &= _BV(PB0)|_BV(PB1)|_BV(PB2)|_BV(PB3), и т.д. Потом с таймерами разобраться, режимами и практическому применению. А уже потом, когда и если понадобится что-то более сложное, где нужно реализовывать несколько задач - тогда уже и почитать что-нибудь про КА.
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Switch-Case технология. Всё правильно. И ни фига не рано. Я эти статьи читал ещё на этапе ассемблера. Язык не важен. Важен сам подход. Псевдопараллельность процессов-задач.
А свитч кейс или индексный переход - тоже не важно.
Контактная информация:
Ответить

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