Обсуждаем контроллеры компании Atmel.
Ответить

Вс июн 17, 2007 23:27:44

Линк в моем профиле - страница 5 "Си для МК"

Вс июн 17, 2007 23:45:16

Ваш курс у меня скачанный - прочитал страницы 5.htm и 5a.htm - нашёл про violitale но про указатели там ничего нет...а так всё понял...

Хотя неважно - работает - и хорошо(щас в дебри лесть тоже не охота) я наверно просто названия битов забью в библиотеку КодВижна и на этом мои проблемы, надеюсь , закончатся

Пн июн 18, 2007 10:10:24

ТРЕНЕРУЙТЕ ВНИМАНИЕ !!!

на странице 5a есть:

1.2.4. Указатели

Обчитаешься.

Пн июн 18, 2007 11:00:45

Прошу прощения - неузрел... чтож последую вашему совету - буде тренироватся юзать поиск... в любом случае спасибо

Пн июн 18, 2007 16:25:20

tych писал(а):ТРЕНЕРУЙТЕ ВНИМАНИЕ !!!

на странице 5a есть:

1.2.4. Указатели

Обчитаешься.


И снова здравствуйте, возвращаемся к нашим баранам...
Просили же уже 1024 раза: есть что рассказать - расскажи на Форуме или напиши статью. Хочешь послать в свой курс - пиши в личку. :evil:

Пн июн 18, 2007 19:28:28

Продолжаю изучать таймеры:чего не хватает в этом коде чтобы по переполнению таймера состояние на PORTB.0 изменилось на противоположное?
Код:
#include <tiny2313>
#include <delay>

interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
        PORTB.0=~PORTB.0;
}

void main(void)
{
       
        DDRB=0xFF;
        TCCR0B|=(1<<CS00);//|(1<<CS02);
        #asm("SEI");
        while(1);
}

Пн июн 18, 2007 20:02:46

Negor писал(а):Продолжаю изучать таймеры:чего не хватает в этом коде чтобы по переполнению таймера состояние на PORTB.0 изменилось на противоположное?


Курс почитайте - задачи о тайцере и мастером CVAVR воспользуйтесь. Нужно включить прервание от таймера.

Пн июн 18, 2007 20:08:05

tych писал(а):Нужно включить прервание от таймера.

Да что вы говорите, не может такого быть :) .
Извините за иронию, но у меня прерывание по переполнению таймера включено
Код:
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
        PORTB.0=~PORTB.0;
}


и разрешение прерываний есть
Код:
#asm("SEI")


Вы же код мой читали....
Просто подскажите что может помешать выполнятся обработчику

Пн июн 18, 2007 20:27:43

Страницу 3 курса почитайте "прерывания в AVR" - что нужно сделать кроме "СЕЙ".

Я ж написал "... ПРЕРЫВАНИЯ ОТ ТАЙМЕРА" а не только "вообще прерывания".

Пн июн 18, 2007 20:49:56

Слушай, ну хватит меня мучить.... :cry: открой секрет - чего нехватает? Я глазами проел 3-ю страницу курса, но кроме того что надо установить 7 бит статус регистра ничего не увидел... :cry:

Пн июн 18, 2007 21:14:19

Negor писал(а):Я глазами проел 3-ю страницу курса, но кроме того что надо установить 7 бит статус регистра ничего не увидел... :cry:


Дак читать надо ...

Вот там есть:

в CodeVision:

interrupt [прерывание] void adc_isr(void)
{
код выполняемый при возникновении
разрешенного локально и глобально прерывания
}


Глобально вы разрешили прерывания,

но В ТРЕТИЙ РАЗ говорю вам, нужно разрешить нужное вам прерывание локально - т.е. именно его, ТО которое вам нужно.

"таймер оверфло"

Проще всего это сделать мастером компилятора - пример в задаче 3,

либо прочитать ДШ про таймеры и прерывания и
сделать то что там написано.

Пн июн 18, 2007 21:21:19

Вот галочка прерывания в мастере. Настройте как вам надо и затем помотрите код.
Вложения
cvavr.png
(9.95 KiB) Скачиваний: 1405

