Например TDA7294

Форум РадиоКот • Просмотр темы - Работа TWI по двум датчикам LM75
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Ср мар 11, 2026 21:50:15

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 32 ]    , 2
Автор Сообщение
 Заголовок сообщения: Re: Работа TWI по двум датчикам LM75
СообщениеДобавлено: Вт янв 20, 2026 19:22:49 
Модератор
Аватар пользователя

Карма: 153
Рейтинг сообщений: 2942
Зарегистрирован: Сб авг 14, 2010 15:05:51
Сообщений: 19000
Откуда: г. Озерск, Челябинская обл.
Рейтинг сообщения: 0
Медали: 1
Лучший человек Форума 2017 (1)
не-е, ты вполне вменяемый. мои слова понимаешь с первого раза. просто тебе знаний не хватает. и поэтому ты намудрил нерациональный избыточный код.
а вот чтобы не крутиться непрерывно в цикле и с "бешеной" скоростью повторять опрос датчиков, тебе нужно задействовать таймер.
и с помощью таймера отмерять, например, 1-секундные интервалы, и раз в секунду опрашивать датчики и выводить результаты на экран.

_________________
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.


Вернуться наверх
 
 Заголовок сообщения: Re: Работа TWI по двум датчикам LM75
СообщениеДобавлено: Вт янв 20, 2026 19:31:12 
Это не хвост, это антенна

Карма: 12
Рейтинг сообщений: 133
Зарегистрирован: Вт июн 07, 2011 08:03:18
Сообщений: 1360
Рейтинг сообщения: 0
Если есть самокритика - значит уже вменяемый. Но всё относительно. Код я бы советовал оформлять в соответствующие теги. Но, если на это модераторы не обращают внимания, значит они неприхотливые, значит они это хавают.( При этом ещё рассуждают о быдло коде.(


Вернуться наверх
 
 Заголовок сообщения: Re: Работа TWI по двум датчикам LM75
СообщениеДобавлено: Вт янв 20, 2026 19:59:46 
Родился

Зарегистрирован: Вс янв 18, 2026 16:17:44
Сообщений: 15
Рейтинг сообщения: 0
Я немного запутался в инструкции, и прицепился к аппаратному TWI, вместо того, чтобы оставить в покое эти статусные коды и прописать всё в цикле. И с этим вопросом и вас запутал. Вы подумали, что мне непонятно как адресуется микросхема. А я имел ввиду, что пытаясь обращаться в обработчике к двум и более слейвам, меня постоянно выкидывает только на первый. Теперь понятно, что это всё таки можно сделать, но не так дебильно как я пытался.


Вернуться наверх
 
 Заголовок сообщения: Re: Работа TWI по двум датчикам LM75
СообщениеДобавлено: Вт янв 20, 2026 20:27:55 
Модератор
Аватар пользователя

Карма: 153
Рейтинг сообщений: 2942
Зарегистрирован: Сб авг 14, 2010 15:05:51
Сообщений: 19000
Откуда: г. Озерск, Челябинская обл.
Рейтинг сообщения: 0
Медали: 1
Лучший человек Форума 2017 (1)
я проверяю только один статусный код - SLA_W_OK, это то, что адрес для записи прошел правильно, то есть, микра восприняла адрес и дала правильный ответ.
мне этого хватает, мне это гарантирует, чо все следующие статусы будут правильные.
как я уже говорил, можно сделать и в прерывании по счетчику, который указывает к какому датчику обращаться.
но грамотное написание программы означает, что обработчик должен быть как можно короче, чтобы на прерывание тратить как можно меньше времени.
и если в программе имеется несколько прерываний, то "длинный" обработчик может задержать какое-либо прерывание на недопустимо большое время.
а у тебя в твоем исходном коде всё делается в прерывании, и поэтому прерывание длится слишком долго.
а если ты еще вздумал бы в этом же прерывании делать вывод результатов на экран, то это был бы истинно быдлокод.

_________________
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
 Заголовок сообщения: Re: Работа TWI по двум датчикам LM75
СообщениеДобавлено: Вт янв 20, 2026 21:06:26 
Родился

Зарегистрирован: Вс янв 18, 2026 16:17:44
Сообщений: 15
Рейтинг сообщения: 0
Вот именно этим быдло кодом я заняться и вознамерился)) Странно конечно, но вывод на прерываниях на дисплей получился, в протеусе, хотя был уверен что именно это и не выйдет. Теперь доделаю эту стряпню как есть, а потом переделаю по вашим замечаниям. Инструкция в даташитах по i2c всё ж какая-то половинчатая , как бы не полностью разъясняет.


