|
Проблема с TWI |
|
|
|
Nov 4 2005, 17:14
|

Местный
  
Группа: Участник
Сообщений: 315
Регистрация: 10-10-05
Пользователь №: 9 466

|
Соединил 3 МК по TWI - Master передает данные на Slave 1, потом на Slave 2 (поочередно, друг за другом). Два из них общаются нормально (односторонняя передача от Master к Slave 1), а как только нужно передать от Master к Slave 2, один раз передача проходит и все зависает. Судя по всему, после этого не получается передать данные на Slave 1. В конце каждой передачи Master осуществляет условие STOP STOP: ldi temp,(1<<TWINT)|(1<<TWSTO)|(1<<TWEN) out TWCR,temp, а Slave 1/2, после приема переданных байт, просто переходят к дальнейшему выполнению основной программы, т.е. никаких стоповых функций нет. Должны ли они как-то обрабатывать функцию STOP?
Можно ли в режиме "slave приемник" узнать какой адрес передал "master передатчик", т.е. к кому в данный момент он обращается? Появляется ли этот адрес в TWDR?
Как правильно обратиться к конкретному "slave приемнику", чтобы второй "slave приемник" на вызов не реагировал?
|
|
|
|
|
 |
Ответов
(180 - 194)
|
Dec 30 2005, 19:05
|

Участник

Группа: Участник
Сообщений: 65
Регистрация: 28-12-05
Из: Odessa
Пользователь №: 12 673

|
Цитата(bodja74 @ Dec 30 2005, 21:02)  1 А я не вижу радости в программном TWI.Тоже делал,тоже прошел. 2 Не вижу кода для слейва. 3 Код для мастера обсуждался и работает и куда коротче вашего,при таком раскладе. 4 Преимужества?Как насчет возможности использовать мастер по прерыванию и разгрузить основной проц процентов на 90 ? 5 А как насчет того ,если мы захотим вцепить 2 мастера?Ваш код будет дожидаться когда освободиться шина?Или среагирует при арбитраже? Простите. Недоглядел.
|
|
|
|
|
Dec 30 2005, 21:04
|

Местный
  
Группа: Участник
Сообщений: 315
Регистрация: 10-10-05
Пользователь №: 9 466

