BASCOM AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
Мучитель микросхем
Аватара пользователя
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Сообщение shonty »

vem566 писал(а):Минимальный делитель = 4
а SPI2X в SPSR ?
Тогда 10мгц будет

Добавлено after 1 minute 28 seconds:
Данные напрямую через регистры в SPDR отправляйте. Возможно библиотеки ОЗУ используют, от этого медленно.

Добавлено after 16 minutes 53 seconds:
shonty писал(а):    out SPDR, color_back_H
      in TEMP,SPSR         ; ожидание конца передачи
      sbrs TEMP,SPIF
      rjmp PC-2
   out SPDR,color_back_L
      in TEMP,SPSR         ; ожидание конца передачи
      sbrs TEMP,SPIF
      rjmp PC-2
Дошли руки ещё немного ускорить :roll:

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

   out SPDR, color_back_H
		lpm  				; ожидание конца передачи
		lpm
		lpm
		lpm
		lpm
		rjmp pc+1
		in TEMP,SPSR		; считывание SPSR для очистки SPIF
   out SPDR,color_back_L
      in TEMP,SPSR         ; ожидание конца передачи
      sbrs TEMP,SPIF
      rjmp PC-2
Первое ожидание конца передачи лучше так переписать. А вот второе.. лучше пока оставить, тем более если в цикл оформлять, то там немного по другому нужно сделать.

Добавлено after 41 minute 24 seconds:
PS: последний код будет работать только при установленном бите SPI2X в SPSR. То есть скорость SPI=Fosc/2
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4741
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

Сообщение vem566 »

Да... Китайцы намудрили с дисплеем. Этому ушлёпку нужно обязательно 3 байта на цвет. Не понимает он 5+6+5. Или 6+6+6 или 8+8+8. Козёл! :kill:
Конструкции на ассемблере работают заметно быстрее. Получается заливка экрана чуть меньше 1 сек при полноцветном режиме. Буду пихать в SPI не стандартные комманды баскома типа SpiOut, а напихаю ассемблерных вставок.
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Сообщение shonty »

Нормальный дисплей.. один раз разобраться..
У меня первый тфт 128*160 3 секунды грузился, потом я разгоном увлёкся))

При первой загрузке можно ещё такой фокус использовать: подавать сигнал на вывод LED дисплея когда экран уже залит и информация выведена, ну или лого..
Тогда создаётся иллюзия моментального включения.
:beer:
Друг Кота
Аватара пользователя
Сообщения: 4741
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

Сообщение vem566 »

Да оно и так уже нормально. Ассемблер помогает. Пришлось все же букварь по нему открывать. Выяснять какие регистры чем заняты по умолчанию. Плюнул в конце концов. Программно можно всяко исхитриться.
А не нашел - где лежат переменные, переданные в процедуру. В примерах ссылок на них нет. Просто переменная в заголовке, как параметр и все. Обошелся и без них, но просто интересно. :beer:
Реклама
Эиком - электронные компоненты и радиодетали
Мудрый кот
Сообщения: 1709
Зарегистрирован: Вт янв 05, 2016 10:14:25
Откуда: поселок Мелеуз

Сообщение Novice user »

Я делал так очистку экрана для 9341,может поможет-

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

Sub Lcd_clear(byval Color As Word)
   Lcd_set_window 0 , 0 , X_size , Y_size
   Lcd_cs = 0
   Lcd_dc = 1
   !LD     XL,     Y+0
   !LD     XH,     Y+1
   !LD     R31,    X+
   !LD     R30,    X
      !ldi  R16, $c8          '76800   200
   Wgloop0:
      !ldi  R17, $C0          '192
   Wloop1:
      !OUT    spdr, R30
   Spi_ready1:
      !sbis spsr, spif
      !rjmp spi_ready1
      !OUT    spdr, R31
   Spi_ready:
      !sbis spsr, spif
      !rjmp spi_ready
      !OUT    spdr, R30
   Spi_ready2:
      !sbis spsr, spif
      !rjmp spi_ready2
      !OUT    spdr, R31
   Spi_ready3:
      !sbis spsr, spif
      !rjmp spi_ready3
      !subi R17, 1
      !brne wloop1
      !subi R16, 1
      !brne wgloop0
     'Lcd_cs = 1
