~=InSpe©tor=~ 0 16 декабря, 2007 Опубликовано 16 декабря, 2007 (изменено) · Жалоба :( Есть 2 ATMega8 (допустим...) Ну начальный код с помощью мастера... Сразу возникает вопрос... в чем разница на вкладке "I2C" и "2 Wire (I2C)"... один программно а другой аппаратно что-ли?... ну так вот... Как настроить в мастере чтобы организовать отправку-получение строки данных... (Конкретно АТ комманд для модема...) с одного в другой... Для первого и второго AVR... Подробный пример с описанием для каждого AVR... Желательно для работы с аппаратным TWI... Когда возникает прерывание... Созданное мастером... Как принять, как отправить данные (примеры функций...)... Внятного ответа не нашел... Попытки разобраться самостоятельно ни к чему, кроме как досканального знания самого протокола... Конкретно интересует Slave... С мастером всё более менее ясно... ну и соответственно тоже самое с UART... как отпралять и принимать данные... с примерами... :excl: только под CodeVision... Заранее огромное спасибо... Изменено 16 декабря, 2007 пользователем ~=InSpe©tor=~ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gogan 0 17 декабря, 2007 Опубликовано 17 декабря, 2007 (изменено) · Жалоба С I2C не работал, но по UART отправлял данные с компа на атмега и обратно. В codevision -> help topics (F1) -> CodeVisionAVR C Compiler Library Functions -> I2C bus functions - там все расписано. При создании проэкта - используешь мастер - там можно включить и UART и I2C. Если с английским сложно, тогда сори. Вот код для работы UART, если не ошибаюсь - частота контроллера 8мхз, скорость передачи 19200, размер слова 8бит, асинхронная передача, размер буфера - 8 байт... #define RXB8 1 #define TXB8 0 #define UPE 2 #define OVR 3 #define FE 4 #define UDRE 5 #define RXC 7 #define FRAMING_ERROR (1<<FE) #define PARITY_ERROR (1<<UPE) #define DATA_OVERRUN (1<<OVR) #define DATA_REGISTER_EMPTY (1<<UDRE) #define RX_COMPLETE (1<<RXC) // USART Receiver buffer #define RX_BUFFER_SIZE 8 char rx_buffer[RX_BUFFER_SIZE]; #if RX_BUFFER_SIZE<256 unsigned char rx_wr_index,rx_rd_index,rx_counter; #else unsigned int rx_wr_index,rx_rd_index,rx_counter; #endif // This flag is set on USART Receiver buffer overflow bit rx_buffer_overflow; // USART Receiver interrupt service routine interrupt [USART_RXC] void usart_rx_isr(void) { char status,data; status=UCSRA; data=UDR; if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) { rx_buffer[rx_wr_index]=data; if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0; if (++rx_counter == RX_BUFFER_SIZE) { rx_counter=0; rx_buffer_overflow=1; }; }; } #ifndef _DEBUG_TERMINAL_IO_ // Get a character from the USART Receiver buffer #define _ALTERNATE_GETCHAR_ #pragma used+ char getchar(void) { char data; while (rx_counter==0); data=rx_buffer[rx_rd_index]; if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0; #asm("cli") --rx_counter; #asm("sei") return data; } #pragma used- #endif // USART Transmitter buffer #define TX_BUFFER_SIZE 8 char tx_buffer[TX_BUFFER_SIZE]; #if TX_BUFFER_SIZE<256 unsigned char tx_wr_index,tx_rd_index,tx_counter; #else unsigned int tx_wr_index,tx_rd_index,tx_counter; #endif // USART Transmitter interrupt service routine interrupt [USART_TXC] void usart_tx_isr(void) { if (tx_counter) { --tx_counter; UDR=tx_buffer[tx_rd_index]; if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0; }; } #ifndef _DEBUG_TERMINAL_IO_ // Write a character to the USART Transmitter buffer #define _ALTERNATE_PUTCHAR_ #pragma used+ void putchar(char c) { while (tx_counter == TX_BUFFER_SIZE); #asm("cli") if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0)) { tx_buffer[tx_wr_index]=c; if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0; ++tx_counter; } else UDR=c; #asm("sei") } #pragma used- #endif // ... далее в основном цикле для приема пишешь: if(rx_counter!=0){ a=getchar(); } // и для отправки - putchar('a'); Изменено 17 декабря, 2007 пользователем Gogan Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
~=InSpe©tor=~ 0 17 декабря, 2007 Опубликовано 17 декабря, 2007 (изменено) · Жалоба Вот... Примерно этого я и ждал... Ща буду разбираться... Огромное спасибо... В codevision -> help topics (F1) -> CodeVisionAVR C Compiler Library Functions -> I2C bus functions - там все расписано. Да смотрел я тут... тут походу расписаны функции програмной реализации.... еще и только мастера.... А с мастером работать элементарно... Проблема в Slave... Если его програмно делать... То он должен неприрывно следить за появлением признака "Start"... и нет времени на обработку других задач... Поэтому нужен пример работы с Аппаратным TWI... в АппНоутах порылся... 311 и 315 (последний даже с переводом...)... вроде понятно... но там библиотеки не для CodeVision... поэтому функции из аппноута не пройдут... Подобной библиотеки для CV не нашел... Самому переписать - знаний синтаксиса не хватает... :05: Ну вроде с основой разобрался.... Огромное.... Огромное спасибо.... На днях проверю в действии.... Есть конечно непонятные участки кода.... Генерируемого мастером.... Но главное ясно как эти функции использовать.... То-есть когда rx_counter!=0 - значит что-то принято, и лежит в буфере?... я правильно понял?... и мы забираем это оттуда a=getchar();... теперь инфа лежит в a.... а буфер снова пуст.... Изменено 17 декабря, 2007 пользователем ~=InSpe©tor=~ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gogan 0 17 декабря, 2007 Опубликовано 17 декабря, 2007 · Жалоба То-есть когда rx_counter!=0 - значит что-то принято, и лежит в буфере?... я правильно понял?... и мы забираем это оттуда a=getchar();... теперь инфа лежит в a.... а буфер снова пуст.... именно так Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться