реклама на сайте
подробности

 
 
> Таймер на Atmega8, Работает при симуляции, но не работает в железе
shatov
сообщение Oct 16 2013, 03:19
Сообщение #1





Группа: Новичок
Сообщений: 5
Регистрация: 17-09-13
Пользователь №: 78 360



Таймер на Atmega8.

Таймер должен считать дни, питание от 3В. При нажатии на кнопку INT0 высвечивается счет секунд (нужно для проверки работоспособности таймера), при повторном нажатии высвечиваются отсчитанные дни. В спящий режим таймер переходит при нажатии на кнопку в третий раз, либо по истечении 5 сек с момента нажатия на кнопку в первый раз:

if (secL==5) {flagbutton=0;}
if (secL>9) {secH++; secL=0; flagbutton=0;}


Также необходим reset, но не замыканием соответствующего вывода на землю, а так, чтобы человек перепутав кнопки не сбросил свое насчитанное. Поэтому Reset осуществляется при последовательном нажатии int0 и зажимании PB5, т.е. нажав только PB5 таймер не сбросить.

Два индикатора: на одном отображаются единицы (PORTC), на другом - десятки (PORTD).
Т.к. питание от двух пальчиковых батареек, то необходим power save mode, поэтому ставлю внешний часовой кварц и по нему считает timer2.
Из спящего режима МК выходит по низкому уровню на INT0.

При симуляции всё работает, но при реализации на макетной плате ничего не выходит. Не пойму ошибку в коде. На этой же плате проверялась более простая версия прошивки (файл: as_work.c). Reset подтянул через 10k к питанию, кварц выдает что то похожее на нужную частоту с размахом около 0,5В. МК никак не реагирует на нажатие кнопки (INT0). Даже если бы совпадали моменты обнуления flagbutton и нажатия, то при повторном нажатии индикатор должен был бы показать число. МК обрабатывает нажатие INT0, т.к. ток потребления увеличивается (подключал к лабораторному БП), также варьировал с питанием (от 3 до 5В). Если кнопку не трогать, БП показывает ноль по потреблению тока, значит МК находится в режиме Powre Save и при нажатие обрабатывается прерывание... но почему ничего не выводится на сегменты, не могу понять.


#include <mega8.h>
#include <delay.h>

char sec=0;
int min=0;
int hour=0;
char secH=0, secL=0;
int flagbutton=0;
char dayH=0, dayL=0;


interrupt [EXT_INT0] void ext_int0_isr(void)
{
flagbutton++;
}

interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
secL++;
if (secL==5) {flagbutton=0;}
if (secL>9) {secH++; secL=0; flagbutton=0;}
if (secH>5) {secH=0;}
if (sec>59) {min++; sec=0;}
if (min>59) {hour++; min=0;}
if (hour>23) {dayL++; hour=0;}
if (dayL>9) {dayH++; dayL=0;}
if (dayH>9) {dayH=0;}
}