|
Новый вариант слейв2: Код TWI_Obr:in temp,TWSR cpi temp,$60;Проверка принятого адреса от мастера breq Address cpi temp,$80;Прием данных breq DataR
cpi temp,$A8;Передача данных breq DataT1 cpi temp,$B0; breq DataT1 cpi temp,$B8; breq DataT2
ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE) out TWCR,temp reti
;******* Address:ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE) out TWCR,temp reti
;Прием данных:
DataR: in Byte_1,TWDR ;Прием: Byte_1 rcall TW_NT_n ;Прием: Byte_2 in Byte_2,TWDR
rjmp STOP_n
;******************************************************************* TW_NT_n:ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN) out TWCR,temp
wait2n: in temp,TWCR ;Ожидаем ответа от мастера sbrs temp,TWINT rjmp wait2n
ret
;******************************************************************* ;Все данные приняты - STOP (линия приема/передачи переходит в высокоимпедансное состояние)
STOP_n: ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE) out TWCR,temp reti
;*******************************************************************
;Передача данных:
DataT1: out TWDR,Byte_1 ;Отправка: Byte_1 rcall Write
ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE) out TWCR,temp reti
DataT2: out TWDR,Byte_2 ;Отправка: Byte_2 rcall Write out TWDR,Byte_3 ;Отправка: Byte_3 rcall Write out TWDR,Byte_4 ;Отправка: Byte_4 rcall Write out TWDR,Byte_5 ;Отправка: Byte_5 rcall Write out TWDR,Byte_6 ;Отправка: Byte_6 rcall Write
rjmp STOP_n ;******************************************************************* Write: ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN) out TWCR,temp
wait3n: in temp,TWCR;Ожидаем ответа от мастера sbrs temp,TWINT rjmp wait3n
ret
;******************************************************************* Код мастера для передачи/приема на слейв2: Код ;************************* ;Передача на слейв2: ;*************************
ldi temp,$14;Установка скорости передачи= 71429 Hz out TWBR,temp ldi temp,$00 out TWSR,temp
Pusk_Sr:ldi temp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN) out TWCR,temp;Посылка сигнала "START"
wait1r: in temp,TWCR;Ожидаем ответа интерфейса sbrs temp,TWINT rjmp wait1r
SLA_Wr: ldi temp,$40;Загрузка адреса слейв2 + "WRITE" out TWDR,temp ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN) out TWCR,temp
wait2r: in temp,TWCR;Ожидаем ответа от слейв2 sbrs temp,TWINT rjmp wait2r
;Начинаем передавать данные:
DATA_r: out TWDR,Byte_1 ;Отправка: Byte_1 rcall Writer out TWDR,Byte_2 ;Отправка: Byte_2 rcall Writer rjmp STOP_r ;Передача данных завершена
;******************************************************************* Writer: ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN) out TWCR,temp
wait3r: in temp,TWCR;Ожидаем ответа от слейв2 sbrs temp,TWINT rjmp wait3r
ret ;******************************************************************* ;Все данные переданы - STOP (линия приема/передачи переходит в высокоимпедансное состояние)
STOP_r: ldi temp,(1<<TWINT)|(1<<TWSTO)|(1<<TWEN) out TWCR,temp
PAUSE: ldi temp,$FF;Пауза, чтобы модуль TWI смог завершить команду СТОП P_cikl: dec temp cpi temp,0 brne P_cikl
;************************* ;Прием со слейв2: ;*************************
ldi temp,$14;Установка скорости передачи= 71429 Hz out TWBR,temp ldi temp,$00 out TWSR,temp
Pusk_R: ldi temp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN) out TWCR,temp;Посылка сигнала "START"
waitT1: in temp,TWCR;Ожидаем ответа интерфейса <<< Зависает здесь <<< sbrs temp,TWINT rjmp waitT1
ldi temp,$41;Загрузка адреса слейв2 + "READ" out TWDR,temp ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN) out TWCR,temp
waitR2: in temp,TWCR;Ожидаем ответа слейв2 sbrs temp,TWINT rjmp waitR2
;******* ;Прием данных:
Data: rcall TW_NT_R ;Прием: Byte_1 in temp,TWDR sts Byte_1,temp rcall TW_NT_R ;Прием: Byte_2 in temp,TWDR sts Byte_2,temp rcall TW_NT_R ;Прием: Byte_3 in temp,TWDR sts Byte_3,temp rcall TW_NT_R ;Прием: Byte_4 in temp,TWDR sts Byte_4,temp rcall TW_NT_R ;Прием: Byte_5 in temp,TWDR sts Byte_5,temp
TWI_DATA_R_NACK: ldi temp,(1<<TWINT)|(1<<TWEN) out TWCR,temp
d2: in temp,TWCR sbrs temp,7 rjmp d2
in temp,TWDR ;Прием: Byte_6 sts Byte_6,temp
rjmp STOP_RD ;Прием данных завершен
;******************************************************************* TW_NT_R:ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN) out TWCR,temp
waitRr: in temp,TWCR ;Ожидаем ответа от слейв2 sbrs temp,TWINT rjmp waitRr
in temp,TWSR cpi temp,$50 brne STOP_RD ;Переход, если данные от слейв2 не получены
ret
;******************************************************************* STOP_RD:ldi temp,(1<<TWINT)|(1<<TWSTO)|(1<<TWEN) out TWCR,temp
PAUSE2: ldi temp,$FF;Пауза, чтобы модуль TWI смог завершить команду СТОП P_cikl2:dec temp cpi temp,$00 brne P_cikl2
;******************************************************************* Зависает в цикле waitT1...
|
|
|
|
|
Dec 31 2005, 10:47
|
Знающий
   
Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984

