Дивлит
|
|
1 | |
Подскажите рабочий пример09.01.2012, 14:49. Показов 26504. Ответов 50
Метки нет (Все метки)
Изучаю микроконтроллеры. Вот застрял на таймерах и прерываниях :(
Пользуюсь CodeVision, микроконтроллер mega8515. Есть макетная плата где уже есть МК (mega8515), индикатор (E40361-l-0-8-w), индикатор связал с транзисторами через резисторы. Могу статично или динамически высветить цифры. А теперь хочется сделать с этого таймер(секундомер) с кнопками старт-стоп, часы. Подскажите пример работы с таймером и прерываниями на С для этого. Заранее спасибо. |
09.01.2012, 14:49 | |
Ответы с готовыми решениями:
50
Подскажите РАБОЧИЙ пример диалога да\нет Подскажите рабочий пример по использованию TThread Рабочий пример бд Рабочий пример авторизации в ВК |
0 / 0 / 0
Регистрация: 26.11.2011
Сообщений: 816
|
|
09.01.2012, 18:22 | 2 |
Сообщение от Дивлит
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
|
Дивлит
|
|
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 и не зацикливайся на ней.
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 |
Сообщение от Дивлит
#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
По поводу WinAVR, я с вами вполне согласен и тоже рекомендую этот компилятор.
0
|
0 / 0 / 0
Регистрация: 26.11.2011
Сообщений: 816
|
|
09.01.2012, 22:27 | 13 |
Сообщение от Дивлит
Хороший выбор но вонтроллер я бы поменял, ну это ваше решение пользуйтесь каким хотите. И ещё как новечку советую пользоватся компилятором 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 |
Сообщение от Дивлит
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
0
|
0 / 0 / 0
Регистрация: 08.03.2011
Сообщений: 181
|
|
10.01.2012, 13:46 | 19 |
Сообщение от Komoptj2010
0
|
0 / 0 / 0
Регистрация: 26.11.2011
Сообщений: 816
|
|
10.01.2012, 14:01 | 20 |
Сообщение от s_btosk
Нет я не об этой схеме я говорю про схему которую мне скинули на личные сообщения вы её не могли видить.
0
|
10.01.2012, 14:01 | |
10.01.2012, 14:01 | |
Помогаю со студенческими работами здесь
20
Рабочий пример по конекту ORACLE Скиньте рабочий пример ssbo Рабочий пример использования insert into Дайте рабочий пример с робоспайсом пожалуйста Нужен пример (рабочий) по тестированию postgresql Сортировка Шелла - нужен рабочий пример Рабочий пример отправки письма на почту Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |