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

Обсуждаем контроллеры компании Atmel.
_Vasilij_
Встал на лапы
Сообщения: 124
Зарегистрирован: Пт янв 25, 2013 02:48:32

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

Сообщение _Vasilij_ »

Sergik07 писал(а):
_Vasilij_ писал(а):Вот здесь не смотрели? http://bart-projects.cba.pl/font.html
не, мне не фонты нужны, а библиотека по их математическому увеличению...ибо большой фонт жрет чрезмерно много памяти, нужно чтоб сам микроконтроллер растягивал шрифт, как для nokia 1100.
Реклама
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6312
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

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

Сообщение Jack_A »

Если механически увеличивать размер символа, может получиться некрасивый рисунок. Сравните :
Изображение

PS Программа масштабирования тоже занимает место в памяти. :(
PPS Вы разбирали код МК Нокии 1100 и точно уверенны, что там не набор фонтов, а программное масштабирование ?
Вложения
FA.JPG
(3.98 КБ) 1784 скачивания
Изображение
Реклама
_Vasilij_
Встал на лапы
Сообщения: 124
Зарегистрирован: Пт янв 25, 2013 02:48:32

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

Сообщение _Vasilij_ »

Jack_A писал(а):PS Программа масштабирования тоже занимает место в памяти. :(
PPS Вы разбирали код МК Нокии 1100 и точно уверенны, что там не набор фонтов, а программное масштабирование ?
насчет памяти, допустим символ 48x64 ( в полэкрана) это 3072бит=384 байта на 1 циферь, только от 0 до 9 уже почти 4 килобайта :shock: , уж пусть лучше некрасиво...или память внешнюю цеплять, или камень пожирней, но это как из пушки по воробьям.

Да, тот код смотрел и переделывал под себя - но он открытый, а тут штатный (кракозябры какие-то, шифрованный похоже).
Я уже сделал поточечный вывод (pset ) , но это медленно, а команду чтоб задвигать в дисплей сразу по 8 бит(как в 1100) тут не знаю...это надо даташит изучать, и свою библиотеку писать...лень, поэтому и спрашиваю, мож кто проходил уже этот путь по увеличению.
Аватара пользователя
kip96
Держит паяльник хвостом
Сообщения: 965
Зарегистрирован: Ср авг 26, 2009 08:24:50
Откуда: 1300км от Пупа

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

Сообщение kip96 »

Sergik07 писал(а):
_Vasilij_ писал(а):Есть ли какие-то готовые библиотеки для масштабирования шрифтов или хотя бы просто цифр ?
Вот здесь не смотрели? http://bart-projects.cba.pl/font.html
Интересную программу на сайте увидел, " nosave" . Но не ссылок на неё, не зарегиться не смог. Кто нибудь знает как её раздобыть?
Все делают ошибки, только мудрецы - новые, а дураки - старые.
Реклама
Эиком - электронные компоненты и радиодетали
_Vasilij_
Встал на лапы
Сообщения: 124
Зарегистрирован: Пт янв 25, 2013 02:48:32

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

Сообщение _Vasilij_ »

Всех с наступившим !
Столкнулся с неясностями в шрифтах,пытаюсь создать цветной 12x16, а оно через команду LCDAT на экране ересь выдает. Любое кратное 8 - пожалуйста, все нормально, а другое не выводит...с ч/б таких проблем не было Модуль pcf8833, библиотека стандартная, Вопрос - шрифт для цветных экранов впринципе не может быть некратным 8 ? или библиотеку искать ?

Еще вдогонку, есть ли команда поворота текста ? ну в смысле повернуть дисплей на 90 градусов ?
Реклама
Аватара пользователя
serg_svd
Собутыльник Кота
Сообщения: 2560
Зарегистрирован: Ср янв 16, 2008 08:34:04
Откуда: KMV

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

Сообщение serg_svd »

Играюсь с DS1307 и выводом на символьный жк индикатор и столкнулся с непонятным глюком.
Использую встроенную библиотеку работы с DS1307 ds1307clock.lib.
Но почему-то не работает конфигурация
Config Date = Dmy , Separator = .
Хочу, чтобы дата выводилась в формате DD.MM.YY.
Но после компиляции индикатор упорно показывает в формате MM/DD/YY.
Версия баскома 1.11.9.8. Уж не знаю, может в версии все дело?
переустановил на версию 1.11.9.8 тоже не помогло.
В личку подскажите где версию поновее найти? а то на сайте баскома в хелпе разделители заменили словами. то есть вместо . надо писать DOT. Но это в последней официальной версии

Нашел версию 2.0.7.8.
Но не работает строка Config Date = Dmy , Separator = DOT хоть расшибись. И в чем глюк непонятно.
Полная настройка DS1307 (выкопировка из программы)
Спойлер'configure the scl and sda pins
Config I2cdelay = 5
Config Sda = Portc.4
Config Scl = Portc.5

'address of ds1307
Const Ds1307w = &HD0 ' Addresses of Ds1307 clock
Const Ds1307r = &HD1

Config Clock = User
Config Date = Dmy , Separator = Dot
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Реклама
Sergik07
Родился
Сообщения: 19
Зарегистрирован: Вт сен 10, 2013 18:12:58

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

Сообщение Sergik07 »

serg_svd писал(а): Config Date = Dmy , Separator = .
Возможно эти команды для софтовых часов.

Вот так делал чтение из 1307 в переменные

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

Const Ds1307w = &HD0                                        ' запись
Const Ds1307r = &HD1                                        ' чтение

        I2cstart                                            ' старт
        I2cwbyte Ds1307w                                    
        I2cwbyte &H00                                       ' адрес откуда начинаем читать данные
        I2cstart                                            '  старт
        I2cwbyte Ds1307r                                   
        I2crbyte Seco , Ack                                 ' секунды
        I2crbyte Mine , Ack                                 ' минуты
        I2crbyte Hour , Ack                                 ' часы
        I2crbyte Day , Ack                                  ' день недели
        I2crbyte Dat , Ack                                  ' число месяца
        I2crbyte Month , Ack                                ' месяц
        I2crbyte Year , Nack                                ' год
        I2cstop

        Seco = Makedec(seco)
        Mine = Makedec(mine)
        Hour = Makedec(hour)
        Day = Makedec(day)
        Dat = Makedec(dat)
        Month = Makedec(month)
        Year = Makedec(year)
Аватара пользователя
serg_svd
Собутыльник Кота
Сообщения: 2560
Зарегистрирован: Ср янв 16, 2008 08:34:04
Откуда: KMV

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

Сообщение serg_svd »

Дело в том, что я пользуюсь встроеными функциями баскома, раз они уж там есть.
А там есть приятная штука
Config Clock = User
После применения она автоматически организует переменные _sec, _min, _hour, _day, _month, _year (то есть их не нужно объявлять самому).
И, соответственно, из библиотеки баскома берется код работы с шиной I2C для часов на DS1307
Спойлер'called from ds1307clock.lib
Getdatetime:
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 0 ' start address in 1307

I2cstart ' Generate start code
I2cwbyte Ds1307r ' send address
I2crbyte _sec , Ack
I2crbyte _min , Ack ' MINUTES
I2crbyte _hour , Ack ' Hours
I2crbyte Weekday , Ack ' Day of Week
I2crbyte _day , Ack ' Day of Month
I2crbyte _month , Ack ' Month of Year
I2crbyte _year , Nack ' Year
I2cstop
_sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
_day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return

Setdate:
_day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 4 ' starting address in 1307
I2cwbyte _day ' Send Data to SECONDS
I2cwbyte _month ' MINUTES
I2cwbyte _year ' Hours
I2cstop
Return

Settime:
_sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 0 ' starting address in 1307
I2cwbyte _sec ' Send Data to SECONDS
I2cwbyte _min ' MINUTES
I2cwbyte _hour ' Hours
I2cstop
Return
Тут уже все переменные забиты какими их и формирует Config Clock/

Далее для вывода на жк достаточно воспользоваться стандартными функциями, которые даже нули подставляет самостоятельно и данные выводятся корректно.
Time$ для вывода времени в формате "hh:mm:ss", что меня вполне устраивает. (Пример: Lcd Time$)
Date$ для вывода даты в формате "MM/DD/YY". Так вот это перевернутое отображение даты меня совсем не устраиает. И в справке программы везде в коде реализации часов значится
Config Date = Dmy , Separator = ., или в новой версии программы Config Date = Dmy , Separator = Dot, где мало того, что меняется разделитель, так еще и порядок следования дня, месяца и года. Но почему-то в реальном коде таких изменений нет. Вот это я и пытаюсьь разобраться.

PS, и еще, подскажите!
DS1307 сама выдает количество дней в Феврале в зависимости от того високосный год или нет? Или надо в программе проверять? Ну и опять же, при установке даты это ведь надо проверять или микросхема сама исправит и выставит, к примеру 28 февраля, если при установке день будет выставлен >28? Никак не пойму этого по даташиту
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

Проверять дату февраля не нужно, она сама рассчитывается в зависимости от года. А вот ввести неправильную дату можно легко, никакой проверки при записи нет. То бишь можно выставить 31 февраля, и RTC спокойно это проглотит...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
max50
Мучитель микросхем
Сообщения: 497
Зарегистрирован: Ср дек 10, 2008 21:24:28
Откуда: Алтайский край, Барнаул

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

Сообщение max50 »

Я для DS1307 и DS3231 делаю так:

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

Declare Sub Month_disp                                      'подпрограмма перевода цифровых значений месяца в названия месяца

Dim Daysmonth As Byte                                       'переменная дней в месяце
Dim Month_disp As String * 8                                'переменная месяца, выводимая на дисплей
Dim Weekday_disp As String * 7                              'переменная дня недели, выводимая на дисплей
Dim Weekday_read As Byte                                    'переменная номера дня недели, считываемая из DS1307
Dim Weekday As Byte                                         'переменная номера дня недели

Do                                                          'начало основного цикла

Call Month_disp                                             'вызываем подпрограмму перевода цифровых значений месяца в названия месяца

Locate 1 , 1                                                'задаем позицию курсора
Lcd Time$                                                   'выводим на ЖКИ время, вызывая подпрограмму чтения времени из DS1307
Locate 2 , 1                                                'задаем позицию курсора
Lcd _day ; " " ; Month_disp                                 'выводим на ЖКИ значение переменной _day, пробел, значение переменной Month_disp
If _year < 10 Then                                          'если значение переменной _year < 10 то,
Lcd " 200" ; _year ; "    "                                 'выводим на ЖКИ, пробел, 200, значение переменной _year, 4 пробела
Else                                                        'иначе
Lcd " 20" ; _year ; "    "                                  'выводим на ЖКИ, пробел, 20, значение переменной _year, 4 пробела
End If                                                      'конец если

Weekday_read = Dayofweek()                                  'считываем номер дня недели из DS1307
Weekday_disp = Lookupstr(weekday_read , Weekdays)           'преобразовываем номер дня недели в название дня недели
Locate 1 , 10                                               'задаем позицию курсора
Lcd Weekday_disp                                            'выводим на ЖКИ значение переменной Weekday_disp

Loop                                                        'конец основного цикла

End

Sub Month_disp                                              'подпрограмма перевода цифровых значений месяца в названия месяца
'*******************************************************************************
Select Case _month

Case 1 : Month_disp = "ЗЅіapЗ"                              'января
Daysmonth = 31
Case 2 : Month_disp = "дeіpa»З"                             'февраля
Daysmonth = _year And &H03                                  'проверяем на високосный год
If Daysmonth = 0 Then                                       'если год високосный (переменная Daysmonth = 0)
Daysmonth = 29                                              'то переменная Daysmonth = 29
Else                                                        'иначе
Daysmonth = 28                                              'переменная Daysmonth = 28
End If
Case 3 : Month_disp = "јapїa"                               'марта
Daysmonth = 31
Case 4 : Month_disp = "aѕpe»З"                              'апреля
Daysmonth = 30
Case 5 : Month_disp = "јaЗ"                                 'мая
Daysmonth = 31
Case 6 : Month_disp = "ёЖЅЗ"                                'июня
Daysmonth = 30
Case 7 : Month_disp = "ёЖ»З"                                'июля
Daysmonth = 31
Case 8 : Month_disp = "aіґycїa"                             'августа
Daysmonth = 31
Case 9 : Month_disp = "ceЅїЗІpЗ"                            'сентября
Daysmonth = 30
Case 10 : Month_disp = "oєїЗІpЗ"                            'октября
Daysmonth = 31
Case 11 : Month_disp = "ЅoЗІpЗ"                             'ноября
Daysmonth = 30
Case 12 : Month_disp = "гeєaІpЗ"                            'декабря
Daysmonth = 31

End Select
End Sub

Getdatetime:                                                'подпрограмма чтения данных из DS1307
'*******************************************************************************
  I2cstart                                                  ' I2C START
  I2cwbyte Ds1307w                                          ' константа адрес записи DS1307
  I2cwbyte 0                                                ' начальный адрес в DS1307

  I2cstart                                                  '  I2C START
  I2cwbyte Ds1307r                                          ' константа адрес чтения  DS1307
  I2crbyte _sec , Ack                                       ' чтение значения СЕКУНД
  I2crbyte _min , Ack                                       ' чтение значения МИНУТ
  I2crbyte _hour , Ack                                      ' чтение значения ЧАСА
  I2crbyte Weekday , Ack                                    ' чтение значения НЕДЕЛИ
  I2crbyte _day , Ack                                       ' чтение значения ДНЯ
  I2crbyte _month , Ack                                     ' чтение значения МЕСЯЦА
  I2crbyte _year , Nack                                     ' чтение значения ГОДА
  I2cstop                                                   'I2C STOP
  _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)       'преобразуем все переменные в десятичный вид
  _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)       'преобразуем все переменные в десятичный вид