Вернуться наверх
 
 Заголовок сообщения: Re: Работа TWI по двум датчикам LM75
СообщениеДобавлено: Ср янв 21, 2026 05:25:03 
Друг Кота

Карма: 67
Рейтинг сообщений: 1032
Зарегистрирован: Пт мар 07, 2008 06:54:43
Сообщений: 4412
Откуда: Ижевск
Рейтинг сообщения: 0
TWI, USART в режиме I²C есть не во всех камнях AVR(mega8515, usb82/162). Жесткая привязка лап контроллера к SDA и SCL, на практике, не всегда удобна.
Как вариант использовать "ногодрыг". Преимущества
- можно назначать любые лапы как SDA и SCL
- за счет перевода лап, назначенных SDA, SCL на вывод ускоряется запись
- при чтении лапа SDA назначается входом с встроенной подтяжкой и понижается скорость SCL
- код на ассемблере меньше, чем код обслуживания модуля TWI.


Вернуться наверх
 
 Заголовок сообщения: Re: Работа TWI по двум датчикам LM75
СообщениеДобавлено: Ср янв 21, 2026 07:27:32 
Модератор
Аватар пользователя

Карма: 153
Рейтинг сообщений: 2942
Зарегистрирован: Сб авг 14, 2010 15:05:51
Сообщений: 19000
Откуда: г. Озерск, Челябинская обл.
Рейтинг сообщения: 0
Медали: 1
Лучший человек Форума 2017 (1)
akl, для такого новичка твоя информация избыточна, а потому лишняя.

_________________
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.


Вернуться наверх
 
 Заголовок сообщения: Re: Работа TWI по двум датчикам LM75
СообщениеДобавлено: Ср янв 21, 2026 22:20:30 
Родился

Зарегистрирован: Вс янв 18, 2026 16:17:44
Сообщений: 15
Рейтинг сообщения: 0
Ногодрыгами занимался по 1-Wire, даже вполне так себе сносно, по I2C пока не добрался. На первый взгляд показалось, что по 1-wire эта тема даже по-сложнее.

Добавлено after 8 hours 31 minute 43 seconds:
Код получился длинный и нубовский. Вывод на дисплей на аппаратном TWI, опрос датчика уже с учётом замечаний. Для бивней эта писанина наверное может быть полезна как чисто физически всё работает. Спасибо большое за помощь. В принципе, первую часть перевести в основной цикл и это говно наверное можно даже использовать в железе.
Спойлер
Код:
 .include "m16def.inc"
.def temp = r16
.def razr1 = r17
.def razr2 = r18
.def razr3 = r19


.equ FREQ = 8000000 // Частота работы чипа 8 Мгц
.equ FreqSCL = 400000 // Максимальная частота работы I2C 400 КГц
.equ FreqTWBR = ((FREQ/FreqSCL)-16)/2 // В формуле учитывается Регистр TWPS == 0


///////////////////////////////// Уставки LCD
.equ   LCD_PORT    = PORTA // порт, на котором LCD
.equ   LCD_RS      = 0
.equ   LCD_EN      = 2

                  ////////////// Назначение для BCD /////////////////
.def    fbinL   =r20            ;двоичное значение, младший байт
.def    fbinH   =r21            ;двоичное значение, старший байт
.def    tBCD0   =r21           ;BCD значение, цифры 1 и 0 ( младший порядок )
.def    tBCD1   =r22            ;BCD значение, цифры 3 и 2
.def    tBCD2   =r23            ;BCD значение, цифра 4 ( стрший порядок )
.def    temp1   =r27
.def    data    =r28

.dseg
Term:
.byte 5

.cseg
.org 0
jmp Reset
.org $022
jmp TWSI

Reset:
ldi temp,high(ramend)
out sph,temp
ldi temp,low(ramend)
out spl,temp
ldi temp,FreqTWBR
out TWBR,temp
sei

Prog:

