Програмування пристроїв I2C BASCOM-8051

Для програмування пристроїв, підключених до шини 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 = P15 P15 як лінія SDA Config Scl = P14 P14 як лінія 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 B0 перемкнемо у режим зчитування

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 B0

Перемкнемо у режим зчитування

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

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*