|
Как я и предполагал этот участок кода в слейве не работает. Код Write: ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN) out TWCR,temp
wait3n: in temp,TWCR;Ожидаем ответа от мастера sbrs temp,TWINT rjmp wait3n
ret Похоже со слейвом нужно работать только через прерывания. Так что будем делать по методе которую я предлагал раннее. Делаем да буфера по 16 байт Адресс приемного $80-$8F оперативке ,указатель регистр Х Адресс передающего $90-$F,указатель регистр Y Расположение и размер буферов можно изменить по своему усмотрению Кстати выяснил что при посылке последнего байта не обязательно указывать TWCR=$85 Вот код Код ; TWI Slave ; Specify Device. .include "m8def.inc" ; Variable Declarations .def temp = r16 .def temp_a = r17 .def adress = r18 .def data = r19
.cseg ; CODE segment.
.org 0 rjmp PROG ; origin. reti reti reti reti reti reti reti reti reti reti reti reti reti reti reti reti rjmp TWI_Finished reti PROG: ldi r16,$04 ; Initialize the stack. out SPH,r16 ldi r16,$5F out SPL,r16 ldi temp,$00 ; out TWSR,temp ldi temp,$00 ; out TWBR,temp ldi temp,$40 out TWAR,temp ldi temp,$45 out TWCR,temp ldi temp,$FF ; out DDRD,temp sei cycle: rjmp cycle
TWI_Finished: sts $0F0,temp in temp,TWSR cpi temp,$60 breq t1 in temp,TWSR cpi temp,$80 breq t2 in temp,TWSR cpi temp,$A8 breq t3 in temp,TWSR cpi temp,$B0 breq t3 in temp,TWSR ; cpi temp,$B8 breq t4 ldi temp,$C5 out TWCR,temp lds temp,$0F0 reti
t1: ldi XH,$00 ldi XL,$80 ldi temp,$C5 out TWCR,temp lds temp,$0F0 reti
t2: cpi XL,$90 breq t2_1 in temp,TWDR st X+,temp out PORTD,temp ldi temp,$C5 out TWCR,temp lds temp,$0F0 reti t2_1: in temp,TWDR st X,temp out PORTD,temp ldi temp,$C5 out TWCR,temp lds temp,$0F0 reti
t3: ldi YH,$00 ldi YL,$90 ld temp,Y+ out TWDR,temp ldi temp,$C5 out TWCR,temp lds temp,$0F0 reti
t4: cpi YL,$A0 breq t4_1 ld temp,Y+ out TWDR,temp ldi temp,$C5 out TWCR,temp lds temp,$0F0 reti t4_1: ld temp,Y out TWDR,temp ldi temp,$C5 out TWCR,temp lds temp,$0F0 reti
|
|
|
|
|
Dec 31 2005, 15:35
|

Местный
  
Группа: Участник
Сообщений: 315
Регистрация: 10-10-05
Пользователь №: 9 466