rcall Delay
ldi temp,0b10100101    ///////// Старт
out TWCR,temp
rcall Delay
rcall Dat_1
rjmp Prog

TWSI:
cli
ldi temp,0b01111110
out TWDR,temp
ldi temp,0b10000100
out TWCR,temp

Wait1:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait1

in temp,TWSR
andi temp,0xF8
cpi temp,0x18
brne error

rcall Del_15ms
rcall Init_1       ///////// 1-я команда инициализации

rcall Del_5ms      ///////// 2-я команда инициализации
rcall Init_1

rcall Del_100mks   ///////// 3-я команда инициализации
rcall Init_1

rcall Del_100mks
rcall Init_4       ///////// 4-я команда инициализации

rcall Del_100mks
rcall Init_5       ///////// 5-я команда инициализации (Переход на 4-битный режим)

rcall Del_100mks   ///////// 6-я команда инициализации
rcall Init_6

rcall Del_100mks   ///////// 7-я команда инициализации
rcall Init_7

rcall Del_100mks   ///////// 8-я команда инициализации (Последняя команда инициализации)
rcall Init_8

//////////////////////////////////////////////////
rcall Curs_1     
rcall Stop
sei
reti

Error:
ldi zh,high(term+1)
ldi zl,low(term+1)
ldi temp,0xff
st z,temp
ret

Init_1: ///////////////////////////////////////// Это 1-полубайт отправка
ldi temp,0b00110100
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait2:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait2

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
brne error
////////////////
ldi temp,0b00110000
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait3:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait3

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
brne error
ret          ////////// Конец Init_1
Init_4: //////////// Это 4-я команда инициализации
 ///////////////////////////////////////// Это 1-полубайт отправка

ldi temp,0b00100100
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait6:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait6

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
////////////////
ldi temp,0b00100000
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait7:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait7

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
ret       ////////// Конец Init_4   
Init_5: //////////// Это 5-я команда инициализации
 ///////////////////////////////////////// Это 1-полубайт отправка

ldi temp,0b00100100
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_a:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_a

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
////////////////
ldi temp,0b00100000
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_b:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_b

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
//////////////////////////////////
///////////////////////////////////////// Это 2-й полубайт отправка

ldi temp,0b10000100
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_c:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_c

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
////////////////
ldi temp,0b10000000
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_d:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_d

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
         
breq  PC+2                  ;
rjmp  error
ret       ////////// Конец Init_5   

Init_6: //////////// Это 6-я команда инициализации
 ///////////////////////////////////////// Это 1-полубайт отправка

ldi temp,0b00000100
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_a1:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_a1

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
////////////////
ldi temp,0b00000000
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_b1:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_b1

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
//////////////////////////////////
///////////////////////////////////////// Это 2-й полубайт отправка

ldi temp,0b11100100
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_c1:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_c1

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
////////////////
ldi temp,0b11100000
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_d1:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_d1

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
         
breq  PC+2                  ;
rjmp  error
ret       ////////// Конец Init_6   


Init_7: //////////// Это 7-я команда инициализации
 ///////////////////////////////////////// Это 1-полубайт отправка

ldi temp,0b00000100
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_a2:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_a2

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
////////////////
ldi temp,0b00000000
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_b2:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_b2

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
//////////////////////////////////
///////////////////////////////////////// Это 2-й полубайт отправка

ldi temp,0b00010100
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_c2:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_c2

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
////////////////
ldi temp,0b00010000
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_d2:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_d2

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
         
breq  PC+2                  ;
rjmp  error
ret       ////////// Конец Init_7



Init_8: //////////// Это 8-я команда инициализации
 ///////////////////////////////////////// Это 1-полубайт отправка

ldi temp,0b00000100
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_a3:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_a3

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
////////////////
ldi temp,0b00000000
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_b3:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_b3

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
//////////////////////////////////
///////////////////////////////////////// Это 2-й полубайт отправка

ldi temp,0b01100100
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_c3:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_c3

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
////////////////
ldi temp,0b01100000
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_d3:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_d3

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
         
breq  PC+2                  ;
rjmp  error
ret       ////////// Конец Init_8 

Curs_1: //////////// Первая буква
rcall Del_5ms

 ///////////////////////////////////////// Это 1-полубайт знакоместа

