Модераторы: PILOT, ManiaK, Mazzi
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [avr] мигание светодиодом прерываниями и таймером 
:(
    Опции темы
KindEvil
Дата 16.11.2010, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 10.11.2010

Репутация: нет
Всего: нет



Привет всем, я пока что полный ноль в ассеблере и программировании каких бы то ни было микропроцессоров и avr в частности , но хочется разобраться с этой задачей)

Используя систему прерываний и таймер  реализовать следующую последовательность включения светодиода (atmega8): 

1сек - ON
1сек - OFF
2сек - ON
1сек - OFF
1сек - ON
2сек - OFF

1сек - ON
1сек - OFF
2сек - ON
1сек - OFF
1сек - ON
2сек - OFF
.
.
.
Светодиод подключен к выходу  параллельного порта PB1 и к земле, через токоограничивающий резистор 200 Ом. Основной цикл программы должен быть пустым.

Приветствуется код с комментариями, иначе утону. Спасибо.

PM MAIL   Вверх
UniBomb
Дата 17.11.2010, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 97



KindEvil, рассказывай что делал, что не получилось.


--------------------
PM MAIL ICQ Skype   Вверх
KindEvil
Дата 17.11.2010, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 10.11.2010

Репутация: нет
Всего: нет



Цитата(UniBomb @ 17.11.2010,  10:56)
KindEvil, рассказывай что делал, что не получилось.

По-чесноку, я читал о механизмах прерываний от таймеров и до сих пор не понял, как оформить и по какому признаку (в смысле по совпадению, переполнению или захвату).  Вообщем каша, нет понимая реализации прерывания.
Алгоритм представляю следующий: 
на PB1 подать сигнал с задердкой на 1сек;
потом вот это самое прерывание от таймера;
затем опять сигнал на PB1 с задержкой на 2 сек.; и аналогичные действия для 1off, 1on, 2off

и все это в цикле.

предполагаю, что возможно упростить цикл через инкремент и декремент. 

стек необходим здесь? без него никуда, как я понял)

и еще вопрос, что дает информация о сопротвлении резистора для кода?
PM MAIL   Вверх
UniBomb
Дата 17.11.2010, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 97



Цитата(KindEvil @  17.11.2010,  11:14 Найти цитируемый пост)
в смысле по совпадению, переполнению или захвату

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


Цитата(KindEvil @  17.11.2010,  11:14 Найти цитируемый пост)
Алгоритм представляю следующий:

Итак, смотрим задачу и видим, что весь цикл моргания у нас занимает 8 секунд. Значит всё это можно было бы оформить в следующем виде:

Код

switch(time)
{
    case 1: setLed; break;
    case 2: clrLed; break;
    case 4: setLed; break;
    case 5: clrLed; break;
    case 6: setLed; break;
    case 8: clrLed; time = 0; break;
}


Цитата(KindEvil @  17.11.2010,  11:14 Найти цитируемый пост)
и все это в цикле.

Нет, цикл тут не нужен, т.к. всё это делается в прерывании, которое срабатывает само через равные промежутки времени.

Нужно кстати ещё знать частоту, на которой работает мк. Ну а в общем виде программа могла бы выгядеть следущим образом:

Код

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

#define clrLed PORTB &= ~(1 << 1)
#define setLed PORTB |= 1 << 1

uint8_t time = 0;

int main(void)
{
    //настраиваем порт B как нам надо
    //настраиваем счётчик

    while(1) ; //наш главный пустой цикл
}

ISR(SIG_OUTPUT_COMPARE1A)  //прерывание таймера по совпадению
{
    switch(time)
    {
        case 1: setLed; break;
        case 2: clrLed; break;
        case 4: setLed; break;
        case 5: clrLed; break;
        case 6: setLed; break;
        case 8: clrLed; time = 0; break;
    }
    time++;
}


Но есть одно но - само задание ущербно. В обработчике прерывания нужно выполнять минимальное количество действий. В лучшем случае в прерывании надо установить какой-нибудь программный флаг, а в главном цикле программы его проверять и по выставлению уже производить какие-либо действия.


Цитата(KindEvil @  17.11.2010,  11:14 Найти цитируемый пост)
стек необходим здесь?

Как видишь нет.


Цитата(KindEvil @  17.11.2010,  11:14 Найти цитируемый пост)
что дает информация о сопротвлении резистора для кода? 

Абсолютно ничего. Резистор нужен для того, что бы не сгорел светодиод. Да и к тому же маловат он в этой схеме. Сейчас через диод течёт 25 мА, а надо где-то 10-15.

Это сообщение отредактировал(а) UniBomb - 17.11.2010, 11:52


--------------------
PM MAIL ICQ Skype   Вверх
Mazzi
Дата 17.11.2010, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: 9
Всего: 21



Я бы несколько дополнил программу, чтобы она работала в реальном времени
Код

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

#define clrLed PORTB &= ~(1 << 1)
#define setLed PORTB |= 1 << 1

uint8_t time = 0;

// это значение нужно подобрать под конкретную схему
#define TIME_1_SEK 1000
uint16  pre_div =0;

int main(void)
{
    //настраиваем порт B как нам надо
    //настраиваем счётчик

    while(1) ; //наш главный пустой цикл
}

ISR(SIG_OUTPUT_COMPARE1A)  //прерывание таймера по совпадению
{
    if (pre_div) pre_div--;
    else {
       pre_div = TIME_1_SEK;
       switch(time)
       {
           case 1: setLed; break;
           case 2: clrLed; break;
           case 4: setLed; break;
           case 5: clrLed; break;
           case 6: setLed; break;
           case 8: clrLed; time = 0; break;
       }
       time++;
   }
}



--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
UniBomb
Дата 17.11.2010, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 97



Mazzi, тут я немного не согласен  smile Зачем вводить лишние переменные, когда с одной можно справится. Ну например мы настроили таймер, что бы период срабатывания был 0,1 секунды. Тогда в свитче было бы не 1, 2, 3 и т.д. а 10, 20, 30 и т.д. В любом случае временные интервалы бы выдерживались  smile 


--------------------
PM MAIL ICQ Skype   Вверх
KindEvil
Дата 17.11.2010, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 10.11.2010

Репутация: нет
Всего: нет



Mazzi
UniBomb,  спасибо вам! Но, как бы этот код выглядел в ассемблере для atmega8? 
PM MAIL   Вверх
UniBomb
Дата 18.11.2010, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 97



KindEvil, а вот теперь давай немного сам  smile Только так ты из нуля вырастешь, хоть на экзаменах будет легче (это ведь лабораторная работа же?). Структура программы у тебя есть, ассемблерная версия не сильно будет отличаться. Ну а что не получится - мы поможем  smile 

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


--------------------
PM MAIL ICQ Skype   Вверх
KindEvil
Дата 18.11.2010, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 10.11.2010

Репутация: нет
Всего: нет



UniBomb,  спасибо. Будем разбираться)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.1044 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.