Пн июн 25, 2012 17:04:01
unsigned char tmp=0; // возможное значение: 0..255 (8 бит)
const unsigned char string_in[20] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14}; //гамма функция
unsigned char index_str=0; //индекс массива гамма функции
while (1)
{
// Place your code here
if(rx_counter1 != 0) //если еще не все символы, из входного буфера, прочитанные функцией getchar
{
tmp = getchar1(); // tmp = входной символ (уменьшаем на 1 rx_counter1)
putchar1(tmp^string_in[index_str]); // Xor и отправляем на выход
if (index_str == 19) index_str=0;
else index_str++;
};
};
//Регистр данных USART1 свободен
interrupt [USART1_DRE] void usart1_dr_isr(void)
{
index_str=0;
}
Вт июн 26, 2012 03:10:53
Вт июн 26, 2012 11:02:18
Chip type : ATmega64
Clock frequency : 8,000000 MHz
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Reinitialize Timer 1 value
//Начальное значение Таймера 1 при запуске: ??? (почему эти значения)
TCNT1H=0x0B;
TCNT1L=0xDC;
// Place your code here
index_str=0; // должно выполнятся при переполнении таймера?
}
void main(void)
{
//…
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// OC1C output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x03; // Clock value: 125,000 kHz
//Начальное значение Таймера 1 при запуске: ??? (почему эти значения)
//в прерывании interrupt [TIM1_OVF] void timer1_ovf_isr(void) такие же значения
TCNT1H=0x0B;
TCNT1L=0xDC;
//..
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x04; //при переполнении таймера 1, запуск прерывания interrupt [TIM1_OVF] void timer1_ovf_isr(void)
ETIMSK=0x00; //что это???
//..
while (1)
{
// Place your code here
if(rx_counter1 != 0) //если еще не все символы, из входного буфера, прочитанны функцией getchar
{
tmp = getchar1(); // tmp = входной символ (уменьшаем на 1 rx_counter1)
putchar1(tmp^string_in[index_str]);
if (index_str == 19) index_str=0; //это же должно присходить, если дольше 1сек не поступают входные символы.
else index_str++;
};
}
Вт июн 26, 2012 12:14:27
Вт июн 26, 2012 14:25:06
Вт июн 26, 2012 15:19:33
по окончанию приема или передачи данных через UART происходило установление в ноль переменной
Вт июн 26, 2012 16:38:09
while (1)
{
// Place your code here
if(rx_counter1 != 0) //если еще не все символы, из входного буфера, прочитанные функцией getchar
{
tmp = getchar1(); // tmp = входной символ (уменьшаем на 1 rx_counter1)
putchar1(tmp ^ string_in[index_str]); // Xor 1 символ и отправляем на выход
if (index_str == 19) index_str=0;
else index_str++;
};
//else
// index_str=0;
//if (UDR1 == 0) index_str=0;
if (tx_counter1 == 0)
if (rx_counter1 == 0)
index_str=0;
};
}
while (1)
{
if(rx_counter1 != 0)
{
Запускать таймер (обнуляя его)
};
}
Вт июн 26, 2012 17:12:03
Вт июн 26, 2012 18:13:51
// При переполнении Таймера 1, запуск прерывания (установка начальных значений таймера)
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Reinitialize Timer 1 value (где-то 0,5 секунды)
TCNT1H=0x0B;
TCNT1L=0xDC;
index_str = 0; //обнуляю переменную
}
Ser60 писал(а):Как всегда меня опередили пока спал... Ну раз уж написал, отправлю.
...
Я-бы в основном цикле код в блоке
if (rx_counter1 != 0)
оформил-бы как прерывание от UART по приему символа. В этом случае процессор можно поместить в сон, нечего ему работать высунув язык. Пробуждение будет по приему символа или переполнению таймера.
while (1)
{
if(rx_counter1 != 0)
{
tmp = getchar1();
putchar1(tmp ^ string_in[index_str]);
if (index_str == 19) index_str=0;
else index_str++;
};
};
Вт июн 26, 2012 18:27:34
interrupt <- оформите сами интеррaпт от UART в С
{
tmp = getchar1();
putchar1(tmp ^ string_in[index_str]);
TCNT1 = 0;
TCCR1B = 0x1D;
if (index_str==0)
TCCR1B = 0x1D;
if (index_str == 19) index_str=0;
else index_str++;
}
Как помещать в сон МК?
while(1)
{
#asm("sleep");
}
Вт июн 26, 2012 20:14:26
//Регистр данных USART1 свободен
interrupt [USART1_DRE] void usart1_dr_isr(void)
{
tmp = getchar1();
putchar1(tmp ^ string_in[index_str]);
TCNT1 = 0;
TCCR1B = 0x1D;
if (index_str==0)
TCCR1B = 0x1D;
if (index_str == 19) index_str=0;
else index_str++;
}
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
#asm("sleep");
};
Вт июн 26, 2012 20:41:40
Вт июн 26, 2012 22:15:22
Ser60 писал(а):...поставьте точку останова в отладчике (внутрисхемном) в нагале программы приема символа с UART и посмотрите что принимается.
Ser60 писал(а):...А где ISR от Таймера, что я писал, и где его инициализация?
Вт июн 26, 2012 23:11:23
ICR1 = 0x1E84;
TCCR1A = 0;
TCCR1B = 0x18;
TIMSK1 = 1;
TIFR1 = 0;
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
TCCR1B = 0x18;[i][/i]
index_str=0;
}
Ср июн 27, 2012 10:01:22
TIMSK1 = 1;
TIFR1 = 0;
Error: G:\MK\Mytest_m64d\Mytest_m64d.c(274): undefined symbol 'TIMSK1'
Error: G:\MK\Mytest_m64d\Mytest_m64d.c(275): undefined symbol 'TIFR1'
// Завершение передачи USART1 Transmitter interrupt service routine
interrupt [USART1_TXC] void usart1_tx_isr(void)
{
if (tx_counter1)
{
--tx_counter1;
UDR1=tx_buffer1[tx_rd_index1]; //Регистр ввода/вывода UART – UDR
if (++tx_rd_index1 == TX_BUFFER_SIZE1) tx_rd_index1=0;
};
tmp = getchar1();
putchar1(tmp ^ string_in[index_str]);
TCNT1 = 0;
TCCR1B = 0x1D;
if (index_str==0)
TCCR1B = 0x1D;
if (index_str == 19) index_str=0;
else index_str++;
}
Ср июн 27, 2012 16:32:45
ICR1 = 0x1E84; // настройки таймера до входа в основной цикл
TCCR1A = 0;
TCCR1B = 0x18;
TIMSK = 4;
TIFR = 0;
while (1)
{
if (rx_counter1 != 0) //если еще не все символы из входного буфера прочитанны
{
tmp = getchar1(); // tmp = входной символ (уменьшаем на 1 rx_counter1)
putchar1(tmp^string_in[index_str]); // Xor и отправляем на выход
TCNT1 = 0; // запускаем таймер
if (index_str==0)
TCCR1B = 0x1D;
if (index_str == 19) index_str=0;
else index_str++;
}
}
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
TCCR1B = 0x18;
index_str=0;
}
Чт июн 28, 2012 01:46:46
Пт июн 29, 2012 14:53:20
Пт июн 29, 2012 17:54:47
Пт июн 29, 2012 18:05:20
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Reinitialize Timer 1 value
TCNT1H=0x0B; //задержка таймера
TCNT1L=0xDC; //около 0,5 сек
// Place your code here
index_str = 0;
TIMSK=0x00;
}
void main(void)
{
//…
while (1)
{
// Place your code here
if(rx_counter1 != 0) //если еще не все символы, из входного буфера, прочитанные функцией getchar
{
TIMSK=0x00;
// Reinitialize Timer 1 value
TCNT1H=0x0B;
TCNT1L=0xDC;
tmp = getchar1(); // tmp = входной символ (уменьшаем на 1 rx_counter1)
putchar1(tmp ^ string_in[index_str]); // Xor 1 символ и отправляем на выход
if (index_str == 19) index_str=0;
else index_str++;
}
else
TIMSK=0x04; //при переполнении таймера 1, запуск прерывания interrupt [TIM1_OVF] void timer1_ovf_isr(void)
};
}