ldi temp,0b10000100
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_a4:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_a4

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
////////////////
ldi temp,0b10000000
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_b4:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_b4

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
//////////////////////////////////
///////////////////////////////////////// Это 2-й полубайт знакоместа

ldi temp,0b00110100
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_c4:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_c4

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
////////////////
ldi temp,0b00110000
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_d4:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_d4

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
         
breq  PC+2                  ;
rjmp  error
       ////////// Конец установки знакоместа буквы

 ///////////////////////////////////////// Это 1-полубайт записи первой буквы

ldi temp,0b01010101
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_a5:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_a5

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
////////////////
ldi temp,0b01010001
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_b5:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_b5

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
//////////////////////////////////
///////////////////////////////////////// Это 2-й полубайт записи первой буквы

ldi temp,0b01000101
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_c5:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_c5

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
////////////////
ldi temp,0b01000001
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_d5:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_d5

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
         
breq  PC+2                  ;
rjmp  error    ////////// Конец записи 1-й буквы
               ////////// Запись 2-й буквы

 ///////////////////////////////////////// Это 2-полубайт записи первой буквы
 ///////////////////////////////////////// Это 1-полубайт записи второй буквы

ldi temp,0b01100101
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_a6:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_a6

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
////////////////
ldi temp,0b01100001
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_b6:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_b6

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
//////////////////////////////////
///////////////////////////////////////// Это 2-й полубайт записи второй буквы

ldi temp,0b01010101
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_c6:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_c6

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
////////////////
ldi temp,0b01010001
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_d6:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_d6

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
         
breq  PC+2                  ;
rjmp  error    ////////// Конец записи 2-й буквы

 ///////////////////////////////////////// Это 1-полубайт записи третьей буквы

ldi temp,0b01100101
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_a7:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_a7

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
////////////////
ldi temp,0b01100001
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_b7:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_b7

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
//////////////////////////////////
///////////////////////////////////////// Это 2-й полубайт записи третьей буквы

ldi temp,0b11010101
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_c7:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_c7

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
////////////////
ldi temp,0b11010001
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_d7:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_d7

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
         
breq  PC+2                  ;
rjmp  error    ////////// Конец записи 4-й буквы

 ///////////////////////////////////////// Это 1-полубайт записи четвертой буквы

ldi temp,0b01110101
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_a8:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_a8

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
////////////////
ldi temp,0b01110001
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_b8:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_b8

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
//////////////////////////////////
///////////////////////////////////////// Это 2-й полубайт записи четвертой буквы

ldi temp,0b00000101
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_c8:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_c8

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
////////////////
ldi temp,0b00000001
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_d8:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_d8

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
         
breq  PC+2                  ;
rjmp  error    ////////// Конец записи 4-й буквы

 ///////////////////////////////////////// Это 1-полубайт записи двоеточия 1-й строки

ldi temp,0b00110101
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_a9:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_a9

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
////////////////
ldi temp,0b00110001
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_b9:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_b9

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
//////////////////////////////////
///////////////////////////////////////// Это 2-й полубайт записи двоеточия 1-й строки

ldi temp,0b10100101
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_c9:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_c9

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
////////////////
ldi temp,0b10100001
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_d9:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_d9

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
         
breq  PC+2                  ;
rjmp  error    ////////// Конец записи двоеточия 1-й строки

rcall Send_dat_temp3
rcall Send_dat_temp2
rcall Send_dat_temp1

 ///////////////////////////////////////// Это 1-полубайт знакоместа второй строки

ldi temp,0b11000100
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_a41:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_a41

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
////////////////
ldi temp,0b11000000
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_b41:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_b41

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
//////////////////////////////////
///////////////////////////////////////// Это 2-й полубайт знакоместа 2-й строки

ldi temp,0b00110100
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_c41:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_c41

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
////////////////
ldi temp,0b00110000
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_d41:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_d41

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
         
breq  PC+2                  ;
rjmp  error
       ////////// Конец установки знакоместа буквы 2-й строки

 ///////////////////////////////////////// Это 1-й полубайт 1-й буквы 2-й строки


ldi temp,0b01010101
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_a91:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_a91

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
////////////////
ldi temp,0b01010001
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_b91:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_b91

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
//////////////////////////////////
///////////////////////////////////////// Это 2-й полубайт 1-й  буквы 2-й строки