void main(void)
{
PORTB=0x20;
DDRB=0x1F;
PORTD=0x04;
DDRD=0x3B;
PORTC=0x00;
DDRC=0xFF;

ASSR=0x08;
TCCR2=0x05;
TCNT2=0x00;
OCR2=0x00;

GICR|=0x40;
GIFR=0x40;

MCUCR=0xB0;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x40;

#asm("sei");

while (1)
{while (flagbutton==1)
{
switch(secL)
{
case 0:{PORTC=~0xC0; PORTB.0=0; break;}
case 1:{PORTC=~0xF9; break;}
case 2:{PORTC=~0xA4; PORTB.0=1; break;}
case 3:{PORTC=~0xB0; break;}
case 4:{PORTC=~0x99; break;}
case 5:{PORTC=~0x92; PORTB.0=1; break;}
case 6:{PORTC=~0x82; break;}
case 7:{PORTC=~0xF8; PORTB.0=0; break;}
case 8:{PORTC=~0x80; PORTB.0=1; break;}
case 9:{PORTC=~0x90; break;}
};

switch(secH)
{
case 0:{PORTD=~0x40; break;}
case 1:{PORTD=~0x79; break;}
case 2:{PORTD=~0xA0; break;}
case 3:{PORTD=~0x30; break;}
case 4:{PORTD=~0x19; break;}
case 5:{PORTD=~0x12; break;}
case 6:{PORTD=~0x02; break;}
case 7:{PORTD=~0x78; break;}
case 8:{PORTD=~0x00; break;}
case 9:{PORTD=~0x10; break;}
};
}
while (flagbutton==2)
{
switch(dayL)
{
case 0:{PORTC=~0xC0; PORTB.0=0; break;}
case 1:{PORTC=~0xF9; break;}
case 2:{PORTC=~0xA4; PORTB.0=1; break;}
case 3:{PORTC=~0xB0; break;}
case 4:{PORTC=~0x99; break;}
case 5:{PORTC=~0x92; PORTB.0=1; break;}
case 6:{PORTC=~0x82; break;}
case 7:{PORTC=~0xF8; PORTB.0=0; break;}
case 8:{PORTC=~0x80; PORTB.0=1; break;}
case 9:{PORTC=~0x90; break;}
};

switch(dayH)
{
case 0:{PORTD=~0x40; break;}
case 1:{PORTD=~0x79; break;}
case 2:{PORTD=~0xA0; break;}
case 3:{PORTD=~0x30; break;}
case 4:{PORTD=~0x19; break;}
case 5:{PORTD=~0x12; break;}
case 6:{PORTD=~0x02; break;}
case 7:{PORTD=~0x78; break;}
case 8:{PORTD=~0x00; break;}
case 9:{PORTD=~0x10; break;}
};
};

PORTD=0x04; PORTC=0x00; PORTB.0=0;
#asm("sleep");
}

}

Прикрепленные файлы
Прикрепленный файл  Timer_7sg.rar ( 33.86 килобайт ) Кол-во скачиваний: 10
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
alexeyv
сообщение Oct 18 2013, 03:11
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



2 Tarbal:
Где case 3: ??
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Oct 18 2013, 11:28
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(alexeyv @ Oct 18 2013, 07:11) *
2 Tarbal:
Где case 3: ??

Sorry

case 2:
if(button_pressed())
{
state = 3;
timeout = 5;
}
break;

case 3:
if(--timeout == 0)

Цитата(Палыч @ Oct 18 2013, 08:55) *
IMHO, вредный совет для разработки устройств с батарейным питанием.


Это почему это?
От прерывания можно просыпаться, но использовать его для обработки нажатия дребезжащей кнопки очень нехорошо. Я видел как люди боролись с нестингом, создавая ненужные сущности.
В итоге они создавали програмных монстров и франкенштейнов.

Цитата(shatov @ Oct 16 2013, 07:19) *
При симуляции всё работает, но при реализации на макетной плате ничего не выходит.


При симуляции у Вас нет дребезжащей кнопки, поэтому условие сравнивания количества нажатий с единицей проходит. В реальности количество нажатий больше единицы и сравнение с единиицей не выстреливает.

Сообщение отредактировал Tarbal - Oct 18 2013, 11:24
Go to the top of the page
 
+Quote Post
Палыч
сообщение Oct 18 2013, 12:45
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Tarbal @ Oct 18 2013, 15:28) *
Это почему это?
От прерывания можно просыпаться, но использовать его для обработки нажатия дребезжащей кнопки очень нехорошо.

Чтобы не "создавать ненужные сущности".
Я понимаю, что кому то нравиться поллинг, кому то прерывания... Но, коль в данном случае мы вынуждены пользоваться прерыванием, то накладывать на него ещё и поллинг - это и есть "ненужные сущности". Методы борьбы с дребезгом кнопки, подключенной к линии генерации прерывания int0 - банальны: аккуратно запретить прерывание от int0 на время несколько бОльшее, чем время дребезга.