End Sub
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4741
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

Сообщение vem566 »

Novice user, спасибо. Во время работы чистить экран надобности нет, а при включении он заливается цветом в режиме 8 цветов. Меньше секунды. Быстрее все равно не будет.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4741
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

Сообщение vem566 »

Ну чо, коты. Опять я с вопросами. Китайцы задолбали конкретно. Приехал очередной дисплей. ОЛЕД. 128 х 64. Фамилия на обороте GME64128-02. Описания в сети крайне скудное и маловразумительное. На каком контроллере не понятно. То ли SSD1306, то ли SH110 так и не понял. Адрес I2C определяется как 3С, но с не меньшим успехом работает и с 78. Правда тут может быть причастен аппаратный I2C. Инициализация по "родному" букварю не проходит. Зато проходит от SSD1306. Картинку разворачивает строго по вертикали. Никакими ухищрениями положить картинку на бок, что бы 128 было по горизонтали, не получается. Кроме того, работает только половина экрана. То есть из 64 оображаются 32. При этом при выводе текста происходит смещение за границу экрана примерно на 28 пикселей. То есть чтобы получить начало текста(фонт 6х8) к нему надо прикрутить в начало 3-4 пробела. Всякие примеры ничего не меняют. Хоть с библиотекой glcd1306-i2c, хоть без нее. В последней версии этой библиотеки она вроде как может работать с обоими чипами, но волевое решение переключения на SH110 работать не хочет вовсе. Только с SSD1306. Впечатление, что или битый пришел, или китайцы перемудрили. Кто сталкивался с таким чудом?
Друг Кота
Аватара пользователя
Сообщения: 4741
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

Сообщение vem566 »

Разобрался я с этич "чудом". Чип в нем SH1107, который изначально заточен под 128х128. Получается вообще хрен поймешь что. Мутота конкретная, короче. Будет попадаться такой - не советую. Что бы получить линию длиной 64 пикселя, нужно отправить 128. То ли съедает половину, то ли "черезстрочная развертка". Поворот на 90 градусов отсутствуе по причине не ведомой. Только на 180. Хотя в приличных дисплеях крутится с шагом 90. Прямой адресации пикселей нет. Почему он "графический"! Похоже один вариант приемлемой работы - через буфер всего экрана. Не нашел автоматического перехода на следующую строку при достижении конца текущей. Куда то в прорву уходят байты. Явная адресация строки. Иначе никак. И при строке 64 пикселя нужно отправлять 128, иначе половина. В то же время, если фонт 8х8, то для прорисовки символа хватает 8. Не нужно повторять. Может, конечно, у меня ума не хватает, но это далеко не первый дисплей у меня в руках.
Родился
Сообщения: 3
Зарегистрирован: Чт ноя 14, 2024 00:51:11

Сообщение michael_1976 »

vem566, приветствую!
Тоже угораздило купить это чудо. Удалось вам повернуть экран на 90 градусов? там где покупал, есть отзывы с фото где текст повернут и идет вдоль длинной стороны экрана.

Решено:
Библиотека #include <U8g2lib.h>
Пример FlipMode
U8G2_SH1107_64X128_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

А если использовать конструктор вот так, то можно сразу повернуть экран и дале выводить как на экран 128х64
U8G2_SH1107_64X128_1_HW_I2C Display(U8G2_R1, /* reset=*/ U8X8_PIN_NONE);
Друг Кота
Аватара пользователя
Сообщения: 4741
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

Сообщение vem566 »

michael_1976, повернул. Все работает как нужно. У этого дисплея есть текстовый режим, при котором на символ нужно 2 байта - для китайских иероглифов. Отсюда все непонятки.
Разработка на баскоме, но у него есть аналог U8g2lib.h. Хотя работает и без неё.
Родился
Сообщения: 3
Зарегистрирован: Чт ноя 14, 2024 00:51:11

