Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.65/34: Рейтинг темы: голосов - 34, средняя оценка - 4.65
krokodomdy
0 / 0 / 0
Регистрация: 04.07.2015
Сообщений: 21
1

Счет по прерыванию таймера0

07.07.2015, 19:53. Просмотров 6043. Ответов 10
Метки нет (Все метки)

Ну почему я не могу так написать.
На семисегментник не выводится число из массива http://pastebin.com/abgSVGKq

Код
#define F_CPU 8000000UL

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

short unsykned int k = 0;
volatile unsykned int tic=0;
volatile char tic1=0,tic2=0, tic3=0;
unsykned int Day = 0, Hh = 0, h = 0, Mm = 0, m = 0, Ss = 0, s = 0, ms = 0;

Массивы для вывода

const unsykned char codes[10]={0x14,0xD7,0x4C,0x45,0x87,0x25,0x24,0x57,0x4,0x5}; // 0-1-2-3-4-5-6-7-8-9
unsykned char counter[4]={0x08,0x04,0x02,0x01};
unsykned char data[4]={0x14,0x14,0x14,0x14};

ISR(TIMER0_OVF_vect)
{
//отключаем, считаем от нуля до трех, переключаем разряд и снова включаем
PORTC=255;
(k == 3) ? k = 0 : k++;
PORTD = data[k];
PORTC = counter[k];
// сразу для обоих портов =)

tic=tic+1; //каждые 488 преравания таймера это секунда
if (tic >= 488)
{
tic1 = tic/488;   // Секунды
tic=0;
}

if (tic1 >= 60)
{
tic2 = tic1/60;   // Минуты
tic1 = 0;
}

if (tic2 >= 60)
{
tic3 = tic2/24;   // Часы
tic2 = 0;
}

if (tic3 >= 24)       // Сутки
{
tic3 = 0;
}
}

void init_timer (void)
{

TIMSK0 = (1<<TOIE0);
TCCR0B = (0<<CS02)|(1<<CS01)|(1<<CS00) ; //8.000.000/64 = 125.000 тиков в сек. (0-1-1 - делитель на 64)

}

int main (void)
{
cli();
DDRC = 255; // готовим порты
DDRD = 255;
PORTD = 0;
init_timer ();    // готовим таймер/счетчик 0
sei ();

//Главный цикл...
while(1)
{

s = tic1;    // эта переменная - полноценная секунда!
m = tic2;    // минута
h = tic3;    // час

//Day = tic3;  // день

//далее попытка вывести s в разряд...
data[3]=codes[s];

}
return 1;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.07.2015, 19:53
Ответы с готовыми решениями:

Сброс задержки по прерыванию
Приветствую всех! Существует ли способ по внешнему прерыванию проскочить задержку _delay_ms()?...

Работа UART по прерыванию
Доброго времени суток, уважаемые форумчане! Я делаю систему контроля на Atmega16A-AU, котрая...

Пробуждение микроконтроллера по прерыванию с АЦП
Всем привет, Разрабатываю систему, которая должна постоянно следить за уровнем шума вокруг, и, раз...

Активация-деактивация ШИМ по прерыванию в PIC18F4550
Всем привет, появился один вопрос по автоматическому выключению/включению ШИМ в PIC18f4550. Хочу...

Данные таймера-счетчика по внешнему прерыванию
мк AT90S8535 программа которая по внешнему сигналу учитывает показания таймера- счетчика 1(через...

10
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
08.07.2015, 13:00 2
Я сейчас в командировке, в омске. Буду на днях, выложу пример.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
14.07.2015, 09:28 3
Так, я только что приехал. Как обещал, пример в архиве. Файлы с действующего проекта. Видео этого проекта.

[5.23 Кб]
0
krokodomdy
0 / 0 / 0
Регистрация: 04.07.2015
Сообщений: 21
13.08.2015, 05:41 4
Все круто, спасибо, но я тоже уезжал =) Поэтому не видел - интернета не было. Зато в дороге все написал. И даже больше. Проблема теперь с кнопками.
Надо, чтобы нажал и подержал 3 секунды, отпустил - вкл. переход с сек на мин, зажал на 3 сек еще, отпустил - перешли с настройки мин на часы. Далее таким макарычем пускаем цикл. Ну а если не отпускаем, то если дольше 5 сек, то при отжатии должны перейти в какой нибудь слиип режим. но о слиипе я еще не думал. Сделать хотя бы переход по 3-м или по 5-ти секундам =))) Этого для начала вполне хватит.
Щас все выложу. Как бы код выложить и картинки диаграмм?
0
13.08.2015, 05:41
krokodomdy
0 / 0 / 0
Регистрация: 04.07.2015
Сообщений: 21
13.08.2015, 05:49 5
Тут файлик для XMIND Pro и программка
Ну и сам код тут
https://yody.sk/d/0n6BihnuiSVvF

файл в архиве тоже самое, что и switch case.h. Почему-то залился switch case.h
switch case - технология не получилась, потому это черновик из проекта Студии6.
Основную функцию, которую надо мучить называется get_button_set();
В ней вместо else if ((PINB & 0x04)==0x00)
раньше стояло else if (BATTN_PCINT_OPERATION == 14)
Красивая идея была, детектить нажатие прерыванием, но я решил пока упростить с этой функцией и попытаться наконец домучить кнопку. Поэтому особо не обращайте внимание на ISR PCINT0. Для этой кнопки она отключена. Теперь просто if ((PINB & 0x04)==0x00) - Проверим нажата ли кнопка по адресу 0х04,
если на ней ноль- то все хорошо. Идем дальше... Ну дальше счет сначала до трех, ну а если не отжали кнопку, то до пяти и больше. По отжатию должен был включаться переход на минуты... Ну и все в таком духе. =)
Результат, конечно, вышел неожиданным. Нажатие на кнопку и её удержаие ничего не вызывает. Для проверки я обычно ставлю S++; в различных кусках программы, чтобы сразу видеть, до какого места программы наш счетчик команд дошел и где затык. Пока пишу, думаю, поставить после...
Ну а в файле майнд показана идея, как я её вижу. Опять где-то ошибочка.

