Автор Тема: Тонкости программирования и использования AVR  (Прочитано 34501 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Andy

  • Администратор Форумa
  • Эксперт
  • *
  • Сообщений: 1803
  • Карма: 15
  • Пол: Мужской
  • Нельзя отремонтировать то, что не сломано...
    • minilabmaster
    • Просмотр профиля
    • Форум "Минилаб-Мастер"
Ок, посмотрю.... :-)
Заклинило деталь - надави на нее, если она сломалась - ничего, ее все равно надо было менять.

Andy

  • Администратор Форумa
  • Эксперт
  • *
  • Сообщений: 1803
  • Карма: 15
  • Пол: Мужской
  • Нельзя отремонтировать то, что не сломано...
    • minilabmaster
    • Просмотр профиля
    • Форум "Минилаб-Мастер"
Дело в том, что основной источник для меня по баскому - книжка Кулиша - СПРАВОЧНИК ПО ПРОГРАММИРОВАНИЮ
BASCOM-8051

Но она далеко неполна, например про memcopy там нет ни слова.  Про таймеры вообще понять не могу, как они работают и программируются, пока не поподались. Так что рад буду любому совету.
Заклинило деталь - надави на нее, если она сломалась - ничего, ее все равно надо было менять.

Andy

  • Администратор Форумa
  • Эксперт
  • *
  • Сообщений: 1803
  • Карма: 15
  • Пол: Мужской
  • Нельзя отремонтировать то, что не сломано...
    • minilabmaster
    • Просмотр профиля
    • Форум "Минилаб-Мастер"
Вот пример моего незнания - нужно запустить процесс и считать и запомнить время после нажатия любой определенной клавиши. Делаю простым циколом со сложением с командой 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



Вообще, в своих програмках стараюсь делать для юзера максимума удобств и интуитивности, так как часто сталкиваюсь с убожеством интерфейса во всяких кассах и околокассовых дивайсах.
« Последнее редактирование: 26 Ноября 2009, 16:42:40 от admin »
Заклинило деталь - надави на нее, если она сломалась - ничего, ее все равно надо было менять.

pumpkin

  • Профи
  • ****
  • Сообщений: 240
  • Карма: 2
  • Пол: Мужской
  • Это Я :-)
    • Просмотр профиля
Я смотрю по этой документации: 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 на эмуляторе что-то не работает, так что полностью не проверено.
« Последнее редактирование: 26 Ноября 2009, 20:46:07 от pumpkin »

pumpkin

  • Профи
  • ****
  • Сообщений: 240
  • Карма: 2
  • Пол: Мужской
  • Это Я :-)
    • Просмотр профиля
C часами и таймерами сам ничего из хелпа не понял.
В BASCOM AVR IDE есть кучка примеров в папке SAMPLES, может там что-то полезное найдешь.

Форум проекта "Минилаб-Мастер"


Andy

  • Администратор Форумa
  • Эксперт
  • *
  • Сообщений: 1803
  • Карма: 15
  • Пол: Мужской
  • Нельзя отремонтировать то, что не сломано...
    • minilabmaster
    • Просмотр профиля
    • Форум "Минилаб-Мастер"
Попробую, но кажется те же яйца только в профиль - когда будет выполнятся команда Wait 1 символ с клавы считыватся НЕ будет. Зато можно использовать waitms, но ее диапазон ограничен 1000 милисекунд, зато можно проверять условие внутри цикла наращивания микросекунд от ноля до 1000.
Заклинило деталь - надави на нее, если она сломалась - ничего, ее все равно надо было менять.

pumpkin

  • Профи
  • ****
  • Сообщений: 240
  • Карма: 2
  • Пол: Мужской
  • Это Я :-)
    • Просмотр профиля
Как на реальном железе - проверить не могу, но в симуляторе нажатая во время Wait клавиша попадает в буфер и там ждет, пока не будет считана командой Inkey. Причем, если успеть нажать несколько клавиш - сохраняется последняя (буфер на один байт всего).

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

PS^ Wait в симуляторе оказывается работает, просто оооооооооооочень медленно, я просто никак дождаться не мог пока "секунда" пройдет  :)
« Последнее редактирование: 27 Ноября 2009, 09:06:12 от pumpkin »

Andy

  • Администратор Форумa
  • Эксперт
  • *
  • Сообщений: 1803
  • Карма: 15
  • Пол: Мужской
  • Нельзя отремонтировать то, что не сломано...
    • minilabmaster
    • Просмотр профиля
    • Форум "Минилаб-Мастер"
Цитировать
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 нужна совсем не понимаю - видимо как счетчик.

А еще загрузчик у меня наконец заработал! Отлично расшифровывает и прошивает!
« Последнее редактирование: 30 Ноября 2009, 02:16:33 от admin »
Заклинило деталь - надави на нее, если она сломалась - ничего, ее все равно надо было менять.

pumpkin

  • Профи
  • ****
  • Сообщений: 240
  • Карма: 2
  • Пол: Мужской
  • Это Я :-)
    • Просмотр профиля
Цитировать
Тонкость - Кажется в памяти длинные переменные наоборот сидят. Но это не имеет значения, когда эту процедуру дераешь дважды - при зашифровке и расшифровке.
Ага. Когда на те же 4 байта в памяти смотришь не как на байты, а как на единый Long, то байты видятся в обратном порядке.

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

Andy

  • Администратор Форумa
  • Эксперт
  • *
  • Сообщений: 1803
  • Карма: 15
  • Пол: Мужской
  • Нельзя отремонтировать то, что не сломано...
    • minilabmaster
    • Просмотр профиля
    • Форум "Минилаб-Мастер"
Цитировать
Это мой косяк. Здесь не J нужна, а некая иная переменная, чтоб J не испортить, например N = Memcopy ...... Просто надо возвращаемое MEMCOPY значение (кол-во скопированных байт) чему-нибудь присваивать.

Ага, так и сделал, хотя внвчале и тупил, почему алгоритм не работает...
Заклинило деталь - надави на нее, если она сломалась - ничего, ее все равно надо было менять.

Форум проекта "Минилаб-Мастер"