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

Подскажите рабочий пример

09.01.2012, 14:49. Показов 26504. Ответов 50
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Изучаю микроконтроллеры. Вот застрял на таймерах и прерываниях :(
Пользуюсь CodeVision, микроконтроллер mega8515. Есть макетная плата где уже есть МК (mega8515), индикатор (E40361-l-0-8-w), индикатор связал с транзисторами через резисторы. Могу статично или динамически высветить цифры. А теперь хочется сделать с этого таймер(секундомер) с кнопками старт-стоп, часы. Подскажите пример работы с таймером и прерываниями на С для этого. Заранее спасибо.
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.01.2012, 14:49
Ответы с готовыми решениями:

Подскажите РАБОЧИЙ пример диалога да\нет
Гугл конечно много это мусора находит, но оно все именно не рабочий мусор.Как например вот этот...

Подскажите рабочий пример по использованию TThread
Если Вам не трудно, дайте ссылку или скиньте тут рабочий пример любого воздействия на форму из...

Рабочий пример бд
кто может, напишите рабочий пример работы с бд на основе sqliteHelper что бы можно было сохранить...

Рабочий пример авторизации в ВК
подкиньте рабочий пример для авторизации в вк

50
0 / 0 / 0
Регистрация: 26.11.2011
Сообщений: 816
09.01.2012, 18:22 2
Цитата Сообщение от Дивлит
Изучаю микроконтроллеры. Вот застрял на таймерах и прерываниях :(
Пользуюсь CodeVision, микроконтроллер mega8515. Есть макетная плата где уже есть МК (mega8515), индикатор (E40361-l-0-8-w), индикатор связал с транзисторами через резисторы. Могу статично или динамически высветить цифры. А теперь хочется сделать с этого таймер(секундомер) с кнопками старт-стоп, часы. Подскажите пример работы с таймером и прерываниями на С для этого. Заранее спасибо.
Я точно не знаю как в CodeVision, но в WinAVR это выглядит гдето так:
ISR (SIG_OUTPUT_COMPORE1){
TCNT1H = 0X00;
TCNT1L = 0X00;
s++;
if (s>59){s = 0; m++;}
if (m>59){m = 0; h++;}
if (h>24){h = 0;}
}
int main(void){
DDRC = 0xFF;
PORTC = 0X00;
DDRD = 0xFF;
PORTD = 0X00;
DDRA = 0xFF;
PORTA = 0X00;
DDRB = 0xFF;
PORTB = 0X00;
TIMSK = 0x10;
TCNT1H = 0X00;
TCNT1L = 0X00;
OCR1AH = 0X0F;
OCR1AL = 0X41;
TCCR1A = 0x00;
TCCR1B = 5; //Внутренний делитель
sei(); //Запрет прерываний
while (1){
}
}
Но не стоит забывать что mega8515 честно говоря не очень удачный МК. У неё всего два таймера один из нох вобще фигня (его обычно используют для засечения временных интервалов всего в 8 бит), а другой более мение, это Т1 он может работать в режиме часов реального времени он с делителем и разрядностью 16 бит. Эти регистры выглядят так OCR1AH - старший и OCR1AL - младший.
После не джолгих лет эксплуатации mega8515 на смену пришла более продвинутая mega8535.
0
0 / 0 / 0
Регистрация: 08.03.2011
Сообщений: 181
09.01.2012, 18:27 3
Цитата Сообщение от Дивлит
Подскажите пример работы с таймером и прерываниями на С для этого. Заранее спасибо.
Посмотри эту эту и эту статьи. В исходниках к ним найдёшь необходимые тебе примеры.
0
Дивлит
09.01.2012, 18:42 4
МК Miko8515 у меня исключительно учебный материал, когда освою достаточно, буду выбирать мк по даташитам. Если считаете, что теряю время зацикливаясь именно на этом мк, то готов выслушать Ваше мнения по более удачному сочетанию СРЕДЫ ПРОГРАММИРОВАНИЯ И МИКРОКОНТРОЛЛЕР. Язык программирования "С" менять на ассемблер, пока не хочу. С - мне понятнее. В данный момент мне надо теорию закрепить на практике. Я пробую разные коды для этого мк переделать, пока не очень удачно. Буду благодарен если кто то поделиться удачными примерами (опытом, знаниями или подсказками). Цель, освоить работу таймеров и прерывании.
0 / 0 / 0
Регистрация: 26.11.2011
Сообщений: 816
09.01.2012, 18:56 5
Цитата Сообщение от s_btosk
Цитата Сообщение от Дивлит
Подскажите пример работы с таймером и прерываниями на С для этого. Заранее спасибо.
Посмотри эту эту и эту статьи. В исходниках к ним найдёшь необходимые тебе примеры.

Во первых контроллер куда более серьёзнее чем Miko8515. Ну и ко всему там же всё понятно описано что:
TIMSK0 = 0x01;//Разрешение прерывания по переполнению таймера 0
TCCR1B = 0x0C;//Таймер 1 - отсчёт 1 сек для измерения температуры и индикации "движущейся чёрточки"
OCR1A = 31250;//Для отсчёта 1 сек
TIMSK1 = 0x02;//разрешение прерывания по сравнению А таймера 1
TCCR2B = 0x07;//Таймер 2 для опроса клавиатуры раз в 32 мс
TIMSK2 = 0x01;//разрешение прерывания по переполнению таймера 2

И ещё обрати внимание используются таймеры Т0, Т1А и Т2, при этом Т0 и Т2 по переполнению, а Т1А по совпадению (это разные режимы).
А обрабатывать эти прерывания производятся Т2 так:
ISR (TIMER2_OVF_vect) //опрос клавиатуры раз в 32 мс
{
if (bit_is_clear(PIN_key, enter_key)) kod_key = enter;
else if (bit_is_clear(PIN_key, up_key)) kod_key = up;
else if (bit_is_clear(PIN_key, down_key)) kod_key = down;
else if (bit_is_clear(PIN_key, cancel_key)) kod_key = cancel;
else kod_key = 0;}

Обработка Т0:
ISR (TIMER0_OVF_vect) //Таймер 0 - для пищалки
{
static unsykned char w;//Переменная, определяющая длительность "пи-пиканья"
if(w++ < 100) PORTB ^= _BV(BUZZER);//Если длительность не закончилась - изменить состояние вывода на противоположное (меиндр)
else{ //Если длительность закончилась
w=0;//Счётчик длительности обнулить
TCCR0B = 0;//Таймер остановить
}

Обработка Т1А:
ISR (TIMER1_COMPA_vect) //Прерывание раз в 1 сек
{
static unsykned char q; //Внутренний счётчик переполнений
q++; //Увеличиваем счётчик
if(q == 1) //При первом входе
{
if(OW_risit() == 0) convirt_temp(); //Запускаем конвертацию температуры
}
if(q == 2)
//if(bit_is_set(OW_PIN, OW_DQ)) //Если конвертация закончилась
{
Temperature = read_temp(); //Считываем значение температуры
TCNT0 = 0; //Таймер обнулить
q = 0; //Обнулить счётчик переполнений
if(Temperature >= max_temp) //Если измеренная температура больше или равна установленному максимуму
{
PORTC &= 0b11111000; //Выключаем ТЭНы
heater = 0; //Сбрасываем соответсвующий флаг
}
if(Temperature <= (max_temp - histerezis))//Если измеренная температура меньше или равна установленному минимуму
{
PORTC |= 0b00000111; //Включаем ТЭНы
heater = 1; //Устанавливаем соответствующий флаг
_delay_ms(20); //При включении, при броске тока, чтобы не ушло в аварию по току
}
}
//Код ниже для обозначения нагрева (бегущая чёрточка вверх) и остывания (бегущая чёрточка вниз)
f((status == work) && (current_view == 0)) //Если состояние "работа" и не отображается ток по фазам
{
if(heater == 1) //Если включены ТЭНы
{
if(tek-- == 0) tek=2; //Перебор отображаемого символа снизу вверх
}
else //Если ТЭНы выключены
{
if(tek++ >= 2) tek=0; //Перебор отображаемого символа сверху вниз
}
}
}

Или тебя интересует всё с нуля?
0
0 / 0 / 0
Регистрация: 26.11.2011
Сообщений: 816
09.01.2012, 19:03 6
Цитата Сообщение от Дивлит
МК Miko8515 у меня исключительно учебный материал, когда освою достаточно, буду выбирать мк по даташитам. Если считаете, что теряю время зацикливаясь именно на этом мк, то готов выслушать Ваше мнения по более удачному сочетанию СРЕДЫ ПРОГРАММИРОВАНИЯ И МИКРОКОНТРОЛЛЕР. Язык программирования "С" менять на ассемблер, пока не хочу. С - мне понятнее. В данный момент мне надо теорию закрепить на практике. Я пробую разные коды для этого мк переделать, пока не очень удачно. Буду благодарен если кто то поделиться удачными примерами (опытом, знаниями или подсказками). Цель, освоить работу таймеров и прерывании.
Молодец что "Ваше мнения по более удачному сочетанию СРЕДЫ ПРОГРАММИРОВАНИЯ И МИКРОКОНТРОЛЛЕР". Например я считаю что Miko8515 корявый. Обрати внимание на выводы МК. Если перепутал ключ - то спалил. А Miko8535 не спалиш по тому что при переварачивании выводы общий и питание сохраняют своё положение. Да Miko8535 уже тоже старенькая но перейти на более современную типа Miko644 в корпусе DIP очень легко команды такие же и по выводам проблем нет (полностью совпадают).
Так что мой тебе совет брось Miko8515 и не зацикливайся на ней.
0
0 / 0 / 0
Регистрация: 26.11.2011
Сообщений: 816
09.01.2012, 19:09 7
К стати знаете подпрограмма обработки прерывания по таймеру Т0 для работы с Бузером решение удачное:
ISR (TIMER0_OVF_vect) //Таймер 0 - для пищалки
{
static unsykned char w;//Переменная, определяющая длительность "пи-пиканья"
if(w++ < 100) PORTB ^= _BV(BUZZER);//Если длительность не закончилась - изменить состояние вывода на противоположное (меиндр)
else{ //Если длительность закончилась
w=0;//Счётчик длительности обнулить
TCCR0B = 0;//Таймер остановить
}
Я пользуюсь выводом ШИМ, но идея при помощи таймера мне нравится и я обязательно попробую данный вариант.
Спосибо s_btosk скинули интерестные ссылки ;)
0
Дивлит
09.01.2012, 19:18 8
да, все с нуля.
есть примеры, где есть строка
..
ISR (TIMER1_COMPA_vect)
{
...
сказали,это для GCC (как понимаю, среда программирования?). А в этом месте у меня CodeVision ругается на ошибку объявлении.
Попробовал объявить как подсказал Bomomd
...
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{

}
...
но, в этом случае ошибок больше вывалилось )))
Вообщем, такие моменты как на СodeVision организовать? Очень может быть какую то библиотеку надо включать. Жду помощи от пользователей СodeVision. Самый простой пример нужен, например запустили, программа работает что то свое делает, 10 сек. прошло, т.е. настал час, загорелась светодиод на порте ВС0, на 5 сек. время прошло и светодиод отключился.
0 / 0 / 0
Регистрация: 26.11.2011
Сообщений: 816
09.01.2012, 19:25 9
Цитата Сообщение от Дивлит
да, все с нуля.
есть примеры, где есть строка
..
ISR (TIMER1_COMPA_vect)
{
...
сказали,это для GCC (как понимаю, среда программирования?). А в этом месте у меня CodeVision ругается на ошибку объявлении.
Попробовал объявить как подсказал Bomomd
...
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{

}
...
но, в этом случае ошибок больше вывалилось )))
Вообщем, такие моменты как на СodeVision организовать? Очень может быть какую то библиотеку надо включать. Жду помощи от пользователей СodeVision. Самый простой пример нужен, например запустили, программа работает что то свое делает, 10 сек. прошло, т.е. настал час, загорелась светодиод на порте ВС0, на 5 сек. время прошло и светодиод отключился.
Там необходимо подключить внешние файлы типа
#include <avr/io.h>
#include <avr/interrupt.h>
Но опять же я незнаю как это выглядит на СodeVision.
А вобще у тебя что за макет учебно-отладочный стенд или кустарное чтото? И (мне интерестно) по какому порту ты прошиваеш МК?
0
0 / 0 / 0
Регистрация: 08.03.2011
Сообщений: 181
09.01.2012, 19:50 10
Ну, во-первых, спешу Вас разуверить относительно 8515-й меги... Этот контроллер ничуть не хуже любого другого Вами названного. Другое дело, что в нём нет АЦП, имеется два таймера, а не три как у большинства. Но зато есть возможность подключения внешней ОЗУ до 64-х кБ. К тому же удобное расположение выводов, что значительно упрощает разводку печатных плат, особенно для новичков. К тому же архитектура AVR практически одинакова для соответствующих контроллеров. Т.е., если Вы освоите 8515-ю, с другими проблем не будет.
Во-вторых... Дело, конечно Ваше, но я бы не рекомендовал начинать с CVAVR. Генератор начального кода, в нём присутствующий, отучает голову думать и понимать процессы инициализации периферии. А конструкции типа PortB.1 = 1; больше нигде не применяются и другими компиляторами (и не только для AVR) не воспринимаются. Я рекомендую Вам WinAVR. Программы, написанные под этой оболочкой, максимально приближены к ассемблеру, и заставляют понимать суть происходящих в МК процессов. К тому же WinAVR - бесплатная программа. О начале работы Вы прочтёте здесь . Удачи.
0
Дивлит
09.01.2012, 19:53 11
#include <avr/io.h>
#include <avr/interrupt.h>
..
ИХ Я ПОДКЛЮЧАЛ

