Atmega8 Ambilight

Всем привет!! Делаю амбилайт, ну типа захотелось сделать свой вариант. Идея в чем - взять две atmega8 - один отвечает за USB HID, а другая именно за програмный шим на всех ножках. Вобщем думаю связать ето все по UART. С передачей по USBразобрался, как и с ШИМом, нужен именно UART. У кого есть какие мысли? Первая Atmega8 работает на 12мГц (USB) вторая - от 4мГц (можно больше, даже с кварцем). Заранее спасибо

То есть проблема только в

То есть проблема только в том, что бы соединить две меги по UART?
Или протокол их "общения" тоже надо разработать? Вот чувак делал, что вышло:

Какраз нужен рабочий код UART

Какраз нужен рабочий код UART для меги на 12мГц. ЮСБ и ШИМ я уже реализовал, также как и программу анализирующую изображение с монитора на самом компе.

так это же совсем просто,

так это же совсем просто, смотри заметку: http://avrlab.com/node/44 в ней код рабочий есть, с подрограммами отправки и приема данных по ЮАРТ. По поводу кварцев, там отдельно вопрос, нужно смотреть даташит на микроконтроллер и выбирать правильное значение для инициализации модуля ЮСАРТ. Скажи Микроконтроллерк акой у тебя и на какой скорости соединения ты хочешь работать (ну и частоту на которой работают МК) для ЮСАРТ обязательно кварц должен быть внешним, так как при тактировании от внутреннего источника могут быть сбои.

Первая Atmega8 работает на

Первая Atmega8 работает на 12мГц (USB) вторая - от 4мГц (можно больше, думаю тоже взять 12мГц чтоб не паритса).

Вот исходник

Вот исходник:

  1. #include <avr/io.h>//Библиотека ввода/вывода
  2. #include <avr/interrupt.h>//Библиотека прерываний
  3.  
  4. //Прототипы подпрограмм
  5. void USART_Transmit( unsigned char data );
  6. void USART_Init( unsigned int ubrr);
  7.  
  8. void USART_Init( unsigned int ubrr)//Инициализация модуля USART
  9. {
  10. /* Задаем скорость работы USART */
  11. UBRRH = (unsigned char)(ubrr>>8);
  12. UBRRL = (unsigned char)ubrr;
  13. /* Разрешаем прием и передачу по USART */
  14. UCSRB=(1<<RXEN)|( 1<<TXEN);
  15. UCSRB |= (1<<RXCIE);
  16. /* Устанавливаем формат данных 8 бит данных, 2 стоп бита */
  17. UCSRC=0x86;// Инициализация именно для ATmega8
  18. UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
  19. }
  20.  
  21. void USART_Transmit( unsigned char data ) //Функция отправки данных
  22. {
  23. while ( !(UCSRA & (1<<UDRE)) ); //Ожидание опустошения буфера приема
  24. UDR = data; //Начало передачи данных
  25. }
  26.  
  27. int main(void)//главная программа
  28. {
  29. //Скорость USART 115200 при кварцевом генераторе 16MHz
  30. USART_Init (8);
  31.  
  32. USART_Transmit('O');//Передаем при включении
  33. USART_Transmit('k');//сообщение "Ok!", что свидетельствует
  34. USART_Transmit('!');//о правильно работе программы
  35.  
  36. USART_Transmit(0x0d);//переход в начало строки
  37. USART_Transmit(0x0a);//переход на новую строку
  38.  
  39. while(1)//вечный цикл
  40. {
  41. }//
  42. }

Тебе осталось только подобрать значение баудрейт для 12МГц, берется из документации на ATmega8

Вопрос. Передаю данные по

Вопрос. Передаю данные по USART в виде:
USART_Init (6);
USART_Transmit(data[1]);
USART_Transmit(0x0d);
USART_Transmit(0x0a);
USART_Transmit(data[2]);
USART_Transmit(0x0d);
USART_Transmit(0x0a);
...
USART_Transmit(data[18]);
USART_Transmit(0x0d);
USART_Transmit(0x0a);

data[i] - ето значение прилетающие по USB. Как на другом конроллере отделить ети самые data[i] одни от других (их же 18)? Передача идет нормально.
Кстати да, вот сделал прикольний калькулятор для USART на мегу8 кому нада - берите):
fayloobmennik.net/1542219