http://www.youtube.com/watch?v=-6VBvmknups
Как принять поток данных из массива (изображение) по USART?
То же самое, 2 раза, сначала светло-синим, потом синим
Вообще при отправке любого цвета либо грязно синий, либо фиолетовый, с незначительными градациями. Если постоянно нажимать кнопку то при каждом нажатии 3 раза происходит перезаливка. Пытаюсь отправить единственный красный цвет.
http://www.youtube.com/watch?v=-6VBvmknups
http://www.youtube.com/watch?v=-6VBvmknups
Нельзя всё знать, достаточно понимать.
- Реклама
Свершилось!!!!!!!!!!!!!

Существенный прогресс!!!!!!!! Работает!!!!!!!! Я поставил компонент TBComPort
Т.е. делим полученный цвет на 2 отдельных байта, Hi и Lo, и побайтно отправляем. Сначала первый, затем второй.
Теперь попробую вывести картинку...

Существенный прогресс!!!!!!!! Работает!!!!!!!! Я поставил компонент 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;Теперь попробую вывести картинку...
Нельзя всё знать, достаточно понимать.

Единственное только картинка выводится ооочень долго, 4-5 сек, но я думаю это из-за скорости COM порта. Я поставил 38400. Надо будет увеличить. Потому что заливка экрана одним цветом происходила очень быстро, < 1сек.
P.S. Кстати, в диспетчере устройств для TUSB 3410 можно выставить максимум 128000 бит/сек. Хотя вроде бы производитель обещает гораздо больше, странно.
Нельзя всё знать, достаточно понимать.
Поправте меня если я не прав.
Дисплей 132х176. Т.е. 23232 точек. Каждая точка 2 байта. Т.е. 23232*2=46464 байт.
46464*8бит=371712 бит надо отправить в дисплей чтобы его полностью заполнить. Если грубо принять что на заполнение у меги уходит 1 сек, то получаем скорость порта должна быть 371712 бит/сек. Что не слабо. Ну что ж попробую увеличить скорость порта выше 128000 принудительно.
Дисплей 132х176. Т.е. 23232 точек. Каждая точка 2 байта. Т.е. 23232*2=46464 байт.
46464*8бит=371712 бит надо отправить в дисплей чтобы его полностью заполнить. Если грубо принять что на заполнение у меги уходит 1 сек, то получаем скорость порта должна быть 371712 бит/сек. Что не слабо. Ну что ж попробую увеличить скорость порта выше 128000 принудительно.
Нельзя всё знать, достаточно понимать.
- Реклама
А как теперь в потоке байт мне отловить команду отключения дисплея?
Что послать и как отловить? А то не хочется над ним издеваться просто отключением питания.
Т.е. пришла такая то команда, сделать то то, другая то то. Как не спутать команду с цветом?
Код: Выделить всё
while (1)
{
un1.all[1]=getchar(); // первый байт цвета принимаем
un1.all[0]=getchar(); // второй байт цвета принимаем
WRDATA(un1.color);
//fill_screen(un1.color); // отправляем на заливку цветом
};
Т.е. пришла такая то команда, сделать то то, другая то то. Как не спутать команду с цветом?
Нельзя всё знать, достаточно понимать.
- urry
- Сверлит текстолит когтями
- Сообщения: 1262
- Зарегистрирован: Пн дек 08, 2008 10:58:48
- Откуда: Винница
- Контактная информация:
ну и в чем проблема ?
выделяете битовую переменную под команда - данные.
При инициализации мк переводите его в режим команда
при приеме байта анализируете команду - если это команда - принять данные, переменную переводите в режим данные и принимаете в дисплей. По окончанию заполнения автоматически сбрасываете назад в режим приема команды. получаете команду - выключить дисплей - выключаете и при этом остаетесь в режиме команда.
выделяете битовую переменную под команда - данные.
При инициализации мк переводите его в режим команда
при приеме байта анализируете команду - если это команда - принять данные, переменную переводите в режим данные и принимаете в дисплей. По окончанию заполнения автоматически сбрасываете назад в режим приема команды. получаете команду - выключить дисплей - выключаете и при этом остаетесь в режиме команда.
"Готовить" картинку буду на стороне ПК (возможностей больше). И потом просто отправлять 176х132 в МК побайтно. Т.е.
Т.е. если приняли 46464 байта, то при следующем "приеме" может придти команда выключения (пусть даже, например, из 3-х байт D3 F8 1F). Как её отловить? Мы пишем данные в дисплей непрерывно, т.е мы можем в него записать D3 F8 1F, но после этого его надо выключить (функция LCD_PowerOff()).
Так напарился с программой на ПК (вроде работает), что тут не могу сообразить.
Т.е. например отсылаем байт последовательность D3 F8 1F. Если приняли её - выключить дисплей. Но D3 F8 1F у нас может быть и 1 цветом + половинка др. цвета. Как выделить уникальную команду? Чтобы не спутать её с цветом.urry писал(а):По количеству принятых слов, наверное.
Где пример посмотреть как это делается?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
- Откуда: Винница
- Контактная информация:
Код: Выделить всё
#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;
}
}
};
Спасибо за код!!! Но я всё равно не пойму как эти start_data и stop выбрать??? D3 F8 1F ? А если картинка эти данные содержать будет?
Что отправить то с ПК???
Код: Выделить всё
if(un1.color == stop)
...
if(un1.color == start_data)Нельзя всё знать, достаточно понимать.
Аааааа.... понял!!!!! Вот я тугодум...
Да простят меня модераторы...

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