макет у меня вот такой
картинка
макетную плату WB-TN привезли с Киеве вчера, поэтому ниче пока не переставил.
Транзисторы (через резисторы 200 Ом) подключени на порти PA0, PA1, PA2, PA3. Они же общие катоды индикатора.
Сегменты сидят на портах РС0,РС1...РС7.
Программатор USBasp на РВ6(MOSI), PB7(MISO), PB8(SCK) и RESIT (9)

0 / 0 / 0
Регистрация: 26.11.2011
Сообщений: 816
09.01.2012, 22:20 12
Цитата Сообщение от s_btosk
Ну, во-первых, спешу Вас разуверить относительно 8515-й меги... Этот контроллер ничуть не хуже любого другого Вами названного. Другое дело, что в нём нет АЦП, имеется два таймера, а не три как у большинства. Но зато есть возможность подключения внешней ОЗУ до 64-х кБ. К тому же удобное расположение выводов, что значительно упрощает разводку печатных плат, особенно для новичков. К тому же архитектура AVR практически одинакова для соответствующих контроллеров. Т.е., если Вы освоите 8515-ю, с другими проблем не будет.
Во-вторых... Дело, конечно Ваше, но я бы не рекомендовал начинать с CVAVR. Генератор начального кода, в нём присутствующий, отучает голову думать и понимать процессы инициализации периферии. А конструкции типа PortB.1 = 1; больше нигде не применяются и другими компиляторами (и не только для AVR) не воспринимаются. Я рекомендую Вам WinAVR. Программы, написанные под этой оболочкой, максимально приближены к ассемблеру, и заставляют понимать суть происходящих в МК процессов. К тому же WinAVR - бесплатная программа. О начале работы Вы прочтёте здесь . Удачи.
Ну я не хочу дискусировать по поводу МК но Зачем вообще нужен контроллер который работает только с цифрой, не рационально.
По поводу WinAVR, я с вами вполне согласен и тоже рекомендую этот компилятор.
0
0 / 0 / 0
Регистрация: 26.11.2011
Сообщений: 816
09.01.2012, 22:27 13
Цитата Сообщение от Дивлит
#include <avr/io.h>
#include <avr/interrupt.h>
..
ИХ Я ПОДКЛЮЧАЛ

