Главная » Bascom-8051, Basic, Железо » Программирование устройств I2C  BASCOM-8051

0

Для программирования устройств, подключенных к шине I2C, Bascom предоставляет два варианта:

а)   использовать   готовые   операторы   записи   и   считывания   данных,   соответственно   I2CSEND   и

I2CRECEIVE;

б) использовать операторы I2CSTART, I2CSTOP, I2CRBYTE и I2CWBYTE и  самостоятельно создавать программы взаимодействия с устройствами на шине I2C.

В первом случае программа получается намного проще, однако, ограничен круг  устройств,  с которыми можно работать, т.к. операторы I2CSEND и I2CRECEIVE позволяют использовать только однобайтный адрес. К устройствам, имеющим однобайтный адрес, относятся микросхемы переменных резисторов (регуляторов уровня),

ЦАП, АЦП, порты ввода-вывода, драйверы светодиодных индикаторов и реле.

Когда  подпрограммы  записи  и  чтения  данных  написаны  с  использованием   операторов   I2CSTART, I2CSTOP, I2CRBYTE и I2CWBYTE, появляется возможность реализовать любой протокол обмена, содержащий сколько угодно байт адреса и данных. Это необходимо  для  работы с устройствами памяти, в которых адрес устройства является «ключом» доступа к  массиву данных. Ниже приведена программа тестирования EEPROM, содержащая три набора подпрограмм чтения и записи:

а) однобайтных данных с двухбайтным адресом (устройстве I2C);

б)  четырехбайтных  данных  и  с  двухбайтным  адресом.  В  этих  подпрограммах  реализована  страничная запись (четыре байта в странице при записи) и последовательное чтение (также четырех байт);

в) однобайтных данных с однобайтным адресом. Эти подпрограммы функционально близки  операторам

I2CSEND и I2CRECEIVE, но используют меньше ресурсов памяти.

Часть   подпрограмм,   представленных   в   примере,   объявлено   в   виде   функций   для   демонстрации возможностей  Bascom.  В  составе  программ  использовано  много  ассемблерных   вставок,  что  обусловлено необходимостью доступа к частям многобайтных переменных и для повышения эффективности кода. Операторы

I2CRBYTE и I2CWBYTE, соответственно считываемые и записываемые данные, передают через  аккумулятор.

Это используется в представленных программах, где аккумулятор для экономии используется в качестве регистра временного хранения данных (источника и приемника). С помощью  дисассемблирования было определено, что компилятор не использует регистр B в программах, работающих с интерфейсом I2С. Поэтому в представленных программах, и он такжже  используется  как временная переменная для хранения и обработки данных, позволяя уменьшить еще на одну, количество необходимых переменных.

В демонстрационной программе имеются операторы для обслуживания отладочного кристалла эмулятора типа  80C51GB.  Они намеренно  оставлены  в  тексте  программы,  чтобы  показать,  как оформляются  подобные

фрагменты.

‘————————————————————- ‘  Программа тестирование I2C EEPROM – 24c16 (2k*8)

‘  и утилиты работы с устройствами I2C

‘ строки, отмеченные знаками "!!!" относятся к местам программы,

‘ необходимых только для работы эмулятора на процессоре модели 80C51GB ‘————————————————————- ‘Определенные ниже п/п объявлены как функции переменных

‘Таким способом можно определять п/п только с входящими целыми числами

‘При использ. перем. с плав. точк. п/п приходится оформлять в обычном виде

Declare Sub Write_eeprom(wadr As Word , Value As Byte) Declare Sub Read_eeprom(wadr As Word , Value As Byte) Declare Sub Wrb_24c01(badr As Byte , Value As Byte) Declare Sub Rdb_24c01(badr As Byte , Value As Byte)

‘———————

Dim Addressw As Const 160 , Addressr As Const 161  ‘объявление констант

Dim Badr As Byte          ‘байтовый адрес

Dim Temp As Byte          ‘временные данные