Пн июн 18, 2007 21:25:28

А-а-а-а-а вот оно что.... с третьего раза въехал... извините что я "Ты"кнул... эмоции+паника...

Пн июн 18, 2007 23:17:09

Ур-р-р-р-аа - зработало!!!
Для новичков сообщаю - не наступайте на грабли - читайте даташит(не знаю почему, но с даташитом мне веселее чем с Визардом)
Есть регистр в кот-ом разрешаются прерывания для таймера!!! Будте внимательны :roll:

Вт июн 19, 2007 00:06:23

Итак: требуется критика(код глаза намозолил, скорее всего чегото очевидного не вижу, но в симуляторе вроде работает). Цели:
-антидребезг;
-реакция на нажатие один раз с момента нажатия до момента отпускания;
-должно быть реализованно в виде отдельной функции, кот-ая фозвращает состояние порта.
Собственно код
Код:
#include <tiny2313>
#include <delay>
unsigned char FrstState,ScndState,RealState,Flag;
unsigned char KeyState(void)
{
       
        FrstState=PIND;                         //Запоминаем состояние кнопок
        delay_ms(10);                           //Задержка на антидребезг
        ScndState=FrstState & PIND;             //Контрольная проверка на нажатие
        RealState=(ScndState) & ~(Flag);        //Состояние изменилось?
        Flag=ScndState;                         //Флаг для контроля состояния при след проверке
     return RealState;   
}

void main(void)
{
       
        unsigned char i=0;
        DDRB=0xFF;
        DDRD=0x00;
        while(1)
        {       
                   if (KeyState()!=0)  i++;
        }
}

Вт июн 19, 2007 07:12:21

Negor писал(а):Для новичков сообщаю - не наступайте на грабли - читайте даташит(не знаю почему, но с даташитом мне веселее чем с Визардом)

Голос не мальчика, но мужа: растешь, Negor! Поздравляю.

Вт июн 19, 2007 09:45:25

Negor писал(а):Итак: требуется критика...

есть ещё один вариант. проверяем состояние кнопок по переполнению таймера (например 100 раз в секунду)
если в предыдущий раз и в текущий раз состояние кнопки не изменилось, значит пишем это состояние в какую-либо глобальную переменную.

в основном цикле программы (да и вообще из любого места) для того чтобы узнать нажата ли кнопка или нет - достаточно заглянуть в эту переменную.

Вт июн 19, 2007 18:04:43

Кашпо писал(а):
Negor писал(а):Итак: требуется критика...

есть ещё один вариант. проверяем состояние кнопок по переполнению таймера (например 100 раз в секунду)
если в предыдущий раз и в текущий раз состояние кнопки не изменилось, значит пишем это состояние в какую-либо глобальную переменную.

в основном цикле программы (да и вообще из любого места) для того чтобы узнать нажата ли кнопка или нет - достаточно заглянуть в эту переменную.


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

Ср июн 20, 2007 03:29:34

Negor писал(а):если кнопка нажата длительное время - реакции на нажатие не поступало. т.е. допустим кнопка нажата в течении десяти циклов, но реакция на нажатие была только в первом и больше не произойдёт, пока кнопку не отпустят...

т.е. типа буфера клавиатуры? я нечто подобное недавно делал. в каждом переполнении таймера, если кнопка нажата то наращивается некая глобальная переменная "счётчик". если кнопка отпущена переменная сбрасывается в ноль. При достижении счётчиком определённого значения (например 10) будет означать, что в течении последних 10 срабатываний таймера кнопка была нажата. В этом случае номер нажатой кнопки заносится в другую переменную.
Состояние этой переменной читается какой-либо функцией и после прочтения - обнуляется. таким образом одно нажатие кнопки попадёт в переменную лищь единожды и прочитается лишь единожды.

Правда оно может прочитаться даже тогда, когда кнопка уже будет отпущена. Но по крайней мере факт нажатия не прозевается процом ;-)

Ср июн 20, 2007 15:55:14

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