Сб авг 04, 2012 17:25:28
Сб авг 04, 2012 21:41:12
Сб авг 04, 2012 21:59:18
Вс авг 05, 2012 04:33:48
Вс авг 05, 2012 08:14:01
Вс авг 05, 2012 09:06:50
+1qwerky писал(а):можно программно - заводите опорный таймер на 10..50кГц и в прерывании опрашивайте вход.
считайте длительность постоянного уровня до изменения на входе, эти длительности декодируйте в 0/1 и складывайте в буфер.
по заполнению буфера нужным числом перепадов - получите код посылки.
Вс авг 05, 2012 09:15:22
Вс авг 05, 2012 09:40:31
Вс авг 05, 2012 20:09:06
Вс авг 05, 2012 22:13:38
Johnson писал(а):МК 8535, порты внешних прерываний не заняты, но по глупости при проектировке запаял дитчик не туда. А до паяльника смогу добраться только к середине недели...
Пн авг 06, 2012 04:56:43
Пн авг 06, 2012 07:14:45
Пн авг 06, 2012 07:22:39
Пн авг 06, 2012 10:45:51
Пн авг 06, 2012 11:13:19
Пн авг 06, 2012 14:18:22
void tmr_reset() {
TCCR0=0; //Выключаем счетчик
TCNT0=0; //Сбрасываем счетчик
evt_cnt=0;
}
interrupt [TIM0_OVF] void timer0_ovf_isr(void){
tmr_reset(); //Если счетчик переполнен, выключаем и обнуляем его
PORTD.3 = 1;
}
interrupt [EXT_INT0] void ext_int0_isr(void){
if (evt_cnt == 0) TCCR0=4; //Если первое событие включаем счетчик, 15.625КГц
if (evt_cnt == 1 && ( TCNT0 < 130 || TCNT0 > 150 )){
tmr_reset(); //Второе событие, если импульс не входит в интервал, выключаем счетчик
//LCD_draw_char(1,0,'=');
//LCD_draw_digit(1,10,TCNT0/100);
//LCD_draw_char(1,0,'-');
}
if (evt_cnt == 2) {
if (TCNT0 < 60 || TCNT0 > 80) { //Проверка на удержание клавиши
tmr_reset();
if (TCNT0 < 60 && pvk[2] != 0){
LCD_draw_char(0,0,pvkc);
LCD_draw_char(0,0,pvk[1]);
//keypress(pvkc,pvk[1]); //Вызываем функцию удержания клавиши
}
}else{ //Если первое нажатие сбрасываем значения
pvkc=0;
pvk[0]=0;
pvk[1]=0;
pvk[2]=0;
}
}
if (TCCR0 != 0) { //Если счетчик включен
if (evt_cnt > 3 && evt_cnt < 67 && (evt_cnt & 1) == 0) {
if (evt_cnt < 36) {
if (TCNT0 > 21) pvkc |= 1<<(17-(evt_cnt>>1)); //Собираем по биту CUSTOM code
}else if(evt_cnt<52) {
if (TCNT0>21) pvk[1]|=1<<(25-(evt_cnt>>1)); //DATA code
}else{
if (TCNT0>21) pvk[0]|=1<<(33-(evt_cnt>>1)); //invert DATA code
}
}
evt_cnt++; //Инкриминируем счетчик событий
if (evt_cnt > 67) {
tmr_reset(); //Выключам счетчик
if (pvk[1]==(pvk[0]^0xff)) { //Проверяем DATA code
pvk[2]=1; //Значит Ок
//keydown(pvkc,pvk[1]); //Вызываем функцию нажатия клавиши
//LCD_draw_char(0,0,pvkc);
//LCD_draw_char(0,0,pvk[1]);
}
}
TCNT0=0; //Сбрасываем счетчик
}
}
//////////////////////////////////////////////////////////
TCCR2=0b00000100; //250 kHz
TIMSK=0b01000001; // TIM2-overflow, TIM0-overflow
ACSR =0b10000000;
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Any change
GICR|=0x40;
MCUCR=0x01;
MCUCSR=0x00;
GIFR=0x40;
Пн авг 06, 2012 15:47:00
Johnson писал(а):По закомментированным кускам в прерывании видно, что я пытался отследить, какое значение имеет TCNT0, но он всегда возвращал "0", и в случае TCNT0/10 и в случае TCNT0/100
Подскажите, где я опять споткнулся?
А ещё был бы очень благодарен за ссылку на статью о таймерах и рассчете их таймингов.
К примеру, таймер установлен на 15кГц. Это он переполняться будет с частотой 15кГц, или инкрементировать счетчик?
Пн авг 06, 2012 16:08:57
Пн авг 06, 2012 16:37:48
Пн авг 06, 2012 17:24:23
zero648 писал(а):Какая частота МК и что за МК? А то вот эти две вещи как-то несовместимы:
....
if (evt_cnt == 0) TCCR0=4; //Если первое событие включаем счетчик, 15.625КГц
....
TCCR2=0b00000100; //250 kHz
....
ATmega16
прескалер для таймера0, таймера1:
001=1:1, 010=1:8, 011=1:64, 100=1:256, 101=1:1024
прескалер для таймера2:
001=1:1, 010=1:8, 011=1:32, 100=1:64, 101=1:128, 110=1:256, 111=1:1024