Добавлено: Вс июн 17, 2007 23:27:44
Линк в моем профиле - страница 5 "Си для МК"
Здесь можно немножко помяукать :)
https://radiokot.ru/forum/
И снова здравствуйте, возвращаемся к нашим баранам...tych писал(а):ТРЕНЕРУЙТЕ ВНИМАНИЕ !!!
на странице 5a есть:
1.2.4. Указатели
Обчитаешься.
Код: Выделить всё
#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);
}
Курс почитайте - задачи о тайцере и мастером CVAVR воспользуйтесь. Нужно включить прервание от таймера.Negor писал(а):Продолжаю изучать таймеры:чего не хватает в этом коде чтобы по переполнению таймера состояние на PORTB.0 изменилось на противоположное?
Да что вы говорите, не может такого бытьtych писал(а):Нужно включить прервание от таймера.
Код: Выделить всё
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
PORTB.0=~PORTB.0;
}
Код: Выделить всё
#asm("SEI")Дак читать надо ...Negor писал(а):Я глазами проел 3-ю страницу курса, но кроме того что надо установить 7 бит статус регистра ничего не увидел...
Глобально вы разрешили прерывания,в CodeVision:
interrupt [прерывание] void adc_isr(void)
{
код выполняемый при возникновении
разрешенного локально и глобально прерывания
}
Код: Выделить всё
#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++;
}
}
Голос не мальчика, но мужа: растешь, Negor! Поздравляю.Negor писал(а):Для новичков сообщаю - не наступайте на грабли - читайте даташит(не знаю почему, но с даташитом мне веселее чем с Визардом)
есть ещё один вариант. проверяем состояние кнопок по переполнению таймера (например 100 раз в секунду)Negor писал(а):Итак: требуется критика...
дело в том что главное во всей этой функции(по крайней мере я ставил приоритет именно на это) - что бы если кнопка нажата длительное время - реакции на нажатие не поступало. т.е. допустим кнопка нажата в течении десяти циклов, но реакция на нажатие была только в первом и больше не произойдёт, пока кнопку не отпустят... примерно так... а вот делать это всё по переполнению таймера - мысль хорошая...Кашпо писал(а):есть ещё один вариант. проверяем состояние кнопок по переполнению таймера (например 100 раз в секунду)Negor писал(а):Итак: требуется критика...
если в предыдущий раз и в текущий раз состояние кнопки не изменилось, значит пишем это состояние в какую-либо глобальную переменную.
в основном цикле программы (да и вообще из любого места) для того чтобы узнать нажата ли кнопка или нет - достаточно заглянуть в эту переменную.
т.е. типа буфера клавиатуры? я нечто подобное недавно делал. в каждом переполнении таймера, если кнопка нажата то наращивается некая глобальная переменная "счётчик". если кнопка отпущена переменная сбрасывается в ноль. При достижении счётчиком определённого значения (например 10) будет означать, что в течении последних 10 срабатываний таймера кнопка была нажата. В этом случае номер нажатой кнопки заносится в другую переменную.Negor писал(а):если кнопка нажата длительное время - реакции на нажатие не поступало. т.е. допустим кнопка нажата в течении десяти циклов, но реакция на нажатие была только в первом и больше не произойдёт, пока кнопку не отпустят...