Как принять поток данных из массива (изображение) по USART?

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Сообщение mr_smit »

То же самое, 2 раза, сначала светло-синим, потом синим :( Вообще при отправке любого цвета либо грязно синий, либо фиолетовый, с незначительными градациями. Если постоянно нажимать кнопку то при каждом нажатии 3 раза происходит перезаливка. Пытаюсь отправить единственный красный цвет.

http://www.youtube.com/watch?v=-6VBvmknups
Нельзя всё знать, достаточно понимать.
Реклама
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Сообщение mr_smit »

Свершилось!!!!!!!!!!!!!
Изображение

Существенный прогресс!!!!!!!! Работает!!!!!!!! Я поставил компонент TBComPort

Код: Выделить всё

procedure TForm1.Button2Click(Sender: TObject);
var r1,g1,b1:integer;
    Data: Byte;
begin
  r1:=GetRValue(i) shr 3;
  g1:=GetGValue(i) shr 2;
  b1:=GetBValue(i) shr 3;
  i:= (r1 shl 11) + (g1 shl 5) + b1;  // i - глобальная integer, из ColorDialog1

  BComPort1.Open;
  Data := Hi(i);
  BComPort1.Write(Data, SizeOf(Data));
  Data := Lo(i);
  BComPort1.Write(Data, SizeOf(Data));
end;
Т.е. делим полученный цвет на 2 отдельных байта, Hi и Lo, и побайтно отправляем. Сначала первый, затем второй.

Теперь попробую вывести картинку...
Нельзя всё знать, достаточно понимать.
Реклама
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Сообщение mr_smit »

Изображение Изображение

Я счастлив...!!! И это всё на ATMega8...

Теперь осталось разобраться с выводов изображения в заданную область и передачей текста в дисплей.
Нельзя всё знать, достаточно понимать.
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Сообщение mr_smit »

Изображение

Единственное только картинка выводится ооочень долго, 4-5 сек, но я думаю это из-за скорости COM порта. Я поставил 38400. Надо будет увеличить. Потому что заливка экрана одним цветом происходила очень быстро, < 1сек.

P.S. Кстати, в диспетчере устройств для TUSB 3410 можно выставить максимум 128000 бит/сек. Хотя вроде бы производитель обещает гораздо больше, странно.
Нельзя всё знать, достаточно понимать.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Сообщение mr_smit »

Поправте меня если я не прав.

Дисплей 132х176. Т.е. 23232 точек. Каждая точка 2 байта. Т.е. 23232*2=46464 байт.

46464*8бит=371712 бит надо отправить в дисплей чтобы его полностью заполнить. Если грубо принять что на заполнение у меги уходит 1 сек, то получаем скорость порта должна быть 371712 бит/сек. Что не слабо. Ну что ж попробую увеличить скорость порта выше 128000 принудительно.
Нельзя всё знать, достаточно понимать.
Реклама
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Сообщение mr_smit »

А как теперь в потоке байт мне отловить команду отключения дисплея?

Код: Выделить всё

while (1)
      {
      un1.all[1]=getchar(); // первый байт цвета принимаем
      un1.all[0]=getchar(); // второй байт цвета принимаем 
     
      WRDATA(un1.color);
      //fill_screen(un1.color); // отправляем на заливку цветом
      };
Что послать и как отловить? А то не хочется над ним издеваться просто отключением питания.

Т.е. пришла такая то команда, сделать то то, другая то то. Как не спутать команду с цветом?
Нельзя всё знать, достаточно понимать.
Реклама
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Сообщение urry »

ну и в чем проблема ?
выделяете битовую переменную под команда - данные.
При инициализации мк переводите его в режим команда
при приеме байта анализируете команду - если это команда - принять данные, переменную переводите в режим данные и принимаете в дисплей. По окончанию заполнения автоматически сбрасываете назад в режим приема команды. получаете команду - выключить дисплей - выключаете и при этом остаетесь в режиме команда.
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Сообщение mr_smit »

А как отловить окончание приема?
Нельзя всё знать, достаточно понимать.
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Сообщение urry »

По количеству принятых слов, наверное. Если идет речь о заливке всего экрана, то оно фиксированное, части экрана - здесь нужно продумать протокол обмена - например, в команде кода выделить место для количества принятых байт и координате начала заливки.
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Сообщение mr_smit »

"Готовить" картинку буду на стороне ПК (возможностей больше). И потом просто отправлять 176х132 в МК побайтно. Т.е.
urry писал(а):По количеству принятых слов, наверное.
Т.е. например отсылаем байт последовательность D3 F8 1F. Если приняли её - выключить дисплей. Но D3 F8 1F у нас может быть и 1 цветом + половинка др. цвета. Как выделить уникальную команду? Чтобы не спутать её с цветом.
urry писал(а): например, в команде кода выделить место для количества принятых байт и координате начала заливки.
Где пример посмотреть как это делается?

Т.е. если приняли 46464 байта, то при следующем "приеме" может придти команда выключения (пусть даже, например, из 3-х байт D3 F8 1F). Как её отловить? Мы пишем данные в дисплей непрерывно, т.е мы можем в него записать D3 F8 1F, но после этого его надо выключить (функция LCD_PowerOff()).

Код: Выделить всё

while (1)
      {
      un1.all[1]=getchar(); // первый байт цвета принимаем
      un1.all[0]=getchar(); // второй байт цвета принимаем 
     
      if (getchar() != '') {
       bait++;
        if (bait>=46463) {
        bait=0;
        // <- тут как то наверное
        };
      } 
      WRDATA(un1.color);
      };
Так напарился с программой на ПК (вроде работает), что тут не могу сообразить.
Нельзя всё знать, достаточно понимать.
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Сообщение urry »

Код: Выделить всё

#define komanda 1
#define data  0
#define max_data 46463
static bit rejim

rejim = komanda;
while (1)
      {
      un1.all[1]=getchar(); // первый байт цвета принимаем
      un1.all[0]=getchar(); // второй байт цвета принимаем
if(rejim == komanda)
{
if(un1.color == stop)
{
делаем стоп
}
if(un1.color == start_data)
{
rejim=data;
}

}
//--------------------------------
else
{
         WRDATA(un1.color);
count_bait++;
if( count_bait==max_data )
{
count_bait=0;
rejim=komanda;
}
}
      };
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Сообщение mr_smit »

Спасибо за код!!! Но я всё равно не пойму как эти start_data и stop выбрать??? D3 F8 1F ? А если картинка эти данные содержать будет?

Код: Выделить всё

if(un1.color == stop)
...
if(un1.color == start_data)
Что отправить то с ПК???
Нельзя всё знать, достаточно понимать.
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Сообщение mr_smit »

Аааааа.... понял!!!!! Вот я тугодум...

Да простят меня модераторы...

Изображение

Выключение необходимо чтобы при завершении работы ПК дисплей тоже выключался.

Немного баловства. Данные берутся из Эвереста и выводятся на экран.

Изображение

Экземплярчик мне достался тот ещё... некоторые пиксели не работают. Две верхние строчки вообще не работают.

urry, ОГРОМНОЕ ВАМ СПАСИБО!!! Без вас бы ничего не получилось!!!

Если ещё возникнут сложности, отпишусь.
Нельзя всё знать, достаточно понимать.
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Сообщение urry »

Ну эта...
Здесь читать.. Никаких абсолютных значений в тексте...
http://www.pic24.ru/doku.php/osa/articl ... out_errors
"В любые времена и на любой земле" (с) Галина Хомчик.
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Сообщение mr_smit »

У меня стоял кварц на 16 МГц. Чтобы поднять скорость USART поставил кварц на 18,432 МГц. В результате перестал работать SPI. :(

Да, да, я знаю что в даташите ATMega8 максимум 16 МГц.

Но контроллер прошивается, USART работает (попробовал printf("Hellow")). Не работает только SPI !!!

Причем интересно, если отключить питание то на дисплее появляются "следы" и медленно тают. Т.е. как будто дисплей инициируется. Но на посылаемые команды не реагирует. :( Причем даже на те которые отсылает сам МК (без команд с USART) типа заливки экрана одним цветом и т.д.

SPI может работать на 18,432 МГц ??? В чём может быть проблема?

Изображение Изображение

Припаял назад 16 МГц - всё работает.
Нельзя всё знать, достаточно понимать.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18673
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

может ли человек поднять 200 кг? если вы ответите "да", имея ввиду какого-то штангиста, то я отвечу вам "поднимите вы, вы же человек?". так и с МК: написано до 16 МГц, значит ДО. а то, что некоторые узлы работают и при более высокой частоте - это не правило, а исключение.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Сообщение mr_smit »

Ясно. Поставил кварц на 14,7456 МГц.

Так и не смог запустить TUSB3410 на скорости больше 115200 бит/сек. В итоге получил заполнение экрана за 4 сек. Т.к не хватает скорости.

Написал в службу поддержки Texas Instruments. Так ответили мол мы не занимаемся поддержкой сторонних разработчиков в каких либо средах. Я говорю: мол устройство не поддерживает заявленную скорость 921000 бит/сек. Ответ: условия нашего соглашения... мы не помогаем... не поддерживаем.

Не покупайте TUSB3410 в качестве переходника USB-USART !!!!!!

Разве что для малых скоростей.

Лучше FT232. На сайте производителя полно примеров работы с ним. И на Delphi и на С++.
Нельзя всё знать, достаточно понимать.
Аватара пользователя
igor-x
Мудрый кот
Сообщения: 1817
Зарегистрирован: Пн ноя 29, 2010 15:58:43

Re:

Сообщение igor-x »

mr_smit писал(а): В Delphi использую компонент CPortLib.
Для записи в порт у него есть:

Write - Writes non-typed variable to output buffer.
WriteAsync - Writes non-typed variable to output buffer in asynchronous mode.

WriteStr - Writes string type variable to output buffer.
WriteStrAsync - Writes string type variable to output buffer in asnychronous mode.
Добрый день.

подскажите как исправить ошибку:
использую comportlib в CBuilder , пытаюсь сделать асинхронную передачу строки , вот код
TAsync * Async ;
Async = new TAsync;
ComPort-> WriteStrAsync(ServerEdit->Text,Async );

в результате - сообщение об ошибку во время выполнения - invalid pointer operation.

для справки:

typedef TAsync *PAsync;

class DELPHICLASS TComLink;
class PASCALIMPLEMENTATION TComLink : public System::TObject
{
typedef System::TObject inherited;
int __fastcall WriteStrAsync(const AnsiString Str, PAsync &AsyncPtr);

--
Спасибо !
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»