|
Нет, не получилось - мастер зависает в том же месте. Ниже привожу прогу мастера (передача на слейв1 и передача/прием на слейв2 осуществляются в пределах одного обработчика прерывания таймера (Timer/Counter2 Переполнение)). Мастер (передача 1-го байта на слейв 1): Код To_sl_1:ldi temp,$14;Установка скорости передачи= 71429 Hz out TWBR,temp ldi temp,$00 out TWSR,temp
Pusk_Sn:ldi temp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN) out TWCR,temp;Посылка сигнала "START"
wait1n: in temp,TWCR;Ожидаем ответа от интерфейса TWI sbrs temp,TWINT rjmp wait1n
SLA_Wn: ldi temp,$20;Загрузка адреса слейв1 + "WRITE" out TWDR,temp ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN) out TWCR,temp
wait2n: in temp,TWCR;Ожидаем ответа от слейв1 sbrs temp,TWINT rjmp wait2n
;Начинаем передавать данные:
DATA_n: out TWDR,Byte_1 ;Отправка: Byte 1 rcall Writen
rjmp STOP_n ;Передача данных завершена
;******************************************************************* Writen: ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN) out TWCR,temp
wait3n: in temp,TWCR;Ожидаем ответа от слейв1 sbrs temp,TWINT rjmp wait3n
ret ;******************************************************************* ;Все данные переданы - STOP (линия приема/передачи переходит в высокоимпедансное состояние)
STOP_n: ldi temp,(1<<TWINT)|(1<<TWSTO)|(1<<TWEN) out TWCR,temp
PAUSE_n:ldi temp,$40 p: dec temp cpi temp,$00 brne p ;******************************************************************* После этого идет дальнейшее выполнение программы обработчика таймера. Далее: Мастер (передача 1-го байта на слейв2, и прием со слейв2 3-х байт): Код ;************************* ;Передача на слейв 2: ;*************************
ldi temp,$14;Установка скорости передачи= 71429 Hz out TWBR,temp ldi temp,$00 out TWSR,temp
Pusk_Sr:ldi temp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN) out TWCR,temp;Посылка сигнала "START"
wait1r: in temp,TWCR;Ожидаем ответа интерфейса sbrs temp,TWINT rjmp wait1r
SLA_Wr: ldi temp,$40;Загрузка адреса слейв 2 + "WRITE" out TWDR,temp ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN) out TWCR,temp
wait2r: in temp,TWCR;Ожидаем ответа от слейв 2 sbrs temp,TWINT rjmp wait2r
;Начинаем передавать данные:
DATA_r: out TWDR,Byte_1 ;Отправка: Byte 1 rcall Writer
rjmp STOP_r ;Передача данных завершена
;******************************************************************* Writer: ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN) out TWCR,temp
wait3r: in temp,TWCR;Ожидаем ответа от слейв 2 sbrs temp,TWINT rjmp wait3r
ret ;******************************************************************* ;Все данные переданы - STOP (линия приема/передачи переходит в высокоимпедансное состояние)
STOP_r: ldi temp,(1<<TWINT)|(1<<TWSTO)|(1<<TWEN) out TWCR,temp
PAUSE: ldi temp,$FF;Пауза, чтобы модуль TWI смог завершить команду СТОП
P_cikl: dec temp cpi temp,0 brne P_cikl
;Прием данных:
ldi temp,$14;Установка скорости передачи= 71429 Hz out TWBR,temp ldi temp,$00 out TWSR,temp
Pusk_R: ldi temp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN) out TWCR,temp;Посылка сигнала "START"
waitT1: in temp,TWCR;Ожидаем ответа интерфейса sbrs temp,TWINT rjmp waitT1
ldi temp,$41;Загрузка адреса слейв 2 + "READ" out TWDR,temp ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN) out TWCR,temp
waitR2: in temp,TWCR;Ожидаем ответа слейв 2 sbrs temp,TWINT rjmp waitR2
;******* ;Прием данных:
Data: rcall TW_NT_R ;Прием: Byte 1 in temp,TWDR sts Byte_1,temp rcall TW_NT_R ;Прием: Byte 2 in temp,TWDR sts Byte_2,temp
TWI_DATA_R_NACK: ldi temp,(1<<TWINT)|(1<<TWEN) out TWCR,temp d2: in temp,TWCR sbrs temp,7 rjmp d2 in temp,TWDR ;Прием: Byte 3 sts Byte_3,temp
rjmp STOP_RD ;Прием данных завершен
;******************************************************************* TW_NT_R:ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN) out TWCR,temp
waitRr: in temp,TWCR ;Ожидаем ответа от слейв 2 sbrs temp,TWINT rjmp waitRr
in temp,TWSR cpi temp,$50 brne STOP_RD ;Переход, если данные от слейв 2 не получены
ret
;******************************************************************* STOP_RD:ldi temp,(1<<TWINT)|(1<<TWSTO)|(1<<TWEN) out TWCR,temp
PAUSE2: ldi temp,$FF;Пауза, чтобы модуль TWI смог завершить команду СТОП
P_cikl2:dec temp cpi temp,$00 brne P_cikl2
;******************************************************************* Прога слейв1 (прием 1-го байта): Код ;******************************************************************* ;Режим - подчиненный-приемник:
TWI_Obr:in temp,TWSR cpi temp,$60;Проверка принятого адреса от мастера breq Address cpi temp,$80;Прием данных breq Data cpi temp,$00; breq Sob_00 cpi temp,$F8; breq Sob_F8
ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE) out TWCR,temp
reti
;***************************************************
Sob_00: ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWSTO)|(1<<TWEN)|(1<<TWIE) out TWCR,temp reti
Sob_F8: reti
;******* Address:ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE) out TWCR,temp reti
;******* ;Прием данных:
Data: in Byte_1,TWDR ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE) out TWCR,temp reti
;******************************************************************* Прога слейв2 (прием 1-го байта и передача 3-х байт мастеру): Код ;******************************************************************* ;Режим - подчиненный-приемник/передатчик:
TWI_Obr:in temp,TWSR cpi temp,$60;Проверка принятого адреса от мастера breq Address cpi temp,$80;Прием данных breq DataR
cpi temp,$A8;Передача данных breq DataT1 cpi temp,$B0; breq DataT1 cpi temp,$B8; breq DataT2
ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE) out TWCR,temp reti
;******* Address:ldi XH,$00 ldi XL,$80 ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE) out TWCR,temp reti
;************************* ;Прием от мастера: ;************************* ;Прием данных:
DataR: cpi XL,$90 breq DataR_2 in temp,TWDR st X+,temp ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE) out TWCR,temp reti
DataR_2:in temp,TWDR st X,temp ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE) out TWCR,temp reti
;************************* ;Передача мастеру: ;************************* ;Передача данных:
DataT1: ldi YH,$00 ldi YL,$90 ld temp,Y+ out TWDR,temp ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE) out TWCR,temp reti
DataT2: cpi YL,$A0 breq t4_1 ld temp,Y+ out TWDR,temp ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE) out TWCR,temp reti
t4_1: ld temp,Y out TWDR,temp ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE) out TWCR,temp reti
;*******************************************************************
|
|
|
|
|
Jan 2 2006, 09:36
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(bodja74 @ Dec 31 2005, 12:47)  Как я и предполагал этот участок кода в слейве не работает. Вот код Код ; TWI Slave ... sei cycle: rjmp cycle
TWI_Finished: sts $0F0,temp ... lds temp,$0F0 reti Скажите, а какой глубокий смысл (разумеется если он есть) в выделенном фрагменте? Для чего требуется сохранять temp по фиксированному адресу? Имеется ведь стек (команды push/pop), и самое главное если что и требует сохранения в реальной программе, так это в первую очередь SREG, почему же вы его не сохраняете?
|
|
|
|
|
Jan 2 2006, 15:07
|
Знающий
   
Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984