Dim Value As Byte         ‘значение записываемых или считываемых данных

Dim Wadr As Word          ‘двухбайтный адрес

Dim Fld As Single         ‘число с плавающей точкой

‘———————

Config Sda = P1.5         ‘P1.5 как линия SDA Config Scl = P1.4         ‘P1.4 как линия SCL Config I2cdelay = 0       ‘ускорение линии I2C

Config Timer0 = Timer , Gate = Internal , Mode = 1 : Start Timer0 ‘———————

‘назначение режимов прерываний

On Timer0 Timer_0_int Nosave    ‘вектор прерывания

Enable Interrupts         ‘вообще разрешить прерывания Enable Timer0             ‘разрешить прерывания таймера 0 ‘!!! ————————————–

‘только в эмуляторе 80C51GB

Th0 = &HD8 : Tl0 = &HFD      ‘чтобы прерывание наступило не позже 10 мс Oscr = &HE1 : Oscr = &H1E    ‘выключить контроль частоты генератора Wdtrst = &H1E : Wdtrst = &HE1’сбросить будильник

P4 = &HFF : P5 = &HFF  ‘установить эмулирующие порты как в эмулируемые

‘———————

‘Цикл проверки программ записи чтения однобайтовых переменных

‘Используем обе формы записи объявленных функций

Mc:

For Wadr = 0 To 1024 Step 3   ‘готовим адрес

Value = Low(wadr)         ‘готовим данные

Call Write_eeprom(wadr , Value)       ‘записываем в EEPROM Next

For Wadr = 0 To 1024 Step 3   ‘готовим адрес

Read_eeprom Wadr , Value  ‘считываем данные из EEPROM Print Value ; "=" ; Value ‘печатаем данные

Waitms 50

Next Goto Mc

‘———————

‘Цикл проверки программ записи чтения четырехбайтовых переменных

‘Mc:

For Wadr = 0 To 2044 Step 4   ‘готовим адрес

Fld = Wadr

Fld = 3 * Fld             ‘готовим данные

Gosub Wrs_24c             ‘записываем в EEPROM

Next

For Wadr = 0 To 2044 Step 4   ‘готовим адрес

Gosub Rds_24c             ‘считываем данные из EEPROM Print Wadr ; "=" ; Fld    ‘печатаем данные

Waitms 50

Next Goto Mc

‘—————————————— ‘обработка прерывания таймера 0

Timer_0_int:

Th0 = &HD8 : Tl0 = &HFD     ‘Ffffh-10000 = D8fdh – период прерыв. 10 мс

‘!!! только в эмуляторе с 80C51GB

Wdtrst = &H1E : Wdtrst = &HE1       ‘сбросить будильник

Return

‘——————————————

‘п/п записи байта в EEPROM AT24с01A,AT24c02 – AT24c16

Sub Write_eeprom(wadr As Word , Value As Byte)

$asm

Mov A , {wadr + 1}          ;готовим старший байт, содержащий

Rl A                        ;старшие разряды адреса

Orl A , #{Addressw}         ;добавим код микросхемы

Mov B , A

$end Asm

I2cstart                    ‘старт

I2cwbyte B                  ‘первый байт режима

$asm

Mov A , {wadr + 0}

$end Asm

I2cwbyte Acc                ‘младший адрес в EEPROM I2cwbyte Value              ‘записывемое значение I2cstop                     ‘стоп

Waitms 10                   ‘подождем 10 мс

End Sub

‘——————————————

‘п/п считывания байта из EEPROM AT24с01A,AT24c02 – AT24c16

Sub Read_eeprom(wadr As Word , Value As Byte)

$asm

Mov A , {wadr + 1}          ;готовим старший байт, содержащий

Rl A                        ;старшие разряды адреса Orl A , #{Addressw}         ;добавим код микросхемы Mov B , A

$end Asm

I2cstart                    ‘старт

I2cwbyte B                  ‘первый байт режима

$asm

Mov A , {wadr + 0}

$end Asm