to TC
Прошу прощения, выше я Вам дал "вредный" совет - использовать прерывание по спаду для фиксации факта нажатия на кнопку. Дело в том, что выход из "Idle mode" возможен только по уровню, но никак не по перепаду...
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Oct 18 2013, 14:03
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(Палыч @ Oct 18 2013, 16:45) *
Чтобы не "создавать ненужные сущности".
Я понимаю, что кому то нравиться поллинг, кому то прерывания... Но, коль в данном случае мы вынуждены пользоваться прерыванием, то накладывать на него ещё и поллинг - это и есть "ненужные сущности". Методы борьбы с дребезгом кнопки, подключенной к линии генерации прерывания int0 - банальны: аккуратно запретить прерывание от int0 на время несколько бОльшее, чем время дребезга.

to TC
Прошу прощения, выше я Вам дал "вредный" совет - использовать прерывание по спаду для фиксации факта нажатия на кнопку. Дело в том, что выход из "Idle mode" возможен только по уровню, но никак не по перепаду...


Мне не нравится ни поллинг ни прерывания. Я применяю то, что больше подходит.
Мое решение выверено временем я применял его в устройствах, которые больше 15 лет уже работают причем в больших количествах. Кстати и свидетелем неуемной борьбы с нестингом прерываний дребезжащего контакта я тоже был. Пока я не переделал на поллинг проблемы не кончались. Манипуляция с запретом прерываний на время это беда.


Палыч, а хотите я расскажу вам про приоритеты прерываний то, что я знаю давно, а вы не знаете.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Oct 18 2013, 16:45
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Tarbal @ Oct 18 2013, 18:03) *
Я применяю то, что больше подходит.
И, это - правильно. Полностью с Вами согласен.
Цитата(Tarbal @ Oct 18 2013, 18:03) *
Манипуляция с запретом прерываний на время это беда.
Возможно, вы недопоняли... Речь шла не о полном (глобальном) запрете прерываний, а о врЕменном запрете только прерывания INT0,
Цитата(Tarbal @ Oct 18 2013, 18:03) *
Палыч, а хотите я расскажу вам про приоритеты прерываний то, что я знаю давно, а вы не знаете.
Если Вы знаете что-то такое о прерываниях в AVR, что не отражено в документации производителя, то - расскажите. Эта информация, вероятно, будет полезна многим. Наверное, уместнее будет это сделать в специально созданной для этого теме.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Oct 18 2013, 18:04
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(Палыч @ Oct 18 2013, 20:45) *
И, это - правильно. Полностью с Вами согласен.
Возможно, вы недопоняли... Речь шла не о полном (глобальном) запрете прерываний, а о врЕменном запрете только прерывания INT0,

Проходили это. Не нашли хорошего решения.


Цитата(Палыч @ Oct 18 2013, 20:45) *
Если Вы знаете что-то такое о прерываниях в AVR, что не отражено в документации производителя, то - расскажите. Эта информация, вероятно, будет полезна многим. Наверное, уместнее будет это сделать в специально созданной для этого теме.

Да я просто выпендриться захотел сгоряча. Однако есть один тонкий момент с пониманием приоритета прерывания, о котором мало кто думает. Знать может и знают, но не осознают.
Дело в том, что в мелких микропроцессорах если обрабатывается прерывание, другое прерывание вызвать обработчик не сможет. Однако есть такое понятие как приоритет прерываний. Что оно означает? Оно означает в каком порядке будут вызываться прерывания, которые ждали обработки, пока либо обрабатывалось прерывание, либо прерывания были запрещены.
Однако в более мощных процессорах есть приоритет прерывания, означающий, что прерывание может прервать обработчик низкоприоритетного прерывания. Таким образом есть два различных понятия, которые называются одинаково.