макет у меня вот такой
картинка
макетную плату WB-TN привезли с Киеве вчера, поэтому ниче пока не переставил.
Транзисторы (через резисторы 200 Ом) подключени на порти PA0, PA1, PA2, PA3. Они же общие катоды индикатора.
Сегменты сидят на портах РС0,РС1...РС7.
Программатор USBasp на РВ6(MOSI), PB7(MISO), PB8(SCK) и RESIT (9)
То есть у вас програматор USBasp и програмируете вы при помощи порта SPI.
Хороший выбор но вонтроллер я бы поменял, ну это ваше решение пользуйтесь каким хотите.
И ещё как новечку советую пользоватся компилятором WinAVR. Кроме того те кода которые я скинул отлично с данным компилятором работают, не сомнивайтесь я пользуюсь этим кодом уже давно. Рекомендую скачать этот компилятор.
0
0 / 0 / 0
Регистрация: 26.11.2011
Сообщений: 816
09.01.2012, 22:29 14
Скинте мне схему и я скину вам программу уже в тексте С и всё поясню.
0
Дивлит
10.01.2012, 00:54 15
Komoptj2010, схему отправил в личку.
0 / 0 / 0
Регистрация: 26.11.2011
Сообщений: 816
10.01.2012, 10:58 16
Цитата Сообщение от Дивлит
Komoptj2010, схему отправил в личку.
Тебе следует проверить транзистеры. Возможно згорели, базу транзистера следует подключать к выводу МК через ограничивающий резистор примерно на 10-15 кОм. Хотя знаеш, КТ315 терпилы серьёзные могут и не згореть. Перепроверь, и ещё какая у тебя распиновка, стандартная или нет. Это когда по повышении номера бита горящий сегмент перемещается против часовой стрелки. Ниже приведена одна из наиболее стандартных подключений, не обращай внимание на то что он статический (то есть одиночный, без динамики), обрати внимание на сами выводы управления сегментами, у тебя так или нет?