Return                                                      'возврат из подпрогрммы

Setdate:                                                    'подпрограмма записи даты в DS1307
'*******************************************************************************
  _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)       'преобразуем все переменные в двоичный вид
  I2cstart                                                  ' I2C START
  I2cwbyte Ds1307w                                          ' константа адрес записи DS1307
  I2cwbyte 4                                                ' начальный адрес в DS1307
  I2cwbyte _day                                             ' запись ДЕНЬ
  I2cwbyte _month                                           ' запись МЕСЯЦ
  I2cwbyte _year                                            ' запись ГОД
  I2cstop                                                   'I2C STOP
Return                                                      'возврат из подпрогрммы

Settime:                                                    'подпрограмма записи времени в DS1307
'*******************************************************************************
  _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)       'преобразуем все переменные в двоичный вид
  I2cstart                                                  ' I2C START
  I2cwbyte Ds1307w                                          ' константа адрес записи DS1307
  I2cwbyte 0                                                ' начальный адрес в DS1307
  I2cwbyte _sec                                             ' запись СЕКУНД
  I2cwbyte _min                                             ' запись МИНУТ
  I2cwbyte _hour                                            ' запись ЧАСА
  I2cstop                                                   'I2C STOP
Return                                                      'возврат из подпрогрммы

Weekdays:
'*******************************************************************************
Data "ЁoЅeг. "                                              'Понед.
Data "BїopЅёє"                                              'Вторник
Data "Cpeгa  "                                              'Среда
Data "«eїіepґ"                                              'Четверг
Data "ЁЗїЅёеa"                                              'Пятница
Data "CyІІoїa"                                              'Суббота
Data "Bocєp. "                                              'Воскр.
То есть не использую ds1307clock.lib.
Того, кто не задумывается о далеких трудностях, ожидают близкие неприятности.
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