ldi temp,0b01100101
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_c91:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_c91

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
////////////////
ldi temp,0b01100001
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_d91:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_d91

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
         
breq  PC+2                  ;
rjmp  error    ////////// Конец записи 1-й буквы 2-й строки

///////////////////////////////////////// Это 1-полубайт 2-й буквы 2-й строки


ldi temp,0b01100101
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_a92:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_a92

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
////////////////
ldi temp,0b01100001
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_b92:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_b92

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
//////////////////////////////////
///////////////////////////////////////// Это 2-й полубайт 2-й буквы 2-й строки

ldi temp,0b11000101
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_c92:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_c92

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
////////////////
ldi temp,0b11000001
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_d92:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_d92

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
         
breq  PC+2                  ;
rjmp  error    ////////// Конец записи 2-й буквы 2-й строки

///////////////////////////////////////////////

ldi temp,0b11000100
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_94:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_94

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
////////////////
ldi temp,0b11000000
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_95:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_95

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error

///////////////////////////////////////// Это 2-й полубайт знакоместа 2-й строки

ldi temp,0b01110100
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_96:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_96

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
////////////////
ldi temp,0b01110000
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_97:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_97

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
         
breq  PC+2                  ;
rjmp  error


///////////////////////////////////////// Это 1-полубайт записи двоеточия 2-й строки


ldi temp,0b00110101
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_a93:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_a93

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
////////////////
ldi temp,0b00110001
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_b93:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_b93

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error

///////////////////////////////////////// Это 2-й полубайт записи двоеточия 2-й строки

ldi temp,0b10100101
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_c93:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_c93

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
////////////////
ldi temp,0b10100001
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_d93:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_d93

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
         
breq  PC+2                  ;
rjmp  error   


ret

Stop:
ldi r16, 0b00010100
out TWCR, temp
ret


Delay:
ldi razr1, 255
ldi razr2, 255
ldi razr3, 20

PDelay:
dec razr1
brne PDelay
dec razr2
brne PDelay
dec razr3
brne PDelay
ret

Del_15ms:
ldi xh,high(FREQ/266)
ldi xl,low(FREQ/266)
PDelay1:
sbiw XH:XL, 1
brne PDelay1
ret

Del_5ms:
ldi xh,high(FREQ/800)
ldi xl,low(FREQ/800)
PDelay2:
sbiw XH:XL, 1
brne PDelay2
ret

Del_100mks:
ldi xh,high(FREQ/40000)
ldi xl,low(FREQ/40000)
PDelay3:
sbiw XH:XL, 1
brne PDelay3
ret

////////////////////////////////////////////////////////////////////
                    ////////// Это часть датчика //////////////////

Dat_1:
    rcall delay                   
    CALL I2C_START                  ;Отправка Старт
    LDI  R27, 0b10011110            ;SLA(0b1001000) + W(0)
    CALL I2C_WRITE                  ;Отправка SLAW
    LDI  R27, 0b00000000            ;Задание значения Pointer
    CALL I2C_WRITE                  ;Отправка Pointer
    CALL I2C_START                  ;Рестарт
    LDI  R27, 0b10011111            ;SLA(0b1001000) + R(0)
    CALL I2C_WRITE                  ;Отправка SLAR
    CALL Read_byte1                 ;Запись первого байта
   rcall delay
   CALL Read_byte2                 ;Запись второго байта (температуры)
    rcall delay
   CALL I2C_STOP                   ;Стоп
    rcall delay
ret

;----------
I2C_INIT:
     LDI    R21, 0             
     OUT    TWSR, R21           
     LDI    R21, (1<<TWEN)     
     OUT    TWCR, R21           
     RET

;----------
I2C_START:
     LDI    R21, (1<<TWINT)|1<<(TWSTA)|(1<<TWEN)
     OUT    TWCR, R21           
 WAIT11: 
     IN     R21, TWCR           
     SBRS   R21, TWINT         
     RJMP   WAIT11               
     RET 

 ;---------- ----------
 I2C_WRITE:
     OUT    TWDR, R27           
     LDI    R21,  (1<<TWINT)|(1<<TWEN)
     OUT    TWCR, R21           
  WAIT31:
     IN     R21, TWCR         
     SBRS   R21, TWINT         
     RJMP   WAIT31             
     RET

 ;----------
 I2C_STOP:
     LDI    R21, (1<<TWINT)|1<<(TWSTO)|(1<<TWEN)
     OUT    TWCR, R21           
     RET

