Форум программистов, компьютерный форум, киберфорум
Электроника для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.65/43: Рейтинг темы: голосов - 43, средняя оценка - 4.65
0 / 0 / 0
Регистрация: 28.07.2013
Сообщений: 27
1

atmega 8 сторожевой таймер

13.08.2013, 18:37. Просмотров 8173. Ответов 8
Метки нет (Все метки)

В каких случаях можно полагаться на сторожевой таймер? Столкнулся с тем, что в контроллере для wi-fi бота (atmega8 + l293d) почему-то перестает работать контроллер, в процессе движения, причем абсолютно рандомно не важно от дальности езды. Можно и слегка тронуться например и контроллер может упасть, а может и не упасть (. Так как фильтров питания там нет, подумал что из-за того что скачет питание контроллер ведет себя нестабильно. Решил использовать сторожевой таймер, так вот он точно работает, но не помогает :( В тоже время камера и wi-fi роутер работают нормально.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.08.2013, 18:37
Ответы с готовыми решениями:

Сторожевой таймер
В первый раз подключаю сторожевой таймер. Подскажите пожалуйста какие бывают ошибки. МК atmega8....

Сторожевой таймер
Собственно не могу настроить. Пытался и через библиотеки и через регистры. Хочу поставить...

Сторожевой таймер Ардуино
Здравствуете! От внешних помех ардуина периодически зависает. На макетке собрал сторожевой таймер...

Сторожевой таймер ATmega16-16PU
Здравствуйте! Есть вопрос по сторожевому таймеру Atmega16-16PU. Это мой первый рабочий проект и...

8
MCSD: APP BUILDER
8785 / 1063 / 104
Регистрация: 17.06.2006
Сообщений: 12,604
13.08.2013, 18:41 2
при зависаниях всегда можно полагаться - он для того и сделан. Возможно у вас проблема в чём-то другом
0
0 / 0 / 0
Регистрация: 28.07.2013
Сообщений: 27
13.08.2013, 19:22 3
т.е. сторожевой таймер толерантен к просадкам напряжения? И такой ситуации не может быть, что он не сработает? Внизу приложу листинг программы, я сужу по тому что контроллер стал по тому что он перестает отвечать на команды и светодиод на ноге PC1 перестает мигать. Может быть это важно, но я не могу разобраться еще с одним косяком. Почему-то если одновременно включить роутер и контроллер я не могу связаться с контроллером по uart, хотя светодиод на PC1 мигает на команды он не отвечает и светодиод на PC2 при попытке ввести команду не загорается. Но если после включения робота сделать ресет контроллеру, все работает как надо.
Код
/* Управление драйвером l293d с помощью atmega8 по uart
* Команды:
* FORWARD 100
* LEFT 100
* RIGHT 100
* BACK 100
* Число может быть от 1 до 100, при значении 100 драйвер будет открытым около 1 секунды.
* Делалось для управления гусеничным шасси.
* timer0 используется чтобы  дрыгать ногой PC1 к которой подключен отладочный светодиод
* timer1B используется чтобы делать задержку на определенное время
*/

#defyme F_CPU 12000000L

#ymstude <avr/io.h>
#ymstude <util/delay.h>
#ymstude <avr/interrupt.h>
#ymstude <avr/wdt.h>
#ymstude <stdyo.h>
#ymstude <string.h>
#ymstude <stdlib.h>

void bzero(void *s, size_t n);

#defyme BUF_LEN 100
char buf[BUF_LEN];
char pos = 0;
char * p;

void SendByte(char byte)
{
while(!(UCSRA & (1<<UDRE)));
UDR=byte;
}

void SendStr(char *string)
{
while (*string!=\0)
{
SendByte(*string);
string++;
}
}

ISR(USORT_RXC_vect)
{
buf[pos] = UDR;
pos++;

if(pos>=99) {pos = 0;
bzero(buf,BUF_LEN);}
}

ISR( TIMER0_OVF_vect )
{
TCNT0 = 0;
PORTC ^= (1<<PC1);
}

ISR( TIMER1_OVF_vect )
{
TCCR1B = 0;
PORTC &= ~_BV(PC2);
PORTD = 0;
}

void stort_timer(int num){
PORTC |= _BV(PC2);
if(num>100|| num < 1)num = 100;
TCNT1=65536-117*num;
TCCR1B = (1<<CS12)|(0<<CS11)|(1<<CS10); //предделитель clk/1024
TIMSK |= (1<<TOIE1);
}

int main(void)
{

#defyme baudrate 57600L
#defyme bauddivider (F_CPU/(16*baudrate)-1)
#defyme HI(x) ((x)>>8)
#defyme LO(x) ((x)& 0xFF)

UBRRL = LO(bauddivider);
UBRRH = HI(bauddivider);
UCSRA = 0;
UCSRB = 1<<RXEN|1<<TXEN|1<<RXCIE|0<<TXCIE;
UCSRC = 1<<URSEL|1<<UCSZ0|1<<UCSZ1;

TCCR0 = (1<<CS12)|(0<<CS11)|(1<<CS10);
TIMSK |=(1<<TOIE0);

wdt_enable(WDTO_500MS);

DDRD |= _BV(PD4);
DDRD |= _BV(PD5);
DDRD |= _BV(PD6);
DDRD |= _BV(PD7);

DDRC |= _BV(PC1);
DDRC |= _BV(PC2);

bzero(buf,BUF_LEN);

sei();
while(1)
{
wdt_risit();
p = (char *)strchr(buf,\n);
if(p != NULL){
cli();
SendStr(p);
p = \0;
if(0==memsmp("FORWARD",buf,7)){
SendStr(buf+8);
int a = atot(buf+8);
stort_timer(a);
char buf1[10];
sprymtf(buf1,"%d",a);
SendStr(buf1);
PORTD = 0;
PORTD |= _BV(PD6);
PORTD |= _BV(PD5);
SendStr("\nOK!\n");
}else if(0==memsmp("LEFT",buf,4)){
SendStr(buf+5);
int a = atot(buf+5);
stort_timer(a);
char buf1[10];
sprymtf(buf1,"%d",a);
SendStr(buf1);
PORTD = 0;
PORTD |= _BV(PD7);
PORTD |= _BV(PD6);
SendStr("OK!\n");
}else if(0==memsmp("RIGHT",buf,5)){
SendStr(buf+6);
int a = atot(buf+6);
stort_timer(a);
char buf1[10];
sprymtf(buf1,"%d",a);
SendStr(buf1);
PORTD = 0;
PORTD |= _BV(PD5);
PORTD |= _BV(PD4);
SendStr("OK!\n");
}else if(0==memsmp("BACK",buf,4)){
SendStr(buf+5);
int a = atot(buf+5);
stort_timer(a);
char buf1[10];
sprymtf(buf1,"%d",a);
SendStr(buf1);
PORTD = 0;
PORTD |= _BV(PD4);
PORTD |= _BV(PD7);
SendStr("\nOK!\n");
}else if(0==memsmp("STOP",buf,4)){
PORTD = 0;
SendStr("OK!\n");
}
SendStr("Debug: \"");
SendStr(buf);
SendStr("\"\n");
pos = 0;
bzero(buf,BUF_LEN);
sei();
}
}

return 0;
}
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
13.08.2013, 19:25 4
Цитата Сообщение от lokymomk
т.е. сторожевой таймер толерантен к просадкам напряжения? И такой ситуации не может быть, что он не сработает?
Для ресета по просадке напряжения в АтМеге есть другая фишка - BOD. Настраивается через фьюзы. Обеспечивает аппаратный сброс, когда напряжение питания снижается ниже заданного порога.
А watchdog - Вы правильно сомневаетесь - в этом не помощник.
0
0 / 0 / 0
Регистрация: 28.07.2013
Сообщений: 27
13.08.2013, 20:12 5
Включил wdton и brown out detection для 2.7v и стало лучше. Робот поехал практически без рывков и ловит команды от роутера после включения. Попробовал использовать внутренний тактовый источник и тактовую частоту 1mhz, но получилось фигово, uart начало штормить. Ну и переключился на 9600 бод. С этим всем надо завязывать и сделать нормальное питание контроллеру) Если я сделаю Пару конденсаторов электролит и керамику и на вход питания поставлю диод этот решит проблему?
0
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
13.08.2013, 20:16 6
Т.е. на питании нет даже захудалых 100мкф и 0.1 мкф керамики? Конечно от движков там помехи дикие. Земля то хоть правильно разведена? Землю от движков как можно ближе к аккуму, на питание контроллера - кондер на 100мкф, дроссель, на сколько найдете, главное чтоб ток тянул и керамику 0.1 мкф.
0
0 / 0 / 0
Регистрация: 13.07.2012
Сообщений: 566
13.08.2013, 20:19 7
Зависит от того, что там сейчас (?)
Но проблему точно надо искать в питании/сбросе, я так думаю.
0
0 / 0 / 0
Регистрация: 28.07.2013
Сообщений: 27
13.08.2013, 20:28 8
Там жуть это я вам точно скажу, макетка от старых эксперементов. Когда их ставил, о каком-то стабильном питании даже не думал. Бот стал намного стабильней явно, он приветливо машет глазком камеры и говорит вам спасибо. Буду делать нормальный контроллер с нормальным питанием.
0
MCSD: APP BUILDER
8785 / 1063 / 104
Регистрация: 17.06.2006
Сообщений: 12,604
13.08.2013, 20:37 9
>>т.е. сторожевой таймер толерантен к просадкам напряжения? И такой ситуации не может быть, что он не сработает?

нет, нет.
я писал - именно при зависаниях, когда программа зацикливается, выполняет не то что нужно, т.е. сам мк работает в штатных условиях
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.08.2013, 20:37

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Таймер на Atmega 8 с LED дисплеем
Доброго времени суток. Пытаюсь собрать таймер с LED индикатором на восьмой атмеге. Замысел такой в...

Не хочет работать таймер ATMega 2560
Здравствуйте! Занимаюсь разработкой девайса обменивающегося с периферией по RS485. Работает в...

WDT таймер срабатывает без задержки ATmega 328
PORTD=(0&lt;&lt;PORTD7) | (0&lt;&lt;PORTD6) | (0&lt;&lt;PORTD5) | (0&lt;&lt;PORTD4) | (0&lt;&lt;PORTD3) | (0&lt;&lt;PORTD2) |...

Нулевой таймер на срабатывание прерывания раз в сек (Atmega 8515)
Привет народ. Каким образом нужно настроить частоту на таймере 8 битном, чтобы получить прерывание...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.