Что до куска:
if (flag_sec == 1) && (flag_pouse == 1)
{ (t == 6) ? t = 0 : } //[ правда оставлять пустой третью часть после двоеточия - неправильно. я ставил просто t;. Вроде картину работы это не портит ],

...то это как раз должна быть задержка, ибо я не фан делэя. Когда ставил делэй - никрасиво отключался на короткое время семисегментник. Что как раз логично.
В нижней части показан основной алгоритм работы всей программы, без подробностей и без изменения (t++). Я ведь писал его первым, а верхний кусок - вторым.
Дальше, в верхней части набит вызов всей процедуры начиная со входа int и детекции нажатия else if ((PINB & 0x04)==0x00) ну и далее...
Пока вроде все изложил
Да...
И если захотите дописать в файле Xmindа что либо, то переход на следующую строчку в пиктограммах осуществляется не интером а связкой интера и контрола.
Перетаскиванием пиктограммочек зажав контрал не дает им прилепляться ведомыми к другим.
Прога удобная и простая. Пользуйте наздоровье

Затык с кнопками получился достаточно долгим. Примерно длиною почти в месяц. Пока был затык с ними, довел до ума таймер =)
Вот такая веселая история в журнале ералаш.

Еще вдобавок мне сложно проводить отладку в студии из-за неопытности. Не пойму как смотреть значения переменных от итерации и до итерации. А я бы посмотрел бы, чего там происходит, например с той же переменной t.

В итоге я прихожу к выводу, что при нажатии на кнопку у меня нет входа в тело, даже после того как t=4 или =6.
if (((t>3)&&(t<5))&&((PINB & 0x04)==0x00)) {...}
ИЛИ
else if ((t>5)&&((PINB & 0x04)==0x00)) {...}
Можно t задать до 10-ти... Как-то пофих.
В итоге...
Слов нет, одни эмоции =)
0
krokodomdy
0 / 0 / 0
Регистрация: 04.07.2015
Сообщений: 21
14.08.2015, 00:51 6
Помогите пожалуйста развить данную тему. Интересно начать понимать, что надо делать. Ведь пока у меня только догадки.
Библиотеками я не стану пока пользоваться. Надо понять как надо делать и почему может не работать.
Тут я что-то сделал не верно. Что сделал не верно, пока понять не могу. Спасибо всем, кто поможет мне разложить алгоритм правильно.
И не плохо бы поменять немножко название темы. Например - Кнопка и рукопашный приём с задержкой
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
14.08.2015, 11:06 7
Автоматное программирование.

[4.47 Кб]
0
krokodomdy
0 / 0 / 0
Регистрация: 04.07.2015
Сообщений: 21
17.08.2015, 07:22 8
Цитата Сообщение от dymyurk1978
Автоматное программирование.
Приехал с фермы. Сейчас начну изучение. Настроение как раз способствует.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
17.08.2015, 09:43 9
Я перезалил архив. Добавлены программные таймеры.
0
krokodomdy
0 / 0 / 0
Регистрация: 04.07.2015
Сообщений: 21
18.08.2015, 01:41 10
Цитата Сообщение от dymyurk1978
Я перезалил архив. Добавлены программные таймеры.
качнул. разбираться буду ночью. Днем работал...
Спасибо
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
18.08.2015, 09:45 11
Цитата Сообщение от krokodomdi
...
Пример основного цикла
Код
//========================================================================
__C_task main ()
{
wdt_enable (WDTO_15_MS);

/*
dsp_buf [0] = 1;
dsp_buf [1] = 2;
dsp_buf [2] = 3;
dsp_buf [3] = 4;
dsp_buf [4] = 5;
dsp_buf [5] = 6;
*/

init_sys_timer ();

__enable_interrupt ();

Init_Ivimts ();

while (1)
{
__watchdog_risit ();

service_timers ();

proc_amplifier ();

proc_7_segm_ind ();

Process_Ivimts ();
}
}
//========================================================================
Кстати. Вот видео. Семисегментники играют тестовую роль. Проверку кодов кнопок. Это что-то вроде прототипа управления музыкальным центром. На тот момент реализованы: прием команд с пульта. Обработка кнопок. Обработчик алгоритма управления муз. центром. Семисегментник. И вывод информации на VFD дисплей.
Никаких диспетчеров, RTOS. Почти все работает в основном цикле. Прерывания: прием команд с пульта, системный таймер. Как видите, при разумном подходе работает все. Семисегментники не моргают.
Пример основного цикла взят из этого проекта.
0
18.08.2015, 09:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.08.2015, 09:45

Изменение ШИМа, по прерыванию с кнопки. (Таймер и Пин)
Здравствуйте, не знаю как добром описать, ситуация такая. С таймера B запушен ШИМ, значение...

Доделать прогу измерения частоты на вход ТС0 по прерыванию
Нужно написать программу (ATMEGA8515) для измерения частоты сигнала (хотя бы до 10 кГц),...

АЦП по прерыванию
Разбираюсь с АЦП, пока накидал программу-вольтемтр, которая опрашивают ногу и раз в секунду...


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

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

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