Сообщение michael_1976 »

А что значит текстовый режим? Как его использовать?
Друг Кота
Аватара пользователя
Сообщения: 4741
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

Сообщение vem566 »

Ну это не совсем встроенный текстовый режим со встроенным знакогенератором. При передаче байта по конкретному адресу для автоматического перехода на следующий адрес нужно два байта послать. Или явно сменить адрес. У китайцев для одного иероглифа на знакоместо нужно 2 байта. Поэтому и родилась аналогия с текстовым режимом.
Встал на лапы
Аватара пользователя
Сообщения: 113
Зарегистрирован: Вс май 12, 2024 12:41:38
Откуда: Подмосковье

Сообщение Александр Д. »

[uquote="vem566",url="/forum/viewtopic.php?p=4718067#p4718067"]У этого дисплея есть текстовый режим, при котором на символ нужно 2 байта - для китайских иероглифов. Отсюда все непонятки.[/uquote]
О! Прямо как в ST7920
тоже долго мучился, пока научился с ним работать.
Но в общем и целом нравится: 2 провода всего надо и на больших длинах проводов не капризничает.
Верните прошлое! там было такое прекрасное будущее...
Открыл глаза
Сообщения: 60
Зарегистрирован: Сб янв 10, 2015 12:05:52

Сообщение sathv »

Добрый вечер. Только знакомлюсь с BASCOM-AVR, все было понятно пока не дошел до ADC. Не работает согласно командам из Help. Есть пример для АTtiny13, но он не интересен. Делаю в Proteus модель для Atmega8. После команды Getadc переменная принимает значения 20, 40,..,200 в диапазоне от 0 до 0,5В измеряемого напряжения. При напряжении больше 0,5В показания остаются равными 200. Подозреваю, что два байта, выдаваемые ADC не правильно пересчитываются. Но отсутствие знаний не позволяет разобраться. BASCOM у меня 2.0.8.6. Помогите, пожалуйста, устранить мою ошибку.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2052
Зарегистрирован: Вт ноя 03, 2009 21:02:38
Откуда: Москва

Сообщение Microtech »

Как настроено опорное напряжение? Переменная объявлена как word?
Контактная информация:
Открыл глаза
Сообщения: 60
Зарегистрирован: Сб янв 10, 2015 12:05:52

Сообщение sathv »

Это, правда, как-то связано с опорным напряжением. ADC не работал с внутренним и Vcc. Вернее, я не умею программно устанавливать внутреннее опорное напряжение. А после выбора опорным напряжением Aref измерения получаются. Этого мне достаточно. Спасибо за совет.
Открыл глаза
Сообщения: 60
Зарегистрирован: Сб янв 10, 2015 12:05:52

Сообщение sathv »

Добрый день. Неудобно спрашивать ерунду, наверное это всем известно. Подскажите, пожалуйста, как преобразовать строковую переменную "123" в число123 в BASCOM? С командой INT не получается. Спасибо.
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 25
Зарегистрирован: Чт авг 27, 2020 13:15:49

Сообщение dibor »

Val()

Dim A As Byte , S As String * 10

S = "123"

A = Val(s) 'convert string

Print A ' 123
Открыл глаза
Сообщения: 60
Зарегистрирован: Сб янв 10, 2015 12:05:52

Сообщение sathv »

Спасибо ! Знакомлюсь с BASCOM в основном по HELP'у. Прочитать то могу, а вот найти что требуется- никак. Премного благодарен.
Встал на лапы
Аватара пользователя
Сообщения: 113
Зарегистрирован: Вс май 12, 2024 12:41:38
Откуда: Подмосковье

Сообщение Александр Д. »

а скачать учебники и примеры? их много ))
Верните прошлое! там было такое прекрасное будущее...
Ответить

Вернуться в «AVR»