Цитата(AnKing @ Oct 21 2010, 23:17)

как можно обратиться к отдельному биту в регистре не похерив все остальные?
На Си - это поразрядные опрерации &(Поразрядное И) , | (паразрядное ИЛИ) ,
а вообще если это регистр можно и установить отдельно бит, ели по pdf на это бит регистра разрешена запись.
cbi $12. 7 ; Очистить бит 7 в Порте D это на ассемблере для AVR, вот еще поизучайте системму команд обязательно:
http://www.gaw.ru/html.cgi/txt/doc/micros/avr/asm/start.htmЦитата(AnKing @ Oct 21 2010, 23:17)

И так что там по поводу кольцевого буфера, может подкинет кто примерчик пожалста
Даю 100% рабочий кусок кода, но Вам его нужно будет подкорректировать, т.к он
написан для PIC24 с использованием компилятора C30, но это будет вам полезно, самому тоже поразбираться, что и как, не помешает.
Наилучшие пожелания!
// ---- Колцевая очередь ------------------------------
struct Line{
WORD size_line;
WORD Rx_Ptr;
WORD Tx_Ptr;
WORD num_element;
BYTE *ptr_buff ;
};
// --------- Структуры для данных UART1_Rx ----------
struct Line Rx1_Line;
struct Line* Ptr_Rx_line1;
BYTE RX_UART1_buff[64];
// ------ Инициализация очереди ----------------------
void Rx1_Line_init(void)
{
// Очищение очереди
memset( &Rx1_Line, 0, sizeof(Rx1_Line) ) ;
// Размер очереди
Rx1_Line.size_line = sizeof(RX_UART1_buff);
// Очищение буфера
memset( &RX_UART1_buff[0],0,sizeof(RX_UART1_buff) );
// настройка Указателя очереди на буфер
Rx1_Line.ptr_buff = &RX_UART1_buff[0];
// настройка Указателя на очередь
Ptr_Rx_line1 = &Rx1_Line ;
}
//****************************************************
// ---------- Обработчик прерывания UART_RX1 (С30) -----------------------------------------------------
void __attribute__((__interrupt__, no_auto_psv)) _AltU1RXInterrupt(void) - Тут замените на свой код
{
BYTE TEMP;
IEC0bits.U1RXIE = 0; // UART1 Receiver Interrupt Enable bit (1 = Interrupt request enabled)
while(U1STAbits.URXDA != 0) // Пока есть, что вычитать а аппаратного буфера UART Rx
{
TEMP = U1RXREG;
set_Line_element(Ptr_Rx_line1, TEMP);
}
IFS0bits.U1RXIF = 0; // сбросил флаг прерывания
IEC0bits.U1RXIE = 1; // UART1 Receiver Interrupt Enable bit (1 = Interrupt request enabled)
}
//********************************************************************************
****
// -------Функция получает указатель на очередь и байт ------------------------------------
// --- который записывается в эту очередь -----------------------------------------------------
void set_Line_element(struct Line *Ptr, BYTE data)
{
IEC1bits.U2RXIE = 0; // UART2 Receiver Interrupt Enable bit (1 = Interrupt request enabled) - Тут замените на свой код (Запрет прерываний по UART Rx)
Ptr -> ptr_buff[Ptr -> Rx_Ptr] = data;
Ptr -> Rx_Ptr++;
Ptr -> num_element++;
if ( Ptr -> num_element >= Ptr -> size_line)
Ptr -> num_element = Ptr -> size_line;
Ptr -> Rx_Ptr = (Ptr -> Rx_Ptr % Ptr -> size_line);
IEC1bits.U2RXIE = 1; // UART2 Receiver Interrupt Enable bit (1 = Interrupt request enabled) - Тут замените на свой код (Разрешение прерываний по UART Rx)
}
//********************************************************************************
************
Сообщение отредактировал Danis - Oct 22 2010, 04:41