max50 писал(а):То есть не использую ds1307clock.lib.
А ее и так подключать в коде не нужно, тогда конфигурация строковой переменной $Date

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

Config Date = Dmy , Separator = .
работает как положено. Это именно у той сторонней библиотеки своя конфигурация. Вообще ради интереса можете поглядеть, что та библиотека содержит, и для чего ее вообще можно подключать. :tea:
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
serg_svd
Собутыльник Кота
Сообщения: 2560
Зарегистрирован: Ср янв 16, 2008 08:34:04
Откуда: KMV

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

Сообщение serg_svd »

max50 писал(а): То есть не использую ds1307clock.lib.
Да вот именно в ней и все дело. :kill:
Спасибо Михаил подсказал. Убрал эту библиотеку и все заработало.

Вычистил код, пока часики устанавливаются нормально и тикают. Проверку на високосный год тоже сделал при установке даты. Пример определения високосного года нашел там же в справке баскома. Заодно и ограничиваю день по месяцам (30 или 31).

Осталась предпоследняя запара. Нужно реализовать несколько мигающих знакомест на индикаторе HD44780. Пока думаю как это сделать.
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Аватара пользователя
max50
Мучитель микросхем
Сообщения: 497
Зарегистрирован: Ср дек 10, 2008 21:24:28
Откуда: Алтайский край, Барнаул

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

