Ответ

Предупреждение: в данной теме не было сообщений более 730 дней.
Если не уверены, что хотите ответить, то лучше создайте новую тему.
Имя:
E-mail:
Тема:
Иконка:

Визуальная проверка:
Белое солнце ...:
Денег нет, но вы ...:
Тебя что, в Гугле ... ?:

подсказка: нажмите alt+s для отправки или alt+p для предварительного просмотра сообщения


Сообщения в этой теме

Автор: Andy
« : 30 Ноября 2009, 06:16:08 »

Цитировать
Это мой косяк. Здесь не J нужна, а некая иная переменная, чтоб J не испортить, например N = Memcopy ...... Просто надо возвращаемое MEMCOPY значение (кол-во скопированных байт) чему-нибудь присваивать.

Ага, так и сделал, хотя внвчале и тупил, почему алгоритм не работает...
Автор: pumpkin
« : 30 Ноября 2009, 06:06:45 »

Цитировать
Тонкость - Кажется в памяти длинные переменные наоборот сидят. Но это не имеет значения, когда эту процедуру дераешь дважды - при зашифровке и расшифровке.
Ага. Когда на те же 4 байта в памяти смотришь не как на байты, а как на единый Long, то байты видятся в обратном порядке.

Цитировать
А зачем переменные J = Memcopy J нужна совсем не понимаю - видимо как счетчик.
Это мой косяк. Здесь не J нужна, а некая иная переменная, чтоб J не испортить, например N = Memcopy ...... Просто надо возвращаемое MEMCOPY значение (кол-во скопированных байт) чему-нибудь присваивать.
Автор: Andy
« : 30 Ноября 2009, 02:11:36 »

Цитировать
MEMCOPY используешь? Типо так (грубо):

Dim Block(128) As Byte
Dim Plane(4) As Long
Dim J,K As Byte
\'Тут вытаскиваем в массив Block очередные зашифрованные 128 байт (страница)
.........................................
For J = 0 To 7
  K = J * 16 + 1
  J = Memcopy(block(K) , Plane(1) , 16)
  Gosub Decrypt
  J = Memcopy(Plane(1) , block(K) , 16)
Next
\' Расшифрована очередная страница
 

Работает, блин! Код упростился на порядок - освободилось почти 400 байт! Тонкость - Кажется в памяти длинные переменные наоборот сидят. Но это не имеет значения, когда эту процедуру дераешь дважды - при зашифровке и расшифровке. А зачем переменные J = Memcopy J нужна совсем не понимаю - видимо как счетчик.

А еще загрузчик у меня наконец заработал! Отлично расшифровывает и прошивает!
Автор: pumpkin
« : 27 Ноября 2009, 08:34:53 »

Как на реальном железе - проверить не могу, но в симуляторе нажатая во время Wait клавиша попадает в буфер и там ждет, пока не будет считана командой Inkey. Причем, если успеть нажать несколько клавиш - сохраняется последняя (буфер на один байт всего).

И, действительно, лучше опросы сделать почаще, например, 10 раз в секунду (Waitms 100). Чтоб более отзывчива была на действия пользователя.

PS^ Wait в симуляторе оказывается работает, просто оооооооооооочень медленно, я просто никак дождаться не мог пока "секунда" пройдет  :)
Автор: Andy
« : 27 Ноября 2009, 02:11:58 »

Попробую, но кажется те же яйца только в профиль - когда будет выполнятся команда Wait 1 символ с клавы считыватся НЕ будет. Зато можно использовать waitms, но ее диапазон ограничен 1000 милисекунд, зато можно проверять условие внутри цикла наращивания микросекунд от ноля до 1000.
Автор: pumpkin
« : 26 Ноября 2009, 20:50:05 »

C часами и таймерами сам ничего из хелпа не понял.
В BASCOM AVR IDE есть кучка примеров в папке SAMPLES, может там что-то полезное найдешь.
Автор: pumpkin
« : 26 Ноября 2009, 20:43:00 »

Я смотрю по этой документации: http://avrhelp.mcselec.com/index.html

Посмотри там в сторону INKEY и WAITKEY. Если конечно это та клавиатура, о которой ты говоришь.

Что-то типа этого (печатает код нажатой клавиши и время в секундах между нажатиями, при нажатии ESC - выходит):

Dim A As Byte
Dim I As Long
I = 0
Do
   A = Inkey()          
   If A > 0 Then
      Print "ASCII code " ; A ; " from serial"
      Print "Timeout is " ; I ; " seconds"
      I = 0                \'
   End If
   Wait 1
   I = I + 1
Loop Until A = 27

У меня Wait на эмуляторе что-то не работает, так что полностью не проверено.
Автор: Andy
« : 26 Ноября 2009, 16:36:15 »

Вот пример моего незнания - нужно запустить процесс и считать и запомнить время после нажатия любой определенной клавиши. Делаю простым циколом со сложением с командой wait и отображаю на экране осчет. Выход и запоминание идет по прерыванию с клавиатуры. НО кнопку недостаточно нажать, ее надо удерживать нажатой в течении одной секунды, потому что команда WAIT прерыванием не прерывается. Поэтому получилось несколько кривовато - юзеру надо ЗНАТЬ, что кнопку надо УДЕРЖИВАТЬ, а не нажать.