|
Цитата(defunct @ Jan 2 2006, 12:36)  Скажите, а какой глубокий смысл (разумеется если он есть) в выделенном фрагменте? Для чего требуется сохранять temp по фиксированному адресу? Имеется ведь стек (команды push/pop), и самое главное если что и требует сохранения в реальной программе, так это в первую очередь SREG, почему же вы его не сохраняете? Никакого смысла сохранения temp в предоставленном коде нет. Я в этом цикле cycle: rjmp cycle присваивал для тестирования разные значения для отправки и использовал соответственно temp.Поэтому сохранял-востанавливал в подпрограмме. Стек естественно имеется,но я его стараюсь не трогать и оставлять за ним право сохранять вектора возвратов из подпрограмм. Стараюсь хранить переменные в оперативке.Так конкретно известно где какая переменная находиться.Но это все больше относиться к стилю написания программ. SREG естественно стоит сохранять и не только его но и регистры X,Y,temp и другие если будут использоваться в подпрограмме. Посмотрите внимательно на мой код,и скажите нужно ли сийчас все это? На данном этапе необходимо получить-отправить пару байтов от пары слейвов и убедиться в работоспособности. Потом естественно все это можно улучшать и вылизывать. Я уже об этом неоднократно говорил.И не устраиваю здесь "показательные выступления" своего кода. Теперь James D. Цитата А проверяете в симуляторе? В каком? Я пользуюсь только AVRStudio. Вот проверить бы это все хозяйство через JTAG! Совсем другое дело... Я работаю на ПРОТЕУСЕ,ИМХО самое лучшее что я когда либо встречал. Проверяю не только на симуляторе,но и на макетке. Правда на макетке у меня только два МК ,слейв и мастер. В случае с двумя слейвами проверяю на ПРОТЕУСЕ,но то что я делал на нем ,было без проблем и по жизни . Предоставленные кода рабочие и если вы добавляете что то свое, будте внимательны. Нужно предусматривать сохранение-востановление регистров и установку масок если используються несколько прерываний и время на обработку прерывания и т.д. и т.п. Всего я предусмотреть за Вас я не могу, во многом это зависит от Вас и вашей программы.
|
|
|
|
|
Jan 3 2006, 06:05
|

