Страница 2 из 421

Добавлено: Вс июн 17, 2007 23:27:44
tych
Линк в моем профиле - страница 5 "Си для МК"

Добавлено: Вс июн 17, 2007 23:45:16
Negor
Ваш курс у меня скачанный - прочитал страницы 5.htm и 5a.htm - нашёл про violitale но про указатели там ничего нет...а так всё понял...

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

Добавлено: Пн июн 18, 2007 10:10:24
tych
ТРЕНЕРУЙТЕ ВНИМАНИЕ !!!

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

1.2.4. Указатели

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

Добавлено: Пн июн 18, 2007 11:00:45
Negor
Прошу прощения - неузрел... чтож последую вашему совету - буде тренироватся юзать поиск... в любом случае спасибо

Добавлено: Пн июн 18, 2007 16:25:20
Aheir
tych писал(а):ТРЕНЕРУЙТЕ ВНИМАНИЕ !!!

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

1.2.4. Указатели

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

Добавлено: Пн июн 18, 2007 19:28:28
Negor
Продолжаю изучать таймеры:чего не хватает в этом коде чтобы по переполнению таймера состояние на 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
tych
Negor писал(а):Продолжаю изучать таймеры:чего не хватает в этом коде чтобы по переполнению таймера состояние на PORTB.0 изменилось на противоположное?
Курс почитайте - задачи о тайцере и мастером CVAVR воспользуйтесь. Нужно включить прервание от таймера.

Добавлено: Пн июн 18, 2007 20:08:05
Negor
tych писал(а):Нужно включить прервание от таймера.
Да что вы говорите, не может такого быть :) .
Извините за иронию, но у меня прерывание по переполнению таймера включено

Код: Выделить всё

interrupt [TIM0_OVF] void timer0_ovf_isr(void) 
{ 
        PORTB.0=~PORTB.0; 
}
и разрешение прерываний есть

Код: Выделить всё

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

Добавлено: Пн июн 18, 2007 20:27:43
tych
Страницу 3 курса почитайте "прерывания в AVR" - что нужно сделать кроме "СЕЙ".

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

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

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

Вот там есть:
в CodeVision:

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

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

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

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

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

Добавлено: Пн июн 18, 2007 21:21:19
tych
Вот галочка прерывания в мастере. Настройте как вам надо и затем помотрите код.

Добавлено: Пн июн 18, 2007 21:25:28
Negor
А-а-а-а-а вот оно что.... с третьего раза въехал... извините что я "Ты"кнул... эмоции+паника...

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

Добавлено: Вт июн 19, 2007 00:06:23
Negor
Итак: требуется критика(код глаза намозолил, скорее всего чегото очевидного не вижу, но в симуляторе вроде работает). Цели:
-антидребезг;
-реакция на нажатие один раз с момента нажатия до момента отпускания;
-должно быть реализованно в виде отдельной функции, кот-ая фозвращает состояние порта.
Собственно код

Код: Выделить всё

#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
ARV
Negor писал(а):Для новичков сообщаю - не наступайте на грабли - читайте даташит(не знаю почему, но с даташитом мне веселее чем с Визардом)
Голос не мальчика, но мужа: растешь, Negor! Поздравляю.

Добавлено: Вт июн 19, 2007 09:45:25
Кашпо
Negor писал(а):Итак: требуется критика...
есть ещё один вариант. проверяем состояние кнопок по переполнению таймера (например 100 раз в секунду)
если в предыдущий раз и в текущий раз состояние кнопки не изменилось, значит пишем это состояние в какую-либо глобальную переменную.

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

Добавлено: Вт июн 19, 2007 18:04:43
Negor
Кашпо писал(а):
Negor писал(а):Итак: требуется критика...
есть ещё один вариант. проверяем состояние кнопок по переполнению таймера (например 100 раз в секунду)
если в предыдущий раз и в текущий раз состояние кнопки не изменилось, значит пишем это состояние в какую-либо глобальную переменную.

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

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

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

Добавлено: Ср июн 20, 2007 15:55:14
Negor
Имхо уж очень легко ты разкидываешся таймерами... я понимаю, если бы их было штук восемь... а так два таймера(я изучаю тини2313) и, как правильно заметил ARV один просто будет молотить и энергия расходуется в никуда...