I2cwbyte Acc                ‘младший адрес в EEPROM

Set B.0                     ‘переключим в режим считывания

I2cstart                    ‘повторим старт I2cwbyte B                  ‘байт режима I2crbyte Value , 9          ‘считали байт I2cstop                     ‘стоп

End Sub

‘——————————————

‘п/п записи четырехбайтного числа в EEPROM AT24с01A,AT24c02 – AT24c16

Wrs_24c:

$asm

Mov A , {wadr + 1}          ;готовим старший байт, содержащий

Rl A                        ;старшие разряды адреса Orl A , #{Addressw}         ;добавим код микросхемы Mov B , A

$end Asm

I2cstart                    ‘старт

I2cwbyte B                  ‘первый байт режима

$asm

Mov A , {wadr + 0}

$end Asm

I2cwbyte Acc                ‘младший адрес в EEPROM

$asm

Mov A, {Fld + 0}

$end Asm

I2cwbyte Acc                ‘первый записываемый байт

$asm

Mov A , {Fld + 1}

$end Asm

I2cwbyte Acc                ‘2-й

$asm

Mov A , {Fld + 2}

$end Asm

I2cwbyte Acc                ‘3-й

$asm

Mov A , {Fld + 3}

$end Asm

I2cwbyte Acc                ‘4-й

I2cstop                     ‘стоп

Waitms 10                   ‘подождем 10 мс

Return

‘——————————————

‘п/п считывания четырехбайтного числа из EEPROM AT24с01A,AT24c02 – AT24c16

Rds_24c:

$asm

Mov A , {wadr + 1}          ;готовим старший байт, содержащий

Rl A                        ;старшие разряды адреса

Orl A , #{Addressw}         ;добавим код микросхемы

Mov B , A

$end Asm

I2cstart                    ‘старт

I2cwbyte B                  ‘первый байт режима

$asm

Mov A , {wadr + 0}

$end Asm

I2cwbyte

Acc

‘младший адрес в EEPROM

Set B.0

‘переключим в режим считывания

I2cstart

‘повторим старт

I2cwbyte

B

‘байт режима

I2crbyte

Acc

, 8

‘считали 1-й байт с опцией ASC

(8)

$asm

Mov {Fld + 0} , A

$end Asm

I2crbyte Acc , 8            ‘2-й байт

$asm

Mov {Fld + 1} , A

$end Asm

I2crbyte Acc , 8            ‘3-й байт

$asm

Mov {Fld + 2} , A

$end Asm

I2crbyte Acc , 9            ‘последний байт с опцией NOASC (9)

$asm

Mov {Fld + 3} , A

$end Asm

I2cstop

‘стоп

Return

‘——————————————

‘п/п записи байта в EEPROM AT24с01

Sub Wrb_24c01(badr As Byte , Value As Byte)

Acc = Badr                  ‘готовим адрес

$asm

Rl A               ;  ——————————- Mov B , A          ; | a6| a5| a4| a3| a2| a1| a0| 0 |

$end Asm

I2cstart                    ‘старт

I2cwbyte B                  ‘адрес и бит режима I2cwbyte Value              ‘записывемое значение I2cstop                     ‘стоп

Waitms 10                   ‘подождем 10 мс

End Sub

‘—————————————— ‘п/п считывания байта из EEPROM AT24с01

Sub Rdb_24c01(badr As Byte , Value As Byte)

Acc = Badr                  ‘готовим адрес

$asm

Setb c              ;  ——————————- Rlc A               ; | a6| a5| a4| a3| a2| a1| a0| 1 | Mov {Value} , A

$end Asm

I2cstart

‘старт

I2cwbyte

Value

‘первый байт режима

I2crbyte

Value

,

9

‘считали байт

I2cstop

‘стоп

End Sub

Источник: М.Л.Кулиш, СПРАВОЧНИК ПО ПРОГРАММИРОВАНИЮ BASCOM-8051, Краснодар 2001

По теме:

  • Комментарии