Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
3 / 3 / 1
Регистрация: 22.11.2009
Сообщений: 61
1

ATmega8. Постоянный сброс?!

23.12.2012, 20:01. Показов 3017. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть программа (код ниже) которая подает на порт сигналы и тем самым приводит в движение шаговый двигатель. В таком виде как есть сейчас — работает. Но стоит избавиться от сторожевого таймера, функция main() постоянно начинается сначала. Такое впечатление что происходит сброс. В чём косяк, может я неправильно выбрал подход решения задачи или упустил какую-нибудь важную мелочь. Помогите пожалуйста разобраться.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/wdt.h>
#include <avr/sleep.h>
 
#define SETBIT(ADDRESS,BIT) (ADDRESS |= (1<<BIT)) 
#define CLEARBIT(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))
#define CHECKBIT(ADDRESS,BIT) (ADDRESS & (1<<BIT))
 
//Массив шагов
char ShagiMikroshag[8] = {0b10010000, 0b10011001, 0b00001001, 0b01101001, 0b01100000, 0b01100110, 0b00000110, 0b10010110};
 
signed char NomerShaga; //Переменная содержащая номер текущего шага
 
unsigned int getADC(void) //Считывание АЦП 10 бит, значение от 0..1024
{ unsigned int v;
 
ADCSRA|=(1<<ADSC);  //Начать преобразование
 
while ((ADCSRA&_BV(ADIF))==0x00) //Дождатся окончания преобразования
;
 
v=(ADCL|ADCH<<8);
return v / 4;
}
 
void Vrashenie(void)
{
    if ( !CHECKBIT(PIND,0) )
    {
        NomerShaga++;
        if (NomerShaga > 7) { NomerShaga = 0; }
    }
    else
    {
        NomerShaga--;
        if (NomerShaga < 0) { NomerShaga = 7; }
    }
    PORTB = 0b00000000;
    PORTB = ShagiMikroshag[NomerShaga];
}
 
ISR (INT0_vect) //Прерывание INT0
{
    Vrashenie();
}
 
ISR (TIMER2_COMP_vect)
{
    //Сбрасываем сторожевой таймер
    Vrashenie();
}
 
int main(void)
{
//Инициализируем переменную номера шага
NomerShaga = 0;
//Порт на вход
DDRD = 0b00000000;
PORTD= 0b00000010;
//Порт на выход
DDRB = 0b11111111;
PORTB= 0b00000000;
 
if ( !CHECKBIT(PIND,1) ) //Если на выводе "0" – запускаемся в режиме тестирования
{
    //перенастраиваем порт
    PORTD= 0b00000011;
    //Включаем АЦП, тактовая частота бреобразователя =/8 от тактовой микроконтроллера
    ADCSRA=(1<<ADEN)|(1<<ADPS1)|(1<<ADPS0); 
    //Внутренний источник опорного напряжения Vref=2,56, входом АЦП является PA0
    ADMUX=(0<<REFS1)|(1<<REFS0)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0);
    //инициализация таймеров
    TCCR2=(1<<CS22)|(0<<CS21)|(1<<CS20)|(0<<WGM21)|(1<<WGM20); //делитель 1024, режим OCR0 TOP
    OCR2 = getADC(); //Устанавливаем новый делитель для таймера
    ADCSRA=(0<<ADEN); //Выключаем АЦП
    TIMSK=(1<<OCIE2)|(0<<TOIE2);
} else
{   
    //настраиваем прерывания
    MCUCR=(0<<ISC01)|(1<<ISC00);
    GICR=(1<<INT0);
}
 
//Включаем прерывания
sei();
 
wdt_enable(WDTO_500MS);
 
while(1) //Вечный цикл, все что в нем будет выполнятся постоянно
{
//Тут располагается код программы, которая будет выполнятся в основном цикле
//Сбрасываем сторожевой таймер
wdt_reset();
}
 
return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.12.2012, 20:01
Ответы с готовыми решениями:

Сброс фьюзов Atmega8
Здравствуйте! Использовал калькулятор фьюзов, в списке типа частотных генераторов увидел что есть...

Разница между ATMEGA8-16AI и ATMEGA8-16AU
Кто подскажет, в чем разница между ATMEGA8-16AI и ATMEGA8-16AU. Смотрю в Платане цены между ними...

Постоянный сброс приложений по умолчанию
Имеется Windows 10.0.16299.15 (v. 1709). При попытке в параметрах установить приложения по...

Постоянный массив указателей на постоянный массив Delphi
Здравствуйте! Столкнулся с проблемой. Мне нужно объявить постояннный массив указателей на...

5
10231 / 6609 / 498
Регистрация: 28.12.2010
Сообщений: 21,156
Записей в блоге: 1
23.12.2012, 22:13 2
1- ремите оба вызова вотчдога?
2- цепи питания МК защищены от помех со стороны движка?
1
97 / 92 / 0
Регистрация: 24.04.2010
Сообщений: 275
24.12.2012, 11:48 3
Цитата Сообщение от nikitasnv777 Посмотреть сообщение
В таком виде как есть сейчас — работает. Но стоит избавиться от сторожевого таймера, функция main() постоянно начинается сначала.
Избавиться - т.е. закоментировать, убрать строку wdt_reset(); ?

Если так, то отключите вачдог
вместо wdt_enable(WDTO_500MS); написать wdt_disable;
0
3 / 3 / 1
Регистрация: 22.11.2009
Сообщений: 61
24.12.2012, 22:00  [ТС] 4
Да, спасибо за подсказку. Были проблемы с питанием. Запитка по типовой схеме подключения (конденсатор на 47uF и 100nF по питанию МК) решила проблему.
Теперь без вотчдога всё отлично работает)
0
10231 / 6609 / 498
Регистрация: 28.12.2010
Сообщений: 21,156
Записей в блоге: 1
25.12.2012, 00:37 5
...при работе с двигателями также желательно организовывать LC-фильтр, т.е. в вашем случае добавить в разрыв к +Uпит (МК) -> дроссель.
1
3 / 3 / 1
Регистрация: 22.11.2009
Сообщений: 61
26.12.2012, 21:57  [ТС] 6
Спасибо за совет, учту.
0
26.12.2012, 21:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.12.2012, 21:57
Помогаю со студенческими работами здесь

Сброс настроек / Архивация и Сброс
Samsung Galaxy Note 3 ОС и прошивка: Android 5.0 Описание проблемы: Добрый вечер дамы господа,...

Постоянный запрос из БД
В общем в БД у меня хранится билеты, и мне нужно что бы определенное время выполнялся запрос и...

Постоянный += или ++
Подскажите плиз, как сделать функцию, чтобы пока жмёшь на кнопку она делала инкремент, а когда...

Постоянный ток
Скоростной лифт массой m=1600 кг за время t=300c поднимается на высоту h=30 м. Определите силу тока...

Постоянный взлом
Пожалуйста, помогите. Постоянно взламывают компьютер. Операционная система Windows 10. Какие можете...

Постоянный BSOD
Здравствуйте. Постараюсь максимально описать суть проблемы: выключилась электроэнергия на ПК...

Постоянный BSOD
Добрый вечер , с покупки компьютера начались BSODы , по началу были редко и грешил на пиратскую...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru