Работа TWI по двум датчикам LM75
- Starichok51
- Модератор
- Сообщения: 19039
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Работа TWI по двум датчикам LM75
не-е, ты вполне вменяемый. мои слова понимаешь с первого раза. просто тебе знаний не хватает. и поэтому ты намудрил нерациональный избыточный код.
а вот чтобы не крутиться непрерывно в цикле и с "бешеной" скоростью повторять опрос датчиков, тебе нужно задействовать таймер.
и с помощью таймера отмерять, например, 1-секундные интервалы, и раз в секунду опрашивать датчики и выводить результаты на экран.
а вот чтобы не крутиться непрерывно в цикле и с "бешеной" скоростью повторять опрос датчиков, тебе нужно задействовать таймер.
и с помощью таймера отмерять, например, 1-секундные интервалы, и раз в секунду опрашивать датчики и выводить результаты на экран.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Re: Работа TWI по двум датчикам LM75
Если есть самокритика - значит уже вменяемый. Но всё относительно. Код я бы советовал оформлять в соответствующие теги. Но, если на это модераторы не обращают внимания, значит они неприхотливые, значит они это хавают.( При этом ещё рассуждают о быдло коде.(
Re: Работа TWI по двум датчикам LM75
Я немного запутался в инструкции, и прицепился к аппаратному TWI, вместо того, чтобы оставить в покое эти статусные коды и прописать всё в цикле. И с этим вопросом и вас запутал. Вы подумали, что мне непонятно как адресуется микросхема. А я имел ввиду, что пытаясь обращаться в обработчике к двум и более слейвам, меня постоянно выкидывает только на первый. Теперь понятно, что это всё таки можно сделать, но не так дебильно как я пытался.
- Starichok51
- Модератор
- Сообщения: 19039
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Работа TWI по двум датчикам LM75
я проверяю только один статусный код - SLA_W_OK, это то, что адрес для записи прошел правильно, то есть, микра восприняла адрес и дала правильный ответ.
мне этого хватает, мне это гарантирует, чо все следующие статусы будут правильные.
как я уже говорил, можно сделать и в прерывании по счетчику, который указывает к какому датчику обращаться.
но грамотное написание программы означает, что обработчик должен быть как можно короче, чтобы на прерывание тратить как можно меньше времени.
и если в программе имеется несколько прерываний, то "длинный" обработчик может задержать какое-либо прерывание на недопустимо большое время.
а у тебя в твоем исходном коде всё делается в прерывании, и поэтому прерывание длится слишком долго.
а если ты еще вздумал бы в этом же прерывании делать вывод результатов на экран, то это был бы истинно быдлокод.
мне этого хватает, мне это гарантирует, чо все следующие статусы будут правильные.
как я уже говорил, можно сделать и в прерывании по счетчику, который указывает к какому датчику обращаться.
но грамотное написание программы означает, что обработчик должен быть как можно короче, чтобы на прерывание тратить как можно меньше времени.
и если в программе имеется несколько прерываний, то "длинный" обработчик может задержать какое-либо прерывание на недопустимо большое время.
а у тебя в твоем исходном коде всё делается в прерывании, и поэтому прерывание длится слишком долго.
а если ты еще вздумал бы в этом же прерывании делать вывод результатов на экран, то это был бы истинно быдлокод.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Re: Работа TWI по двум датчикам LM75
Вот именно этим быдло кодом я заняться и вознамерился)) Странно конечно, но вывод на прерываниях на дисплей получился, в протеусе, хотя был уверен что именно это и не выйдет. Теперь доделаю эту стряпню как есть, а потом переделаю по вашим замечаниям. Инструкция в даташитах по i2c всё ж какая-то половинчатая , как бы не полностью разъясняет.
Re: Работа TWI по двум датчикам LM75
TWI, USART в режиме I²C есть не во всех камнях AVR(mega8515, usb82/162). Жесткая привязка лап контроллера к SDA и SCL, на практике, не всегда удобна.
Как вариант использовать "ногодрыг". Преимущества
- можно назначать любые лапы как SDA и SCL
- за счет перевода лап, назначенных SDA, SCL на вывод ускоряется запись
- при чтении лапа SDA назначается входом с встроенной подтяжкой и понижается скорость SCL
- код на ассемблере меньше, чем код обслуживания модуля TWI.
Как вариант использовать "ногодрыг". Преимущества
- можно назначать любые лапы как SDA и SCL
- за счет перевода лап, назначенных SDA, SCL на вывод ускоряется запись
- при чтении лапа SDA назначается входом с встроенной подтяжкой и понижается скорость SCL
- код на ассемблере меньше, чем код обслуживания модуля TWI.
- Starichok51
- Модератор
- Сообщения: 19039
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Работа TWI по двум датчикам LM75
akl, для такого новичка твоя информация избыточна, а потому лишняя.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Re: Работа TWI по двум датчикам LM75
Ногодрыгами занимался по 1-Wire, даже вполне так себе сносно, по I2C пока не добрался. На первый взгляд показалось, что по 1-wire эта тема даже по-сложнее.
Добавлено after 8 hours 31 minute 43 seconds:
Код получился длинный и нубовский. Вывод на дисплей на аппаратном TWI, опрос датчика уже с учётом замечаний. Для бивней эта писанина наверное может быть полезна как чисто физически всё работает. Спасибо большое за помощь. В принципе, первую часть перевести в основной цикл и это говно наверное можно даже использовать в железе.
Добавлено after 14 minutes 8 seconds:

Добавлено 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-----------------------------
I2C_INIT:
LDI R21, 0
OUT TWSR, R21
LDI R21, (1<<TWEN)
OUT TWCR, R21
RET
;----------------------------I2C_START-----------------------------
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 -----------------------------
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------------------------------
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
- Starichok51
- Модератор
- Сообщения: 19039
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Работа TWI по двум датчикам LM75
во-первых, код следует помещать в тег "Code", чтобы не нарушалось форматирование кода.
во-вторых, такую длинную "портянку" следует прятать в тег спойлер ("spoiler"). про длинные тексты и спойлер есть правило форума 2.5.
не надо людей заставлять долго прокручивать экран. кто захочет почитать, откроет спойлер.
во-вторых, такую длинную "портянку" следует прятать в тег спойлер ("spoiler"). про длинные тексты и спойлер есть правило форума 2.5.
не надо людей заставлять долго прокручивать экран. кто захочет почитать, откроет спойлер.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Re: Работа TWI по двум датчикам LM75
Буду иметь ввиду, спасибо.
Re: Работа TWI по двум датчикам LM75
Задержка выполнена неправильно. Как вариант, при котором студия показывает примерно правильное значение задержки

Код: Выделить всё
; Задержка в 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
Спойлер
Re: Работа TWI по двум датчикам LM75
Задержки для дисплея проверял в отладчике, они примерно верные. А эта последняя скорей всего вообще не нужна, там что-то налепил, потом поправлю, спасибо. Этот код, как было выше замечено, нужно приводить в правильный вид. В обработчике, наверное, нельзя делать такой кирпич, тем более пытаться в нëм делать опрос нескольких слейвов. Это просто для сведения начинающих, кто как и я попал в просак с неправильным пониманием даташита.