Перейти к содержанию
    

hc2hunter

Участник
  • Постов

    19
  • Зарегистрирован

  • Посещение

Весь контент hc2hunter


  1. ух ты...! просто супер! :) Теперь, надеюсь, разберусь в чем там дело :)
  2. пасиба... ушел читать... :)
  3. Сенсорный дисплей

    Вы уж извините, что пишу в раздел AVR... даже не знаю, куда мою тему правильнее прилепить. Но поскольку разрабатываю устройство на базе AVR Mega8, то решил отпостить сюда. Суть в следующем. Вобщем, раздобыл я тут дисплей LCD цветной от поломанного видеофона, обучил Megу8 выводить на него картинки и пиктограммы. Еще как оказалось, дисплей является сенсорным. Умел когда-то назад устройству возвращать координаты Х и Y, куда в него торнули пальцем... Экран оказался банально простым - резистивным. К нему идут 4 дорожки. Сама конструкция экрана (после вскрытия) оказалась такой: Озадачился приделкой этого тачскрина к контроллеру Mega8 (чтобы самому определять координаты, куда тыркнули), но вот столкнулся с проблемой... что куда подавать на этот тачскрин? Само-собой, снимаю сигналы через АЦП, пытаясь подавать на разные выводы дисплея опорное напряжение +5В. Но ничего путного не получается... Прозвонил дисплей, и получил следующую картину - примерная эквивалентная схема его выглядит так: При этом переменные сопротивления (сам экран) изменяют свое сопротивление примерно в пределах 600...1500 Ом как по-горизонтали, так и по-вертикали. То есть получается у него Х и Y связаны гальванически., и в итоге координаты меняются "вместе" и не прослеживается однозначного закона изменения х и у. Так что же куда надо подать, чтобы снять с него координаты? Что тут можно эдакого толкового придумать?
  4. э... туплю кажись... м-де... :smile3046:
  5. Собственно вот... :07: Прошерстил местные магазины в нашей деревне - ничерта нету. На заказ везут невесть сколько (около месяца). Заказывать через интернет микросхему ценой 160р. дороговато обходится, причем почти все конторы отказываются выполнять заказ на сумму менее 500р... Поэтому решил кинуть объявку тут... на "ура". А вдруг найдется кто-то из земляков, да еще у кого есть лишний корпус Mega32...! Был бы очень признателен :beer:
  6. Да, я встречал подобную запись, когда разбирал чей-то код. Однако работаю в CVAVR, а там такое не прокатывает... не знает он что такое WGM и OCIE2... :(
  7. А это для чего? что оно мне даст? куда же я тогда возвращаться-то буду... в "никуда" получается... Вот это мне тоже, кстати, не совсем понятно... Звучит как заученная фраза из книжек. А если мне нужно по возникновении прерывания выполнить массу всего? Что мне тогда делать...? Ведь мне никто не запрещает в прерывании остановить таймер, выполнить все что мне нужно, а по выходу из прерывания снова его запустить? С моей (ламерской) точки зрения процедура-обработчик может быть сколь угодно долгой. Главное, чтобы в это время я не наловил новых прерываний...
  8. Да, конечно. В самой процедуре прерывания я тоже поправляю счетчик таймера. В любом случае, огромное спасибо за наводку на мою ошибку! Пойду, попробую "прикрутить" полученное под свою конкретную задачу...
  9. Вобщем, сделал как сам же написал выше TCCR0=0x05; TCNT0=0xFF; вроде бы все заработало... щас буду думать дальше...
  10. а как же мне тогда правильно таймер проинициализировать? Получается TCCR0=0x05; TCNT0=0xFF; так?
  11. Работаю от кварца, это совершенно точно. Я такую простенькую программку написал уже от безысходности, чтобы выяснить где же я дурак... Раньше с таймерами не работал, факт. А почему Вы пишете 8e6/1024/256 - 30 Гц ? отуда 256? Мастер мне пишет, что частота настроенная составляет 15625 Гц.
  12. AVR Mega8, 16МГц, среда разработки CVAVR v1.25. Делаю все по шаблону, как предлагает мастер. Пытаюсь создать прерывание по таймеру №0 каждые 64 мкс (15625 Гц). Вот текст программы: Результат смотрю на осциллографе - хрен два! Постоянная единица, ничего не прерывается. Пробовал и так и эдак... И что я только не писал в обработчик прерывания - ничего не помогает. И запрещать прерывания там пробовал, и заново таймер реинициализировал... Разве что проскакивает этот самый ожидаемый "0" каждые примерно 5 секунд (определяю по взмаргиванию линии на осциллографе). И что это за бред...? :cranky: Где моя ошибка?
  13. В принципе, можно его считать практически нулевым. Все зависит от того, откуда выбирать данные. Я выбирал с FLASH - скорость выборки довольно большая. Если на полностью белый фон выводить черные квадратики 8*12 (по размеру символа), то между ними видны еле-заметные белые полосочки. А если выбирать из SRAM, то все заполняется очень плотно. Тогда влазит по-горизонтали даже до 47-48 символов. Без пробелов. Но нужен контроллер с большим объемом памяти.... Причем, выбирать нужно тоже не из самих массивов, а однозначно напрямую - через указатели.
  14. idono, ...от себя хотел добавить - обратите внимание на уровень оптимизации кода вашим компилятором (на какой уровень он выставлен). От этого будет сильно зависеть скорость работы таких конструкций как i=10; while(i--) { #asm("nop"); } или последовательный вывод строчек символов (где у вас подряд идут штук 20 одинаковых операторов). А вывод делать нужно действительно через SPI ! Это самый быстрый метод. Пропускная способность порта для наших задач - фактически 8000000 точек в секунду. Я сейчас озадачен той же самой проблемой, что и вы, с той лишь разницей, что я полностью формирую изображение на экране TV, а не накладываю текст. На данный момент я добился вывода ч/б текстового поля размером 43х27 символов. Размер символа 8х12 точек. Это же эквивалентно выводу ч/б картинки размером 340х312 пикселей. Делаю все на AVR Mega8, но собираюсь переползать на Mega32, т.к. у "восьмерки" (впрочем как и у мега16) катастрофически не хватает памяти, а все видеообразы и таблицы символов целесообразно хранить во FLASH...
  15. Конкретно интересует написание в CVAVR. Как указать, куда возвращаться из функции-обработчика прерывания?
  16. Сорри за дурацкий вопрос... А как из обработчика прерывания вернуться в нужную точку, а не в точку, где случилось прерывание...? :laughing:
  17. Спасибо за дельные советы! ...буду думать дальше
  18. Помогите пожалуйста...

    К сожалению, я не очень силен в программировании, и видимо работа с указателями мне не до конца понятна... Ситуация заключается в следующем. Контроллер AVR Mega8, среда разработки CVAVR. Имею 2 больших массива, размещенных во FLASH const char symbol[3072]={...,...,... ... ... } //закодированные символы, 256 штук размером 8х12 const char str_array[44*27] = {...,...,... ... ... } //символьная строка для вывода в порт ... //определяю 2 указателя для работы с этими массивами (чтобы работать с ними с максимальной скоростью) const char * _ptr; const char * _ptr1; ... //далее в коде пишу _ptr = &str_array[ххх]; //установить указатель в позицию ххх одного массива _ptr1 = &symbol[ууу]; //установить указатель в позицию ууу второго массива SPDR = *_ptr1 + (*_ptr*12); //здесь идет обращение к большому массиву через маленький, чтобы выбрать нужный байт В итоге в порт выводится не то что нужно. Левак. Чувствую, что работа с указателями у меня неверная в последней строчке написана ерунда. То есть в SPRD выводится совершенно не тот байт, что мне нужен. Или может где-то можно по-русски почитать про указатели применительно к CVAVR ? Совершенно аналогичное решение вопроса в WinAVR записано так: SPDR = PRG_RDB(_ptr1 + (* _ptr++)*12); На сколько я понимаю, эта функция позволяет считать байт по адресу в памяти, указанному суммой указателей. А как это же правильно записать в CVAVR ? :05: --------------------------- Сам задал вопрос, сам видимо и отвечаю... :yeah: Вот такая должна быть запись в CVAVR: SPDR = *(_ptr1 + (* _ptr++)*12); Непосредственно результат по указателю возвращается так: *(указатель) . соответственно, моя ошибка была в том, что я неверно взял в скобки разные части выражения. Никто ничего не добавит к моим умозаключениям...? :05:
×
×
  • Создать...