Спасибо за помощь!...
Опрос портов делаю по переполнению таймера T0 в прерывании...примерно раз в 0,2 сек.
Вроде все вышло...но столкнулся с проблемой...
1.Следуя нижеприведенному коду при замкнутом ключе (НЛУ на пине) программа заносит в таймер значение константы, а при размыкании частота так и остается,
если я добавляю
Код
else {
TCCR2=0x00;
};
после
if для 8-разрядного таймера,
Код
else {
TCCR1A=0x00;
TCCR1B=0x00;
};
или после
if для 16-р таймера (т.е. останавливаю таймеры), то получается какая-то околесица..
частоты не те и самое интересное, когда ставлю первое
else после первого
if (!PINB.5) на него реагирует и
if (!PINB.4), т.е. при размыкании ключа на PINB.4 тоже пропадает сигнал, этого ведь не должно быть...
То же самое когда ставлю это
else после "420", на него все остальные реагируют...
Код
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0=0xff;
if (!PINB.5) { //PD0 8Hz
TCCR1A=0b01000000;
TCCR1B=0b00001101;
OCR1AH=0x00;
OCR1AL=0x3C;
}
if (!PINB.4) { //PD0 12Hz
TCCR1A=0b01000000;
TCCR1B=0b00001101;
OCR1AH=0x00;
OCR1AL=0x28;
}
if (!PIND.1) { //PD0 420Hz
TCCR2=0b00011010;
OCR2=0x94;
}
if (!PIND.2) { //PD0 480Hz
TCCR2=0b00011010;
OCR2=0x81;
}
if (!PIND.3) { //PD0 580Hz
TCCR2=0b00011010;
OCR2=0x6B;
}
if (!PIND.0) { //PD0 720Hz
TCCR2=0b00011010;
OCR2=0x56;
}
if (!PIND.6) { //PD0 780Hz
TCCR2=0b00011010;
OCR2=0x4F;
}
}
2. При размыкании того же ключа мне нужно вывести в PB1/OC1A - НЛУ, я пишу
Код
else {
PORTB.1=0
TCCR1A=0x00;
TCCR1B=0x00;
};
НО не работает!!! почему?...Сбрасывать в 0 битом FOCn в TCCRn?
3. Не пойму до конца функции FOCn в TCCRn? Написано: ПРинудительное изменение состояния вывода OCn (режимы Normal, CTC). Если я записываю туда 0, то просто не будет генерироваться прерывание и происходить сброс таймера, а программирование COMn1:COMn0 будет доступно? (управление выводом ОСn???)
Спасибо...
Сообщение отредактировал MakFatum - Mar 27 2006, 15:10