Экземплярчик мне достался тот ещё... некоторые пиксели не работают. Две верхние строчки вообще не работают.
urry, ОГРОМНОЕ ВАМ СПАСИБО!!! Без вас бы ничего не получилось!!!
Если ещё возникнут сложности, отпишусь.
Да простят меня модераторы...

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

Экземплярчик мне достался тот ещё... некоторые пиксели не работают. Две верхние строчки вообще не работают.
urry, ОГРОМНОЕ ВАМ СПАСИБО!!! Без вас бы ничего не получилось!!!
Если ещё возникнут сложности, отпишусь.
Нельзя всё знать, достаточно понимать.
- urry
- Сверлит текстолит когтями
- Сообщения: 1262
- Зарегистрирован: Пн дек 08, 2008 10:58:48
- Откуда: Винница
- Контактная информация:
Ну эта...
Здесь читать.. Никаких абсолютных значений в тексте...
http://www.pic24.ru/doku.php/osa/articl ... out_errors
"В любые времена и на любой земле" (с) Галина Хомчик.
Здесь читать.. Никаких абсолютных значений в тексте...
http://www.pic24.ru/doku.php/osa/articl ... out_errors
"В любые времена и на любой земле" (с) Галина Хомчик.
У меня стоял кварц на 16 МГц. Чтобы поднять скорость USART поставил кварц на 18,432 МГц. В результате перестал работать SPI.
Да, да, я знаю что в даташите ATMega8 максимум 16 МГц.
Но контроллер прошивается, USART работает (попробовал printf("Hellow")). Не работает только SPI !!!
Причем интересно, если отключить питание то на дисплее появляются "следы" и медленно тают. Т.е. как будто дисплей инициируется. Но на посылаемые команды не реагирует.
Причем даже на те которые отсылает сам МК (без команд с USART) типа заливки экрана одним цветом и т.д.
SPI может работать на 18,432 МГц ??? В чём может быть проблема?

Припаял назад 16 МГц - всё работает.
Да, да, я знаю что в даташите ATMega8 максимум 16 МГц.
Но контроллер прошивается, USART работает (попробовал printf("Hellow")). Не работает только SPI !!!
Причем интересно, если отключить питание то на дисплее появляются "следы" и медленно тают. Т.е. как будто дисплей инициируется. Но на посылаемые команды не реагирует.
SPI может работать на 18,432 МГц ??? В чём может быть проблема?

Припаял назад 16 МГц - всё работает.
Нельзя всё знать, достаточно понимать.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18673
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
может ли человек поднять 200 кг? если вы ответите "да", имея ввиду какого-то штангиста, то я отвечу вам "поднимите вы, вы же человек?". так и с МК: написано до 16 МГц, значит ДО. а то, что некоторые узлы работают и при более высокой частоте - это не правило, а исключение.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Ясно. Поставил кварц на 14,7456 МГц.
Так и не смог запустить TUSB3410 на скорости больше 115200 бит/сек. В итоге получил заполнение экрана за 4 сек. Т.к не хватает скорости.
Написал в службу поддержки Texas Instruments. Так ответили мол мы не занимаемся поддержкой сторонних разработчиков в каких либо средах. Я говорю: мол устройство не поддерживает заявленную скорость 921000 бит/сек. Ответ: условия нашего соглашения... мы не помогаем... не поддерживаем.
Не покупайте TUSB3410 в качестве переходника USB-USART !!!!!!
Разве что для малых скоростей.
Лучше FT232. На сайте производителя полно примеров работы с ним. И на Delphi и на С++.
Так и не смог запустить TUSB3410 на скорости больше 115200 бит/сек. В итоге получил заполнение экрана за 4 сек. Т.к не хватает скорости.
Написал в службу поддержки Texas Instruments. Так ответили мол мы не занимаемся поддержкой сторонних разработчиков в каких либо средах. Я говорю: мол устройство не поддерживает заявленную скорость 921000 бит/сек. Ответ: условия нашего соглашения... мы не помогаем... не поддерживаем.
Не покупайте TUSB3410 в качестве переходника USB-USART !!!!!!
Разве что для малых скоростей.
Лучше FT232. На сайте производителя полно примеров работы с ним. И на Delphi и на С++.
Нельзя всё знать, достаточно понимать.
Re:
Добрый день.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);
--
Спасибо !




