 |
|
|
|
| Автор |
Сообщение |
Alexx Знатный посетитель (>20)


Зарегистрирован: 25.09.2006 Сообщения: 49 Откуда: Украина, Киев
|
Добавлено: 21 Ноя 2006, 11:03 Заголовок сообщения: |
|
|
| tellurian писал(а): | Только там получается такая штука. Переключается один раз за весь цыкл. Не знаю в чем проблема  |
Забыли разрешить прерывания #asm("SEI") |
|
| Вернуться к началу |
|
 |
AndryG Модератор
Зарегистрирован: 24.07.2006 Сообщения: 411 Откуда: Helios-3
|
Добавлено: 21 Ноя 2006, 11:31 Заголовок сообщения: |
|
|
Значится попорядку.
Инициализация переферии. Зачем нам прерывание по совпадению счетчика? Прерывание разрешено, а обработчика нет - это грубая ошибка! Прерывания перефирии выставили, а глобально прерывания не разрешили... перед while(1) необходимо #asm("sei") добавить.
Так работать будет.
Теперь мелочи, но из-за котрых можно в будущем нарваться:
Вы конфигурируете на выход все биты порта B, а используете только один... для любого конфигурирования должен быть повод, а не просто так - "за компанию"
| Код: |
if (PORTB == 1) PORTB=0; else PORTB = 1;
|
Потенциальная опасность. Если Вы будете дальше наращивать проект и на порт B поставите кнопки, то можно получить глюк!
Такой записью вы постоянно записываете в биты 1-7 нули! А если там ноль не нужен?!
Возможен такой вариант:
| Код: |
if (PORTB == 1)
PORTB = PORTB & 0xFE;
else PORTB = PORTB | 1;
|
Таким образом мы устанавливаем/сбрасываем только один бит... в данном случаем еще лучше ставить PORTB = PORTB ^ 1 -- будет переключение бита.
Инициализация счетчика:
верно сделали: писать сперва старший байт, а читать сперва младший... но CodeVision поймет и такую запись: TCNT1 = 0xB3B5.
И еще ...
не ставьте в таких программках задержки на 5 сек .... больше времени приходится ждать отладчика
и напоследок ... где комментарии?! Полезно комментировать хотя бы кусок инициализации... ведь не ясно, что включили, а что нет.
____
P.S.
Если куски кода небольшие - выкладывайте в посте. _________________ AndryG |
|
| Вернуться к началу |
|
 |
tellurian Частый гость (>5)

Зарегистрирован: 15.11.2006 Сообщения: 15
|
Добавлено: 21 Ноя 2006, 12:06 Заголовок сообщения: |
|
|
Замечания понятны, со своими ошибками разобрался .
Вот что получилось в результате:
| Код: | #include <90s2313.h> //подключаем библиотеку работы с микроконтроллером
interrupt [TIM1_OVF] void timer1_ovf_isr(void) //описываем прерывание
{
TCNT1H = 0xb3; // задаем время для
TCNT1L = 0xb5; // таймера/счетчика 1
// выполняемый код
PORTB = PORTB ^ 1;// инвертируем последний бит порта
}
void main(void) {
DDRB = 0x01; // определяем направление (выход)
PORTB = 0x00; // загорается светодиод
TCCR1A = 0x00; TCCR1B = 0x05; // устанавливаем параметры счетчика
TCNT1H = 0xb3; TCNT1L = 0xb5; // устанавливаем временной интервал
OCR1H = 0x00; OCR1L = 0x00; // устанавливаем регистр совпадения
TIMSK = 0xB0; // разрешаем прерывание от таймера/счетчика 1
PORTB = 0x01; // светодиод гаснет
#asm ("SEI") // разрешаем прерывания
while (1) { } // запускаем бесконечный цыкл
} //main |
Но вот у меня возник вопрос (просьба). Покажите вид окошка Scope в VMLab во время выполнения программы
Последний раз редактировалось: tellurian (22 Ноя 2006, 9:27), всего редактировалось 4 раз(а) |
|
| Вернуться к началу |
|
 |
Alexx Знатный посетитель (>20)


Зарегистрирован: 25.09.2006 Сообщения: 49 Откуда: Украина, Киев
|
Добавлено: 21 Ноя 2006, 12:22 Заголовок сообщения: |
|
|
| tellurian писал(а): | Замечания понятны, со своими ошибками разобрался .
Но вот у меня возник вопрос (просьба). Покажите вид окошка Scope в VMLab во время выполнения программы |
прежде, чем там что-то увидеть надо соответственно его настроить.
Смотрите описание директивы .PLOT в хелпе |
|
| Вернуться к началу |
|
 |