Вот код:

On Int0 Key

Key:
B = Getatkbd()
Return

Dellong:
If Bittime = 1 Then
Cls
Enable Int0
B = 0
For Deleylong = 2 To 999
Longstr = W29                                               \'Enter, Пробел
Gosub Printlsd
Locate 2 , 6
Lcd Deleylong
Wait 1
Cls
If B = 13 Then
Bittime = 0
Exit For
Else
If B = 32 Then
Deleylong = 1
Exit For
End If
End If
Next
Disable Int0
Else
Wait Deleylong
End If
Return



Вообще, в своих програмках стараюсь делать для юзера максимума удобств и интуитивности, так как часто сталкиваюсь с убожеством интерфейса во всяких кассах и околокассовых дивайсах.
Автор: Andy
« : 26 Ноября 2009, 16:19:07 »

Дело в том, что основной источник для меня по баскому - книжка Кулиша - СПРАВОЧНИК ПО ПРОГРАММИРОВАНИЮ
BASCOM-8051

Но она далеко неполна, например про memcopy там нет ни слова.  Про таймеры вообще понять не могу, как они работают и программируются, пока не поподались. Так что рад буду любому совету.
Автор: Andy
« : 26 Ноября 2009, 02:29:00 »

Ок, посмотрю.... :-)
Автор: pumpkin
« : 25 Ноября 2009, 21:06:49 »

Это я просто размышлял над вариантами оптимизации вот этого места:
Цитировать
данные побайтово читаюся из eepirom, собираются в 4 четырехбайтовые перемные, расшифровываются, снова разбираются на байты и собираются в 128 байтовые страницы для прошивки
чтоб не собирать-разбирать вручную из байтов, а кидать в Plain и обратно разом куски по 16 байт = 128 бит (4*Long).

Еще один вариант оптимизации - посмотреть в сторону конструкции
Dim Page(128) As Byte
Dim Plain(32) As Long At Block(1) Overlay

То есть Page и Plain - фактически один участок памяти, но обращаться к нему можно двумя путями.
Автор: Andy
« : 25 Ноября 2009, 02:31:42 »

Не, там расшифровка идет блоками по 128 БИТ. (четыре терырехбайтовые переменные сам же алгоритм помогаал до ума доводить :-)
А страницы по 128 БАЙТ прошиваются хитро, там в помощи баскома образец есть, его взял за основу....
Автор: pumpkin
« : 24 Ноября 2009, 21:49:42 »

MEMCOPY используешь? Типо так (грубо):

Dim Block(128) As Byte
Dim Plane(4) As Long
Dim J,K As Byte
\'Тут вытаскиваем в массив Block очередные зашифрованные 128 байт (страница)
.........................................
For J = 0 To 7
  K = J * 16 + 1
  J = Memcopy(block(K) , Plane(1) , 16)
  Gosub Decrypt
  J = Memcopy(Plane(1) , block(K) , 16)
Next
\' Расшифрована очередная страница
Автор: Andy
« : 24 Ноября 2009, 14:13:58 »

Криптованый загрузчик близок к завершению. Влез в 4 килобайта памяти, что для бейсика очень неплохо, считаю. Во первых - четырехбайтовые переменные и операции с ними жрут прорву ресурсов у 8-ми разрядного контроллера. Во-вторых загрузчик уменет обновлятся с I2C eepirom с заранее залитой криптованой прошивкой.  А в третих - навороченый для меня алгоритм - данные побайтово читаюся из eepirom, собираются в 4 четырехбайтовые перемные, расшифровываются, снова разбираются на байты и собираются в 128 байтовые страницы для прошивки (особенность самопрограммирования AVR...). Без советов pumpkin-а не знаю, чтобы делал... Очень прригодился алгоритм сдвига бит в пепеменной - ключевой для сборки и разборки переменных на байты.
По сравнению с умножением и делением - выигрывает в размере и производительности в несколько раз! Спасибо, pumpkin!
Автор: pumpkin
« : 14 Ноября 2009, 07:53:53 »

Цитировать
Но почему не работало сложение в цикле? 
У меня вообще не компилировался, пока я Z не объявил.
Потом пошли неправильные результаты в этом цикле, пока я не обратил внимание на то, что Delta вместо &H9E3779B9 стала &H9E3879B9. Все дело оказалось в Const, косяк именно с ним. К числам больше 0x7FFFFFFF (то есть, отрицательным) для чего-то прибавляет 0x00010000. Вот, например такой код Const Delta1 = &HFFFF1100
Const Delta2 = &H990000AA

Dim X1 As Long
Dim X2 As Long

X1 = Delta1
X2 = Delta2
Print Hex(x1)
Print Hex(x2)

X1 = &HFFFF1100
X2 = &H990000AA
Print Hex(x1)
Print Hex(x2)

должен по идее вывести
FFFF1100
990000AA
FFFF1100
990000AA


а реально выводит такую фигню
00001100
990100AA
FFFF1100
990000AA


Возможно у Const-а еще сюрпризы имеются, я бы им не пользовался больше.