Сообщение отредактировал Tarbal - Oct 18 2013, 18:08
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- shatov   Таймер на Atmega8   Oct 16 2013, 03:19
- - Палыч   Цитата(shatov @ Oct 16 2013, 07:19) ... н...   Oct 16 2013, 04:30
|- - shatov   Цитата(Палыч @ Oct 15 2013, 18:30) Вероят...   Oct 16 2013, 05:17
|- - Abell   Цитата(shatov @ Oct 16 2013, 09:17) На од...   Oct 16 2013, 10:27
|- - shatov   Цитата(Abell @ Oct 16 2013, 01:27) Извиня...   Oct 16 2013, 11:18
|- - Abell   Цитата(shatov @ Oct 16 2013, 15:18) обнул...   Oct 16 2013, 11:23
||- - shatov   Цитата(Abell @ Oct 16 2013, 02:23) Да, уж...   Oct 16 2013, 11:58
||- - Abell   Цитата(shatov @ Oct 16 2013, 15:58) Тогда...   Oct 16 2013, 12:02
||- - Палыч   Цитата(shatov @ Oct 16 2013, 15:58) Сдела...   Oct 16 2013, 12:20
||- - Abell   Цитата(shatov @ Oct 16 2013, 15:58) Даже ...   Oct 18 2013, 04:28
|- - Палыч   Цитата(shatov @ Oct 16 2013, 15:18) Пробл...   Oct 16 2013, 11:31
- - Abell   Цитата(shatov @ Oct 16 2013, 07:19) ... п...   Oct 16 2013, 04:41
- - Tarbal   Дребезг исключается другим образом. Во первых не с...   Oct 18 2013, 02:25
|- - Палыч   Цитата(Tarbal @ Oct 18 2013, 06:25) Во пе...   Oct 18 2013, 04:55
- - alexeyv   2 Tarbal: Где case 3: ??   Oct 18 2013, 03:11
|- - Палыч   Цитата(Tarbal @ Oct 18 2013, 22:04) ...ес...   Oct 18 2013, 20:03
- - shatov   Решил переделать программно, поставив вторую кнопк...   Oct 18 2013, 19:10
|- - Tarbal   Цитата(shatov @ Oct 18 2013, 23:10) P.S. ...   Oct 18 2013, 20:52
|- - Abell   Цитата(shatov @ Oct 18 2013, 23:10) Решил...   Oct 19 2013, 05:37
||- - Палыч   Цитата(Abell @ Oct 19 2013, 09:37) Вот эт...   Oct 19 2013, 06:53
||- - Abell   Цитата(Палыч @ Oct 19 2013, 10:53) Гм-м-м...   Oct 19 2013, 08:40
||- - Палыч   Цитата(Abell @ Oct 19 2013, 12:40) примен...   Oct 19 2013, 09:09
||- - Tarbal   Я многие годы делаю так: 1. Настраиваю таймер выз...   Oct 20 2013, 15:57
||- - Abell   Цитата(Tarbal @ Oct 20 2013, 19:57) Я мно...   Oct 21 2013, 12:50
||- - Tarbal   Цитата(Abell @ Oct 21 2013, 16:50) Ему сп...   Oct 21 2013, 16:21
||- - Abell   Цитата(Tarbal @ Oct 21 2013, 20:21) А как...   Oct 21 2013, 16:56
||- - Tarbal   Цитата(Abell @ Oct 21 2013, 20:56) А я и ...   Oct 21 2013, 16:57
||- - Палыч   Цитата(Tarbal @ Oct 21 2013, 20:57) А как...   Oct 21 2013, 18:54
||- - Tarbal   Цитата(Палыч @ Oct 21 2013, 22:54) Замеча...   Oct 21 2013, 19:07
|- - ae_   Цитата(shatov @ Oct 19 2013, 04:10) ... c...   Oct 19 2013, 07:01
- - smk   Вот такую строчку допишите: #include <avr/inter...   Oct 19 2013, 07:25
- - ILYAUL   Во ,разведка вопрос задал Тут только носители язы...   Oct 21 2013, 14:33


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 12:12
Рейтинг@Mail.ru


Страница сгенерированна за 0.01479 секунд с 7
ELECTRONIX ©2004-2016