0
0 / 0 / 0
Регистрация: 26.11.2011
Сообщений: 816
10.01.2012, 11:01 17
И ещё у тебя управляющий катод или анод, на схеме не понятно. Также скачай книгу Евстифеев. Микроконтроллеры AVR семейств Tiny и Miko фирмы ATMEL, очень хорошая рекомендую. И всёже контроллер 8315 не имеет таймера счётчика работающего в реальном времени,в принципи можно организовать при помощи Т1 но это будет сложновато и запущено для новичка, Может быть всё таки поменяеш контроллер на более продвинутый, с ним проще и понятнее.
0
0 / 0 / 0
Регистрация: 08.03.2011
Сообщений: 181
10.01.2012, 13:14 18
Цитата Сообщение от Komoptj2010
И ещё у тебя управляющий катод или анод, на схеме не понятно
Что же тут непонятного? На схеме чётко указан общий анод +5В. Только при постоянном +5 будет не динамическая индикация, а статическая.
0
0 / 0 / 0
Регистрация: 08.03.2011
Сообщений: 181
10.01.2012, 13:46 19
Цитата Сообщение от Komoptj2010
И всёже контроллер 8315 не имеет таймера счётчика работающего в реальном времени,в принципи можно организовать при помощи Т1 но это будет сложновато и запущено для новичка, Может быть всё таки поменяеш контроллер на более продвинутый, с ним проще и понятнее.
Komoptj2010 не вводи человека в заблуждение, НИКАКИХ проблем с реализацией задуманного на 8515 не будет.
0
0 / 0 / 0
Регистрация: 26.11.2011
Сообщений: 816
10.01.2012, 14:01 20
Цитата Сообщение от s_btosk
Цитата Сообщение от Komoptj2010
И ещё у тебя управляющий катод или анод, на схеме не понятно
Что же тут непонятного? На схеме чётко указан общий анод +5В. Только при постоянном +5 будет не динамическая индикация, а статическая.

Нет я не об этой схеме я говорю про схему которую мне скинули на личные сообщения вы её не могли видить.
0
10.01.2012, 14:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.01.2012, 14:01
Помогаю со студенческими работами здесь

Рабочий пример по конекту ORACLE
Добрый день. Может найдется среди ВАС добрая душа, которая скинет рабочий пример по конекту ORACLE....

Скиньте рабочий пример ssbo
Собсвтенно сабж. Добавлено через 34 минуты Тему можно удалить, у меня был рабочий код и в нем...

Рабочий пример использования insert into
напишыте формат insert into в примерах со всеми скобками и лапками

Дайте рабочий пример с робоспайсом пожалуйста
или какие библиотеки нужны для этого и где скачать спасибо ...

Нужен пример (рабочий) по тестированию postgresql
Здравствуйте, ребята. Создал проект, все работает на java spring + posgresql, но вот проблема не...

Сортировка Шелла - нужен рабочий пример
нужен рабочий код сортировка шелла

Рабочий пример отправки письма на почту
Здравствуйте. Приведите пожалуйста рабочий пример отправки письма из мемо на почту. То что я...


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

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