tellurian Частый гость (>5)

Зарегистрирован: 15.11.2006 Сообщения: 15
|
Добавлено: 21 Ноя 2006, 13:26 Заголовок сообщения: |
|
|
| Alexx писал(а): |
прежде, чем там что-то увидеть надо соответственно его настроить.
Смотрите описание директивы .PLOT в хелпе |
Посмотрел. Нормально получилось. Если ничего не помогает, то полезно почитать ХЭЛП
Для настройки окна Scope необходимо в файле проекта задать новый блок. Например:
| Код: | | .PLOT V (PB0) V (PB1) V (PB2) V (PB3) V (PB4) V (PB5) V (PB6) V (PB7) |
Последний раз редактировалось: tellurian (22 Ноя 2006, 9:23), всего редактировалось 1 раз |
|
| Вернуться к началу |
|
 |
tellurian Частый гость (>5)

Зарегистрирован: 15.11.2006 Сообщения: 15
|
Добавлено: 21 Ноя 2006, 13:43 Заголовок сообщения: |
|
|
| Какое задание следующее, на этом тернистом и нелёгком пути? |
|
| Вернуться к началу |
|
 |
AndryG Модератор
Зарегистрирован: 24.07.2006 Сообщения: 411 Откуда: Helios-3
|
Добавлено: 21 Ноя 2006, 14:17 Заголовок сообщения: |
|
|
Продолжаем шагать... КНОПКИ
Наращиваем задачку... На PortB на старший бит вешаем кнопку.
Кнопка отжата - диод моргает с одной частотой, нажали - чаще моргает.
Читаем внимательно о дребезге контактов.
В задаче разрешаем использовать только один таймер.
Дальше развинем до супер-пупер автомата световых эффектов. (это дабы не забыть )
Давай вопросы/уточнения по задаче - дополню этот пост.
И еще ... задача 1,2 готовы - если не влом оформи немного посты по ним, пжлст, ... для пототмков  _________________ AndryG |
|
| Вернуться к началу |
|
 |
tellurian Частый гость (>5)

Зарегистрирован: 15.11.2006 Сообщения: 15
|
Добавлено: 21 Ноя 2006, 14:47 Заголовок сообщения: |
|
|
Вопросы:
1. Где лутше всего прочитать про работу с кнопками?
2. При программировании таймера работать отдельно со старшим и младшым байтом, или вместе?
3. Сколько комманд допускается в прерывании, чтобы не надолго знимать процессорное время?
Последний раз редактировалось: tellurian (22 Ноя 2006, 9:57), всего редактировалось 1 раз |
|
| Вернуться к началу |
|
 |
AndryG Модератор
Зарегистрирован: 24.07.2006 Сообщения: 411 Откуда: Helios-3
|
Добавлено: 21 Ноя 2006, 16:03 Заголовок сообщения: |
|
|
1. Где лутше всего прочитать про работу с кнопками?
В Сети найдешь толковые ссылки - не забудь сюда закинуть.
Голубцов "Микроконтроллеры AVR: от простого к сложному" ... если еще не скачал - дай знать - закину в файлообменник ... думаю там должно быть обязательно
2. При программировании таймера работать отдельно со старшим и младшым байтом, или вместе?
Некорректный вопрос ... я просто показал возможность. как хоч так и испоьзуй - мне всё равно
3. Сколько комманд допускается в прерывании, чтобы не надолго знимать процессорное время?
Всё зависит от программы. Допустим у тебя используется одно прерывание. (от таймера) оно генерится раз в 10 мСек. Таким образом, дабы не было облома, необходимо как максимум за 10 мСек с прерывания выйти... допустим тактовая 1МГц ... получаем, что AVR за 10 мСек может выполнить 10 000 операций ...
А вообще прерывание на то оно и прерывание - не стоит там долго зависать. _________________ AndryG |
|
| Вернуться к началу |
|
 |
tellurian Частый гость (>5)

Зарегистрирован: 15.11.2006 Сообщения: 15
|
Добавлено: 21 Ноя 2006, 16:07 Заголовок сообщения: |
|
|
Я выкачал все книжки по ссылкам, которые опрубликованы вначале
Теперь буду работать в этом направлении. |
|
| Вернуться к началу |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете добавлять вложения в этом форуме Вы можете просматривать вложения в этом форуме
|
|