18.12.2009, 16:48
|
|
Прохожий
Регистрация: 01.12.2009
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
i2c debugger в proteus
подскажите, как пользоваться i2c дебагером в протеусе, не могу разобраться
|
|
|
|
18.12.2009, 17:15
|
|
Вид на жительство
Регистрация: 15.03.2005
Сообщений: 351
Сказал спасибо: 17
Сказали Спасибо 8 раз(а) в 8 сообщении(ях)
|
Re: i2c debugger в proteus
подключай и пользуй
"ну тупыыыее" (С) задорнов
|
|
|
|
18.12.2009, 17:53
|
|
Прохожий
Регистрация: 01.12.2009
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: i2c debugger в proteus
во-первых, где мне установить адрес, если я в свойствах в пункте Address byte 1 устанавливаю адрес 1101000 пишет, что значение должно быть до 255, не понятно (
во-вторых как мне задать сами данные (полезную нагрузку) в посылаемой последовательности
в-третьих, чем окно Queued отличается от Predefined
я новичок, помогите
|
|
|
|
18.12.2009, 19:00
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: i2c debugger в proteus
схему нам!
вообще им проще пользоваться, как наблюдателем. Сразу видно, куда что течет. В i2c главное не упустить момент, когда надо дать сигнал "принято" ack. А то цепочка рвется.
|
|
|
|
18.12.2009, 22:44
|
|
Прохожий
Регистрация: 01.12.2009
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: i2c debugger в proteus
прошу прощения за оформление
вот написала какой-то скелет программы, естестно что там не работает скорее всего многое, но надо же как-то отлаживать
не знаю что я не так делаю, но i2c дебагер ничего не показывает, ну наверное хотя бы потому, что я должна где-то указать адрес ведомого и не знаю как это сделать
скажите что я не так делаю, только помидорами не бросайте
Код:
|
LIST p=16C77
include ‹p16c77.inc›
TRUE equ 1
FALSE equ 0
#define _SDA PORTC, 5
#define _SCL PORTC, 4
#define _DATA SSPBUF
_SAD equ b'1101000' ;адрес ведомого устройства
_SADw equ b'11010000' ;SAD+w
_SADr equ b'11010001' ;SAD+r
_SUBh equ 28h ;SUB - адрес регистра, из которого получаем старший байт данных дынные
_SUBl equ 29h ;SUB - адрес регистра, из которого получаем младший байт данных дынные
CBLOCK 20h ;блок констант
data_temp ; временное хранилище для данных
cnt ; счетчик
temp_w ; сюда сохраняем аккумулятор по переходу в процедуры
gh_data_h
gh_data_l
ENDC
org 0x00
goto start
;
org 0x04 ; уход в прерывание
nop
retfie ; возврат по стеку
start:
i2c_init:
bcf STATUS, RP0 ; 0 банк
movlw b'00001011'
movwf SSPCON ; программная поддержка ведущего режима i2c
;bcf STATUS, RP0 ; 0 банк
clrf PORTC
bsf STATUS, RP0 ; 1 банк
movlw b'0001100' ; настроить SDA и SCL на вход ( в соответствии с даташитом)
movwf TRISC
;movlw b'0000100' ; настроить SDA на вход, SCL всегда настроен на выход
;movwf TRISC
bcf STATUS, RP0 ; 0 банк
bsf SSPCON, 5 ; initialize SSP module ( SSPEN = 1 )
bsf STATUS, RP0 ; 1 банк
movlw _SAD
movwf SSPADD
;movf _SAD, SSPADD ; устанавиваем адрес ведомого устройства (последняя 1 - read)
cycle:
;bcf STATUS, RP0 ; 0 банк
movwf temp_w
call i2c_send_start
movlw _SADw
movwf _DATA
;movf _SADw, _DATA
call i2c_send_byte
call i2c_wait_ask
btfsc _SDA
goto cycle ; подтверждение отсутствует, пробуем снова
movlw _SUBl
movwf _DATA
;movf _SUBl, _DATA ; подтверждение пришло - передаем адрем регистра
call i2c_wait_ask ; ждем подтверждение
btfsc _SDA
goto cycle ; подтверждение отсутствует, пробуем снова
call i2c_send_repstart ; подтверждение есть - передаем повторный старт
movlw _SADr
movwf _DATA
;movf _SADr, _DATA
call i2c_send_byte
call i2c_wait_ask
btfsc _SDA
goto cycle ; подтверждение отсутствует, пробуем снова
call i2c_receive_byte ; подтверждение пришло - принимаем данные
is_bf:
btfss SSPSTAT, BF ; завершен ли прием?
goto is_bf ; не завершен - ждем
call i2c_send_stop ; прием завершен, посылаем stop
goto cycle
goto start
;---------------------------------
;----- Low level subprograms -----
;---------------------------------
i2c_delay: ;40 usec
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
return
i2c_send_repstart:
bsf STATUS, RP0 ; 1 банк
movlw b'0000000' ; настроить SDA на выход (5)
movwf TRISC
bsf _SCL ; SCL - high
bcf _SDA ; SDA - low
bsf _SDA ; SDA - high
;call i2c_delay
bcf _SDA ; SDA - low
;call i2c_delay
bcf _SCL ; SCL - low
bcf STATUS, RP0 ; 0 банк
return
i2c_send_start:
bsf STATUS, RP0 ; 1 банк
movlw b'0000000' ; настроить SDA на выход (5)
movwf TRISC
bsf _SDA ; SDA - high
bsf _SCL ; SCL - high
;call i2c_delay
bcf _SDA ; SDA - low
;call i2c_delay
bcf _SCL ; SCL - low
bcf STATUS, RP0 ; 0 банк
return
i2c_send_stop:
bsf STATUS, RP0 ; 1 банк
movlw b'0000000' ; настроить SDA на выход (5)
movwf TRISC
bsf _SCL ; SCL - high
bcf _SDA ; SDA - low
;call i2c_delay
bsf _SDA ; SDA - high
;call i2c_delay
bcf _SCL ; SCL - low
bcf STATUS, RP0 ; 0 банк
return
; посылка байта
; значение DATA (посылаемый байт) должно быть предварительно установлено
i2c_send_byte:
bsf STATUS, RP0 ; 1 банк
movlw b'0000000' ; настроить SDA на выход (5)
movwf TRISC
movlw _DATA
movwf data_temp
;movf _DATA, data_temp ; из регистра данных в регистр temp
movlw 0x8 ; устанваливаем счетчик битов
movwf cnt
i2c_send_bit:
bcf _SDA ; SDA - low
rlf data_temp, 1 ; сдвиг влево через перенос
btfsc STATUS, C ; если флаг переноса 0, то пропускаем перепад
bsf _SDA ; SDA - high
bsf _SCL ; SCL - high - конец передачи бита - перепад уровней
bcf _SCL ; SCL - low
decfsz cnt,1 ; декремент счетчика битов
goto i2c_send_bit
return
i2c_if_bus_empty:
return
; ожидаем asknowlegment от приемника
; если SDA - high, подтверждение отсутствует и наверное надо снова попробовать передать данные
i2c_wait_ask:
bsf STATUS, RP0 ; 1 банк
movlw b'0000100' ; SDA на вход (5)
movwf TRISC
bsf _SCL ; SCL - high - готов принять подтверждение
return
; принимаем байт
i2c_receive_byte:
bsf STATUS, RP0 ; 1 банк
movlw b'0000000' ; настроить SDA на выход (5)
movwf TRISC
bcf _SDA ; SDA - low - готовы принимать данные
bcf _SCL ; SCL - low - готовы принимать данные
return
end |
|
|
|
|
18.12.2009, 23:24
|
|
Частый гость
Регистрация: 31.07.2009
Сообщений: 23
Сказал спасибо: 1
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: i2c debugger в proteus
выкладываю свой небольшой пример применения i2c debugger. Тоже когда-то писал тупую тестовую программку, чтобы чисто протестить I2C в протеусе. В данном проекте в протеусе контроллер AT90S2313 выполняет следующую последовательность действий: 1) старт, 2) слейв-адрес + W, 3) отправляет один байт данных 4) отправляет стоп-состояние на периферийный регистр PCF8574; 5) отправляет рестарт, 6) отправляет слейв-адрес + R, 7) принимает 2 байта данных с этого регистра, 8 ) отправляет стоп-состояние. Шина I2C в данном случае также реализована программно.
Может быть чем-то поможет... Удачи!
Последний раз редактировалось Alexey_sevast; 18.12.2009 в 23:47.
Причина: Грубая ошибка при описании программы!
|
|
|
|
19.12.2009, 19:26
|
|
Супер-модератор
Регистрация: 03.05.2007
Сообщений: 2,695
Сказал спасибо: 28
Сказали Спасибо 4,509 раз(а) в 956 сообщении(ях)
|
Re: i2c debugger в proteus
Так, похоже грядет "зимняя сессия" и очередная миграция перелетных ласточек. (Не в обиду! Это так, типа предсказание Вольфа Мессинга).
Мисс caffy - к Вам это не относится, дамы у нас здесь пользуются особым вниманием и положением. Просто маленькое замечание не по теме. Все вопросы, связанные с Протеусом обсуждаются в специально отведенном для этого подфоруме (картинка покажет где).
Что касается Выложенного Вами кода, то на досуге посмотрим, но бегло видно, что процедуры I2C взяты из "стандартного" кода, давно блуждающего в Интернете. Он работает в железе, но для симуляторов типа Протеуса там есть один камень прекновения - временные параметры смены сигналов. Поэтому куча "горчичников", и сбои встроенного дебаггера I2C гарантированы, поскольку любой программный дебаггер строго следует заданным параметрам, как правило стандартным для протокола, а здесь слегка нарушенным. Я когда то пытался подогнать этот вариант под Протеус, но потом забросил, со свободным временем куча проблем.
Последний раз редактировалось Halex07; 20.12.2009 в 10:17.
|
|
|
|
21.12.2009, 16:55
|
|
Прохожий
Регистрация: 01.12.2009
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: i2c debugger в proteus
Цитата:
|
все вопросы, связанные с Протеусом обсуждаются в специально отведенном для этого подфоруме
|
сорри
спасибо за попытку помочь, проблема решилась включением подтягивающих резисторов, в смысле i2c дебаггер хотя бы начал реагировать
Цитата:
|
камень прекновения - временные параметры смены сигналов
|
в даташите указано, что в pic16 есть фильтр, который контролирует длительность импульсов вне зависимости от частоты микроконтроллера, пока не знаю, может придется задержки выставить
Цитата:
|
процедуры I2C взяты из "стандартного" кода, давно блуждающего в Интернете
|
код я писала сама (некоторые мометнты взяты из разных источников) на обум без отладки и естественно он не рабочий, ни в коем случае его не стоит копать! я выложила для полноты описания
|
|
|
|
12.10.2010, 12:20
|
|
Частый гость
Регистрация: 12.10.2010
Сообщений: 14
Сказал спасибо: 2
Сказали Спасибо 2 раз(а) в 1 сообщении
|
Re: i2c debugger в proteus
А можно ли уточнить для чего вывод TRIG ? на дебагере I2C
|
|
|
|
21.06.2011, 12:14
|
|
Частый гость
Регистрация: 01.03.2009
Сообщений: 23
Сказал спасибо: 11
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Re: i2c debugger в proteus
Скажите, а есть ли компонент для Proteus-а, который мог бы симулировать работу ну практически любого I2C устройства, тоесть в нем была бы возможность настраивать адресс, геристры, задержки и т.д.. Вот я счас мучаюсь с таким светосенсором как MAX9635 и приходится париться с перепрошивкой каждый раз. А хотелось бы попроще и с меньшим гемором.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 07:43.
|
|