Read_byte1:
ldi zh,high(term)
ldi zl,low(term)
in temp,TWDR
st z,temp
rcall TWI_ReciveAck
ret

Read_byte2:
ldi zh,high(term+1)
ldi zl,low(term+1)
in temp,TWDR
st z,temp
rcall TWI_ReciveNack
ret

TWI_ReciveAck:
ldi r16, 0b11000100
out TWCR, r16
ret

TWI_ReciveNack:
ldi r16, 0b10000100
out TWCR, r16
ret

///////////////////////////////////////////////////////////////////////////////////


     /////////////////////  Конвертация цифры температуры ///////////////////////     

; Преобразование HEX в BCD

;Вход
;.def    fbinL   =  r20            ;двоичное значение, младший байт
;.def    fbinH   = r21            ;двоичное значение, старший байт

;Выход
;.def    tBCD0   = r21            ;BCD значение, цифры 1 и 0 ( младший порядок )
;.def    tBCD1   = r22            ;BCD значение, цифры 3 и 2
;.def    tBCD2   = r23            ;BCD значение, цифра 4 ( стрший порядок )
;Примечание: Переменные fbinH и tBCD0 должны размещаться в одном
;регистре.
;После преобразования числа 65535 в итоге будет.
/*
r17: 0b0011_0101 это 3 и 5
r18: 0b0101_0101 это 5 и 5
r19: 0b0000_0110 это 6
*/
bin16BCD5:              ldi     tBCD2,-1
b16BCD5_l1:             inc     tBCD2
                                                                ;255
                        subi    fbinL,low(10000)                ;r17 0101_0101 
                        sbci    fbinH,high(10000)               ;r18 0000_0010
                                                                ;
                        brsh    b16BCD5_l1                      ;1500
                                                                ;r17 0000_0000
                        subi    fbinL,low(-10000)               ;r18 0001_0101
                        sbci    fbinH,high(-10000)             
                                                               
                        ldi     tBCD1,-0x11                             

b16BCD5_l2:             subi    tBCD1,-0x10
                        subi    fbinL,low(1000)
                        sbci    fbinH,high(1000)
   
                        brsh    b16BCD5_l2
   
                        subi    fbinL,low(-1000)
                        sbci    fbinH,high(-1000)

b16BCD5_l3:             inc     tBCD1
                        subi    fbinL,low(100)
                        sbci    fbinH,high(100)
   
                        brsh    b16BCD5_l3
   
                        subi    fbinL,-100
                        ldi     tBCD0,-0x10

b16BCD5_l4:             subi    tBCD0,-0x10
                        subi    fbinL,10
   
                        brsh    b16BCD5_l4
                        subi    fbinL,-10
                        add     tBCD0,fbinL

ret
                ////////// HEX >>> BCD температуры ///////////
Send_dat_temp1:       
clr r20
clr r21
rcall Vyv_temp
rcall bin16BCD5
mov data,tBCD0
lsl data
lsl data
lsl data
lsl data
ori data,0b00000011
rcall Send_data
RET

Send_dat_temp2:       
clr r20
clr r21
rcall Vyv_temp
rcall bin16BCD5
mov data,tBCD0
lsr data
lsr data
lsr data
lsr data
swap data
ori data,0b00000011
rcall Send_data
RET

Send_dat_temp3:       
clr r20
clr r21
rcall Vyv_temp
rcall bin16BCD5
mov data,tBCD1
lsl data
lsl data
lsl data
lsl data
ori data,0b00000011
rcall Send_data
RET
                 
                         /////// Вывод значчения температуры /////////
Send_data:              ///////// 1-й полубайт //////////
mov temp,data
lsl temp
lsl temp
lsl temp
lsl temp

ori  temp,0b00000101
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_a95:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_a95

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
////////////////

mov temp,data

mov temp,data
lsl temp
lsl temp
lsl temp
lsl temp
ori  temp,0b00000001
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_b94:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_b94

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
                      ///////// 2-й полубайт //////////

