Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



BASCOM 8051

Сообщений 31 страница 44 из 44

31

Не могу в компиляторе создать переменные суммарно больше 30 байт - компилятор выдаёт ошибку нехватки памяти.
Переменные в IRAM. Попробовал перенести некоторые в XRAM (она есть в МК - 1024 байта) - объём кода программы резко растёт, почти на треть!

До этого с i51 не работал.

Но в описании к МК указано:
SRAM
• 128 bytes internal direct access RAM (DATA, use keyword data to declare in C language program)
• 128 bytes internal indirect access RAM (IDATA, use keyword idata to declare in C language program)
• 1024 bytes internal extended RAM (internal XDATA, use keyword xdata to declare in C language program)

ps
Это указано в ограничениях компилятора (((
Понять бы причину ((

A maximum of 32 bytes is used internally. This depends on the used statements.

ps
проблемы нет: это ограничение компилятора, попытка сделать универсальный компилятор под все типы 8051
Автор обещал как-нибудь посмотреть

pps
Проблема решена: В меню компилятора 2.0.16.0 есть соответствующая настройка

https://forumupload.ru/uploads/0000/25/b8/439/t21837.jpg

Отредактировано Александр Д. (2024-04-30 09:53:53)

0

32

ну что....
Вечером соседи праздновали (мать их ети!), уснуть и спать мне ближайшие пару часов явно не светит да и подремал я днём пару часов (благодать!)
И сел я за STC8H1K08
после всех рассусоливаний в голове вначале я хотел проверить работу с типовыми железками типа LCD1602 и протоколами i2c, 1Wire и eeprom
Но потом попался на глаза мой любимый дисплей ST7920!
И после мелких правок оно заработало!

маш.код, по сравнению с версией для AVR, даже меньше!
Скорость такая, что пришлось раза в 2 замедлять, иначе медленный дисплей на длинных проводах не очень хотел работать!!
В коде указал что тактовая 11мгц, а сам МК настроил на 6 мгц - только тогда заработало без мусора на дисплее.

Оценить скорость не могу: моментально!
Потом как-нибудь соберу две платы рядом: на AVR и на STC и сравню на замедленной скорости воспроизведения :)

https://forumupload.ru/uploads/0000/25/b8/439/t438274.jpg

bascom 8051 2.0.16.0

Код:


$regfile = "STC_8H.DAT"       ' STC registers list
$crystal = 11059200           ' CPU clock frequence
$ramsize = &H400              ' 1024

$large


Dim Temp As Byte , Temp2 As Byte
Dim Temp_w As Word

Dim Font_bold As Byte , Invers_font As Byte
Dim Lcd_m As Byte , Lcd_lf As Byte , Lcd_rt As Byte , Glcd_data As Byte , Lcd_cnt As Byte
Dim Lcdstr$ As String * 16
Dim Simvol_1$ As String * 1 , Simvol_2$ As String * 1
Dim Lcd_w1 As Word , Lcd_w2 As Word
Dim Lcdx As Byte , Lcdy As Byte , X_lcd As Byte , Y_lcd As Byte , Lcd_temp As Byte



'Графический ЖКИ 128*64 с контроллером ST7920
'Подключено последовательной шиной, вывод 15 (Psb) подключить на минус. Вывод 4  на +5в

Sid_glcd Alias P3.5           ' 16 : Config Sid_glcd = Output       ' data
Sclk_glcd Alias P3.4          ' 15 : Config Sclk_glcd = Output       ' clock

P3ie = &B11001111             ' 1: Enable digital signal input
P3m1 = 0 : P3m0 = &B00110000  ' Push-pull output mode
P3pu = &B00000000             ' 1: pull-up resistor


' ---  Инициализация ST7920
Sclk_glcd = 0 : Sid_glcd = 0
Waitms 100                  ' обязательно
Glcd_data = &B00110100 : Gosub Lcdcommand       ' EXTENDEN instruction
Glcd_data = &B00110000 : Gosub Lcdcommand       ' GRAGIC display Off
Glcd_data = &B00000110 : Gosub Lcdcommand       ' Entry Mode Set
Glcd_data = &B00001100 : Gosub Lcdcommand       ' Выкл Курсор и мигание символа
Glcd_data = &B00000001 : Gosub Lcdcommand       ' Clear Text Display
Waitms 3
Glcd_data = &B00110100 : Gosub Lcdcommand       ' EXTENDEN instruction
Glcd_data = &B00110110 : Gosub Lcdcommand       ' GRAGIC display On

' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Gosub Lcdimgcls               ' очистка графической памяти ЖКИ
Lcdstr$ = "ПРИВЕТИК ВСЕМ!" : Y_lcd = 0 : X_lcd = 0 : Gosub Print_lcd
Lcdstr$ = "ПРОВЕРКА ST-7920" : Y_lcd = 2 : X_lcd = 0 : Font_bold = 1 : Gosub Print_lcd
Lcdstr$ = "MCU: STC8H1K08" : Y_lcd = 4 : X_lcd = 0 : Font_bold = 1 : Gosub Print_lcd
Lcdstr$ = "НУ ОЧЕНЬ БЫСТРО!" : Y_lcd = 5 : X_lcd = 0 : Gosub Print_lcd
Lcdstr$ = "29-04-2024 23:45" : Y_lcd = 6 : X_lcd = 0 : Invers_font = 1 : Gosub Print_lcd
Lcdstr$ = "РОССИЯ, С.ПОСАД" : Y_lcd = 7 : X_lcd = 0 : Gosub Print_lcd

End

'=========================================================
Lcdcommand:                   ' Записать команду -----------------------
  Temp = &B11111000
  Shiftout Sid_glcd , Sclk_glcd , Temp , 1       ' Команда RW=0 RS=0

  Temp = Glcd_data
  Temp = Temp And &B11110000  ' Сбросим 4 бита LSB
  Shiftout Sid_glcd , Sclk_glcd , Temp , 1       ' передаём

  Temp = Glcd_data
  Shift Temp , Left , 4 : Temp = Temp And &B11110000       ' Сбросим 4 бита LSB
  Shiftout Sid_glcd , Sclk_glcd , Temp , 1       ' передаём
Return

'========================================================
Lcdwrite:                     ' Записать данные -----------------------
  Temp = &B11111010 : Shiftout Sid_glcd , Sclk_glcd , Temp , 1       ' данные RW=0 RS=1

  Temp = Glcd_data
  Temp = Temp And &B11110000  ' Сбросим 4 бита LSB
  Shiftout Sid_glcd , Sclk_glcd , Temp , 1       ' передаём

  Shift Glcd_data , Left , 4
  Temp = Glcd_data : Temp = Temp And &B11110000       ' Сбросим 4 бита LSB
  Shiftout Sid_glcd , Sclk_glcd , Temp , 1       ' передаём младшие 4 бита LSB
Return


'======================================================================
Print_lcd:                    ' по вертикали 0-7 симв., по гориз.- 0-7 блоков
   ' Преобразуем номера позиции в физический адрес памяти ЖКИ

  If Y_lcd > 3 Then           ' нижняя половина ЖКИ
    X_lcd = X_lcd + 8
    Y_lcd = Y_lcd - 4
  End If
  Lcdx = X_lcd + 128

  Y_lcd = Y_lcd * 8 : Y_lcd = Y_lcd + 128

  Temp2 = Len(lcdstr$)
  For Lcd_cnt = 1 To Temp2
    Simvol_1$ = Mid(lcdstr$ , Lcd_cnt , 1) : Lcd_m = Asc(simvol_1$) -32       ' До "пробела" нет символов
    If Lcd_m > 159 Then Lcd_m = Lcd_m - 101       ' Убрали из таблицы маленькие английские и русские

    Lcd_w1 = Lcd_m * 8        ' Адрес левого символа

    Incr Lcd_cnt
    Simvol_2$ = Mid(lcdstr$ , Lcd_cnt , 1) : Lcd_m = Asc(simvol_2$) -32
    If Lcd_m > 159 Then Lcd_m = Lcd_m - 101       ' Убрали из таблицы маленькие английские и русские
    Lcd_w2 = Lcd_m * 8        ' Адрес правого символа

    Lcdy = Y_lcd
    For Lcd_temp = 0 To 7     '  8 по вертикали
      Lcd_lf = Lookup(lcd_w1 , Shrift_8x8)
      If Font_bold = 1 Then   ' делаем символы жирными - копируем точку правее
        Lcd_m = Lcd_lf : Shift Lcd_m , Right , 1
        Lcd_lf = Lcd_lf Or Lcd_m
      End If
      If Invers_font = 1 Then Lcd_lf = 255 - Lcd_lf       ' Инверсия символа и фона

      Lcd_rt = Lookup(lcd_w2 , Shrift_8x8)
      If Font_bold = 1 Then   ' делаем символы жирными - копируем точку правее
        Lcd_m = Lcd_rt : Shift Lcd_m , Right , 1
        Lcd_rt = Lcd_rt Or Lcd_m
      End If
      If Invers_font = 1 Then Lcd_rt = 255 - Lcd_rt       ' Инверсия символа и фона

      ' левая половина блока - Lf, правая половина блока = Rt
      Glcd_data = Lcdy : Gosub Lcdcommand
      Glcd_data = Lcdx : Gosub Lcdcommand       '   X=16      16 точек по горизонтали

      Glcd_data = Lcd_lf : Gosub Lcdwrite

      If Simvol_2$ <> "" Then
        Glcd_data = Lcd_rt
        Gosub Lcdwrite
      End If

      Incr Lcdy
      Incr Lcd_w1 : Incr Lcd_w2
    Next
    Incr Lcdx

  Next
  Font_bold = 0
  Invers_font = 0
Return


'=========================================================
Lcdimgcls:                    ' --  Очистка графической памяти ST7920  --
  Lcd_m = 0
  For Lcdx = &H80 To &H8F
    For Lcdy = &H80 To &H9F
      Glcd_data = Lcdy : Gosub Lcdcommand
      Glcd_data = Lcdx : Gosub Lcdcommand
      Glcd_data = 0 : Gosub Lcdwrite
      Glcd_data = Lcd_m : Gosub Lcdwrite
    Next
  Next
Return

'=========================================================
$include "font-8x8_big_eng_rus.inc"

Отредактировано Александр Д. (2024-04-30 00:05:06)

0

33

Прерывания INT0 и INT1 работают, режимы "по фронту, по фронту и спаду" - работают.

Код:
$regfile = "STC_8H.DAT"                   ' STC registers list
$crystal = 11059200                       ' CPU clock frequence
$ramsize = &H400                          ' 1024
$romstart = &H0                           ' code starting address

$large

Dim Temp As Byte

P1ie = &B_0000_0100                       ' 1: Enable digital signal input
P1m1 = &B_0000_0000 : P1m0 = &B_0011_0000       ' Push-pull output mode
P1pu = &B_0000_0100                       ' 1: pull-up resistor

Test_out Alias P1.4
My_led Alias P1.5



P3ie = &B_0000_1100                       ' 1: Enable digital signal input     P3.3=INT1 P3.2=INT0
P3m1 = &B_0000_0000 : P3m0 = &B_0000_0000       '
P3pu = &B_0000_1100                       ' 1: pull-up resistor

On Int0 Int0_int                          'Initialise the INT0 Interrupt
'Priority Set Int0                         'set INT0 to the highest priority level (INT1 has by default the highest prio)

'It0 = 0                                   ' Enable INT0 rising and falling interrupt
It0 = 1                                   ' Enable INT0 falling edge interrupt

Enable Int0                               'enable the interrupt

Enable Interrupts


Test_out = 1

For Temp = 0 To 9
  My_led = 1
  Waitms 50

  My_led = 0
  Waitms 50
Next

Test_out = 0


Do
  Test_out = 1
  Waitms 90

  Test_out = 0
  Waitms 90
Loop

'------------------------------------
Int0_int:
  Incr Temp
  If Temp > 5 Then
    My_led = 1
    Waitms 50
    My_led = 0
    Temp = 0
  End If
Return

0

34

LCD 1602 и иже с ним запустить не получилось: на экране мусор.
Пробовал на разные выводы цеплять - не помогло. Хотя каждая из них индивидуально работает правильно.
Изменение скорости результата не дало. Лезть в ассм не стал - я его не знаю.
Потом попробую написать свою ПП для работы с этими ЖКИ.

0

35

Александр Д. написал(а):

LCD 1602 и иже с ним запустить не получилось: на экране мусор.Пробовал на разные выводы цеплять - не помогло. Хотя каждая из них индивидуально работает правильно.Изменение скорости результата не дало. Лезть в ассм не стал - я его не знаю.Потом попробую написать свою ПП для работы с этими ЖКИ.

Может, такой подход поможет ? Кириллица на китайских OLED дисплеях

Тут, правда, работа с настройками, но что мешает этим же способом впихивать данные ?
Набор используемых операторов невелик, несложно портировать в Ассм...

0

36

Файл STC_8H.DAT был в комплекте или из чего-то переправлен самостоятельно ?

0

37

Nord написал(а):

Файл STC_8H.DAT был в комплекте или из чего-то переправлен самостоятельно ?

Сам писал, выкладывал выше.
Вот BASCOM 8051

Отредактировано Александр Д. (Вчера 20:38:23)

+1

38

Nord написал(а):

Тут, правда, работа с настройками, но что мешает этим же способом впихивать данные ?

Не, тут иное: Видно, что какие-то команды прошли в LCD (например, скроллинг вправо работает), но вместо символов - ооо/-* и прочее

0

39

Немного перевёл таблицу с функционалом.
Криво смотрится, но пока некогда украшать и переделывать.

Справа в таблице - цена от 1000 штук :)

https://forumupload.ru/uploads/0000/25/b8/439/t748991.jpg

Отредактировано Александр Д. (Вчера 20:39:57)

0

40

Александр Д. написал(а):

Nord написал(а):Файл STC_8H.DAT был в комплекте или из чего-то переправлен самостоятельно ?

Сам писал, выкладывал выше.

Сорри, упустил из виду...  :blush:

Александр Д. написал(а):

Не, тут иное: Видно, что какие-то команды прошли в LCD (например, скроллинг вправо работает), но вместо символов - ооо/-* и прочее

Эти дисплеи чувствительны к временнЫм параметрам, может это сыграло ?
Буфер команд у них не всесильный... ;)
Или BUSY отслеживать...

0

41

Nord написал(а):

Эти дисплеи чувствительны к временнЫм параметрам, может это сыграло ?
Буфер команд у них не всесильный... ;)
Или BUSY отслеживать...

ну, ценность Баском именно в родных библиотеках!
а так да, самому написать придётся ...

0

42

Александр Д. написал(а):

ну, ценность Баском именно в родных библиотеках!
а так да, самому написать придётся ...

Вот я к тому и веду... ;)
Если писать свою LIB, то учитывать характеристики прибора.

Я тогда (по ссылке выше) раза с пятого только в нужную задержку попал... ;)
Кстати, предлагаю использовать необходимые фрагменты оттуда, чтоб не изобретать "с ноля". ;)

0

43

даташиты есть с 2004 года )) тогда на PIC и ассме только так и работал...
Это потом PICbasic и полеГше стало именно благодаря библиотекам! ))

0

44

Если Баском не подкую - есть Паскаль для 8051
https://www.rathlev-home.de/index-e.html  Среда
https://turbo51.com/8051-compiler-faq  Сам компилятор

0