Сообщение max50 »

serg_svd писал(а):Проверку на високосный год тоже сделал при установке даты. Пример определения високосного года нашел там же в справке баскома. Заодно и ограничиваю день по месяцам (30 или 31).
В моем коде так и сделано. Только в начале устанавливаю год, потом месяц и затем день.
Того, кто не задумывается о далеких трудностях, ожидают близкие неприятности.
Аватара пользователя
serg_svd
Собутыльник Кота
Сообщения: 2560
Зарегистрирован: Ср янв 16, 2008 08:34:04
Откуда: KMV

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

Сообщение serg_svd »

max50 писал(а):Только в начале устанавливаю год, потом месяц и затем день.
Аналогично сделал :).
Правда после любых других часов немного непривычна такая установка даты. Но ничего страшного нет. Один раз установить и все
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Аватара пользователя
Адвансед
Встал на лапы
Сообщения: 98
Зарегистрирован: Вс мар 11, 2012 23:06:08
Откуда: Казань

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

Сообщение Адвансед »

Здравствйте, помогите пожалуйста кодом, который считает нажатие кнопок и выводит знаяения на жк дисплей (1602)
мне не понятен сам алгоритм подсчета количества нажатий,
--

нужно просто читать нажатия кнопки, нажал 5 раз, на дисплее цифра 5, нажал 30 - на дисплее 30, и так далее...
Аватара пользователя
vem566
Друг Кота
Сообщения: 4733
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

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