mov temp,data
lsr temp
lsr temp
lsr temp
lsr temp
swap temp
ori  temp,0b00000101
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_a98:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_a98

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq  PC+2                  ;
rjmp  error
////////////////

mov temp,data
lsr temp
lsr temp
lsr temp
lsr temp
swap temp
ori  temp,0b00000001
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp

Wait_b99:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_b99

in temp,TWSR
andi temp,0xF8
cpi temp,0x28
         
breq  PC+2                  ;
rjmp  error 
ret
           ////////////////////////////////
Vyv_temp:
ldi ZH,HIGH(Term)
ldi ZL,LOW(Term)
ldi temp,0
ldd temp1,z+1
mov fbinH,temp
mov fbinL,temp1
ret

; Задержка в 110 млс
Delay_Init3:
ldi XH, high(FREQ/72727)
ldi XL, low(FREQ/72727)
del_in3:
sbiw XH:XL, 1
brne del_in3
ret

Добавлено after 14 minutes 8 seconds:
Изображение


Вернуться наверх
 
 Заголовок сообщения: Re: Работа TWI по двум датчикам LM75
СообщениеДобавлено: Чт янв 22, 2026 06:10:52 
Модератор
Аватар пользователя

Карма: 153
Рейтинг сообщений: 2942
Зарегистрирован: Сб авг 14, 2010 15:05:51
Сообщений: 19000
Откуда: г. Озерск, Челябинская обл.
Рейтинг сообщения: 0
Медали: 1
Лучший человек Форума 2017 (1)
во-первых, код следует помещать в тег "Code", чтобы не нарушалось форматирование кода.
во-вторых, такую длинную "портянку" следует прятать в тег спойлер ("spoiler"). про длинные тексты и спойлер есть правило форума 2.5.
не надо людей заставлять долго прокручивать экран. кто захочет почитать, откроет спойлер.

_________________
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.


Вернуться наверх
 
 Заголовок сообщения: Re: Работа TWI по двум датчикам LM75
СообщениеДобавлено: Чт янв 22, 2026 07:33:39 
Родился

Зарегистрирован: Вс янв 18, 2026 16:17:44
Сообщений: 15
Рейтинг сообщения: 0
Буду иметь ввиду, спасибо.


Вернуться наверх
 
 Заголовок сообщения: Re: Работа TWI по двум датчикам LM75
СообщениеДобавлено: Чт янв 22, 2026 07:55:14 
Друг Кота

Карма: 67
Рейтинг сообщений: 1032
Зарегистрирован: Пт мар 07, 2008 06:54:43
Сообщений: 4412
Откуда: Ижевск
Рейтинг сообщения: 0
Задержка выполнена неправильно. Как вариант, при котором студия показывает примерно правильное значение задержки
Код:
; Задержка в 110 млс
Delay:
Delay_Init3:
   LDI   R20,BYTE3(110*FREQ/1000/5)
   LDI   R21,BYTE2(110*FREQ/1000/5)
   LDI   R22,BYTE1(110*FREQ/1000/5)

del_in3:
   SUBI   R22,1
   SBCI   R21,0
   SBCI   R20,0
   brne del_in3
   RET
;ldi XH, high(FREQ/72727)
;ldi XL, low(FREQ/72727)
;del_in3:
;   sbiw XL, 1
;   brne del_in3
;   RET

СпойлерИзображение


Вложения:
DEL_110.PNG [10.08 KiB]
Скачиваний: 64
Вернуться наверх
 
 Заголовок сообщения: Re: Работа TWI по двум датчикам LM75
СообщениеДобавлено: Чт янв 22, 2026 09:18:35 
Родился

Зарегистрирован: Вс янв 18, 2026 16:17:44
Сообщений: 15
Рейтинг сообщения: 0
Задержки для дисплея проверял в отладчике, они примерно верные. А эта последняя скорей всего вообще не нужна, там что-то налепил, потом поправлю, спасибо. Этот код, как было выше замечено, нужно приводить в правильный вид. В обработчике, наверное, нельзя делать такой кирпич, тем более пытаться в нëм делать опрос нескольких слейвов. Это просто для сведения начинающих, кто как и я попал в просак с неправильным пониманием даташита.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 32 ]    , 2

Часовой пояс: UTC + 3 часа


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y