Местный
  
Группа: Участник
Сообщений: 315
Регистрация: 10-10-05
Пользователь №: 9 466

|
Если кода рабочие, а у меня на макетке не работает, то что же делать? Можно ли в ПРОТЕУСЕ моделировать более двух МК? Я, наверное, скачаю ПРОТЕУС (где-то на этом форуме встречал ссылку), и попробую. Прога, случайно, не на русском? Хотя, если честно, эти симуляторы, что-то не внушают мне доверия... ИМХО... Переубедите.
|
|
|
|
|
Jan 3 2006, 11:51
|
Знающий
   
Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984

|
Ну как не работает на макетке ?У меня же работает. Посмотрите инициализацию стека,правильно ли указали вектор прерывания. В меге32 они могут быть по другому расположены(не смотрел)Все делал под мегу8 Поставте еще паузу у мастера перед инициализацией,возможнослейв позже стартует после включения питания
ПРОТЕУС мною ценится не только из из за симулятора,может многие упускают ,но это по факту среда разработки. На нем можно писать программы,составлять проверять на симуляторе принципиальные схемы и экспортировать их в графические форматы со списками элементов,на месте развести печатку с автотрассировкой и вручную,поддерживает не только AVR но и PIC ,МОТОРОЛА,80с51,80с52 и другие,на все это есть компиллеры. Кроме того запустить симулятор можно не только с исходника но и с прошивки+МНОГО,МНОГО одновремено симулируемых контроллеров.(лично проверял пять,больше не нужно было)
Коротче с этой проге можно полностью собрать весь проект со всей необходимой документацией. А это все весьма удобно.
Естествено не забываю и про макетку,с этого начинал,правда теперь уже прошиваю реже так как оперативно можно проверить ПРОТЕУСОМ.
Petka Ну Вы мне скажите зачем слейву проверять промежуточное значение F8,если оно имеет место когда TWIN=0, а если TWIN=0 то и прерывания нет ,а если пошло то F8 там и не пахнет. Тоже и по $00 ,если ошибка на шине слейв ничего не определит,а если определит он все равно не сможет ничего сделать. Если эти проверки нужны то только для мастера,он заведует шиной и решает что с ней делать.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|