Сообщение vem566 »

Что то совсем плохо.
Кнопку на прерывание, переменная которую увеличивают на 1 в каждом прерывании, вывод на экран.
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

Либо Debounce в основном цикле, в обработчике кнопки так же увеличиваем переменную и выводим на дисплей... Это как вариант, чтобы начинающему с прерываниями не возиться. Хоть свои попытки в виде кода покажите, а то так дело не пойдет. Напишут готовый вариант Вам запросто, и не один, только это ли Вам нужно... :tea:
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
6П3С
Встал на лапы
Сообщения: 140
Зарегистрирован: Чт окт 08, 2009 20:13:30
Откуда: Самарская обл.
Контактная информация:

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

Сообщение 6П3С »

Приветствую коты )) Вот и мне пришлось заняться мк, блин как их не обходил стороной всё одно - оказалось надо. вопрос вот в чём - пытаюсь подключить к меге8, 7-и сегм. индикатор через регистр сдвига, в целях экономии ног, так как схема планируется большая. Пока балуюсь-просто чтобы считал от 0-до 9, подскажите где ошибка в коде? в пристёгнутые ссылки - баском код и схемка протеус 8.
https://yadi.sk/d/D3MnizkVnVADe
https://yadi.sk/i/cQrJh7hBnVAYh
Спасибо заранее.
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

Здравствуйте.

Протеуса 8 нету, а по коду:

1. Забираете код цифры в переменную Vreg, а отправляете в регистр все равно Led (который равен 0).
2. Переменная Led нигде не инкрементируется, оставаясь всегда 0.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
6П3С
Встал на лапы
Сообщения: 140
Зарегистрирован: Чт окт 08, 2009 20:13:30
Откуда: Самарская обл.
Контактная информация:

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

Сообщение 6П3С »

ага, с 1. я заметил сам, уже после того как сообщение первое написал, а по 2. я понимаю надо дописать Incr Led перед началом цикла. правильно?
Ответить

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