Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
23.04.2009, 15:36
|
|
Прописка
Регистрация: 29.09.2007
Адрес: Донецк, ????
Сообщений: 199
Сказал спасибо: 21
Сказали Спасибо 19 раз(а) в 15 сообщении(ях)
|
Проблема с 24C16->I2C->PIC16F630 need help!
Что уже только не перепробовал, совсем мозк поломал
ни в какую PIC не хочет читать 24C16
(точнее читает или нули, или произвольные данные, но только не то, что нужно, хотя вроде все в соответствии с даташитом делаю)
Подскажите плиз, что не так...
Код:
|
#define SCL_PIN PORTA,0x4 ; SCL
#define SDA_PIN PORTA,0x5 ; SDA
#define SDA_SET TRISA,0x5 ; SDA - ввод/вывод
#define SCL_SET TRISA,0x4 ; SCL - ввод/вывод
-----------------------//----------------------------
i2c_init
bsf STATUS,RP0 ;bank1
bcf SDA_SET ;SDA - сначала на вывод данных
bcf SCL_SET ;SCL - тоже
bcf STATUS,RP0 ; set file register bank to 0
bsf SCL_PIN ;SCL - высокий уровень
bsf SDA_PIN
bcf SDA_PIN ;инициируем нисходящий фронт
return;
i2c_close
bsf STATUS,RP0 ;bank1
bcf SDA_SET ;SDA - сначала на вывод данных
bcf STATUS,RP0 ;bank 0
bcf SDA_PIN
bsf SDA_PIN ;инициируем восходящий фронт
return;
i2c_send_byte
bsf STATUS,RP0 ;bank1
bcf SDA_SET ; SDA - вывод
bcf SCL_SET ;SCL - тоже
bcf STATUS,RP0 ;bank 0
bcf SCL_PIN ; SCL - 0
movlw 0x08
movwf i2c_tmp
send_bit btfsc i2c_byte,7 ; бит данных - 0?
bsf SDA_PIN ; нет,выводим 1 на SDA
bsf SCL_PIN ; SCL - 1
rlf i2c_byte,1 ; сдвигаем влево байт данных
bcf SCL_PIN ; SCL - 0
bcf SDA_PIN ; выводим 0 на SDA
decfsz i2c_tmp,1 ; конец цикла ?
goto send_bit ; нет - переход
bsf STATUS,RP0 ;bank1
bsf SDA_SET ; SDA - ввод
bcf STATUS,RP0 ;bank 0
bsf SCL_PIN ; SCL - 1, получаем ACK-бит и игнорируем его (!)
btfsc SDA_PIN ; читаем АСК, и идем дальше
nop ; или что нить делаем...
bcf SCL_PIN ; SCL - 0
return;
;************************************************* *********************
; I2c_read
; считывание 8 бит с шины
;
i2c_read_byte
bsf STATUS,RP0 ;bank1
bsf SDA_SET ;SDA - на ввод
bcf SCL_SET ;SCL - вывод
bcf STATUS,RP0 ;bank 0
bcf SCL_PIN ;SCL - на 0
movlw 0x08
movwf i2c_tmp
read_bit rlf i2c_byte,1 ; сдвигаем байт влево
bcf i2c_byte,0 ; устанавливаем бит в 0
bsf SCL_PIN ; SCL - 1
btfsc SDA_PIN ; SDA - 0?
bsf i2c_byte,0 ; нет - устанавливаем бит в 1
bcf SCL_PIN ; SCL - 0
decfsz i2c_tmp,1 ; конец цикла ?
goto read_bit ; нет - переход
bsf STATUS,RP0 ;bank1
bcf SDA_SET ; SDA - вывод для АСК
bcf STATUS,RP0 ;bank 0
bcf SDA_PIN ; выдаем АСК
bsf SCL_PIN ; SCL - 1, получаем ACK-бит и игнорируем его (!)
bcf SCL_PIN ; SCL - 0
bsf STATUS,RP0 ;bank1
bsf SDA_SET ; SDA - ввод
return;
;************************************************* *********************
; Read_i2c
;
Read_i2c
call i2c_init ;
bcf STATUS,RP0 ;bank 0
movlw 0xA0
movwf i2c_byte
call i2c_send_byte ;send DEV_SEL - write
bcf STATUS,RP0 ;bank 0
movf ADDR_LO,0 ;0x00 на примере
movwf i2c_byte ; младший байт адреса памяти
call i2c_send_byte ; send byte address
call i2c_init ;
bcf STATUS,RP0 ;bank 0
movlw 0xA1 ;/ control байт с битом RD
movwf i2c_byte
call i2c_send_byte ; send DEV_SEL 2 - read
call i2c_read_byte ;
call i2c_close
return; |
|
|
|
|
23.04.2009, 17:28
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.08.2007
Адрес: Болгария Перник
Сообщений: 1,771
Сказал спасибо: 74
Сказали Спасибо 357 раз(а) в 245 сообщении(ях)
|
Пример от МикроБейсика
Код:
|
Library Example
This code demonstrates use of I2C Library procedures and functions. PIC MCU is connected (pins SCL and SDA) to 24c02 EEPROM. Program sends data to EEPROM (data is written at address 2). Then, we read data via IІC from EEPROM and send its value to PORTD, to check if the cycle was successful. The figure below shows how to interface 24c02 to PIC.
program Eeprom_Test
dim EE_adr, EE_data, k as byte
dim jj as word
main:
I2C_Init(100000) ' Initialize full master mode
TRISD = 0 ' PORTD is output
PORTD = $FF ' Initialize PORTD
I2C_Start ' Issue I2C start signal
I2C_Wr($A2) ' Send byte via I2C(command to 24cO2)
EE_adr = 2
I2C_Wr(EE_adr) ' Send byte(address for EEPROM)
EE_data = $AA
I2C_Wr(EE_data) ' Send data(data that will be written)
I2C_Stop ' Issue I2C stop signal
' Pause while EEPROM writes data
for jj = 0 to 65500
nop
next jj
I2C_Start ' Issue I2C start signal
I2C_Wr($A2) ' Send byte via I2C
EE_adr = 2
I2C_Wr(EE_adr) ' Send byte(address for EEPROM)
I2C_Repeated_Start ' Issue I2C signal repeated start
I2C_Wr($A3) ' Send byte (request data from EEPROM)
k = I2C_Rd(1) ' Read the data
I2C_Stop ' Issue I2C stop signal
PORTD = k ' Show data on PORTD
' Endless loop
while true
nop
wend
end. |
Почти рабочий, только надо запрещать перерывания при работе с шиной и проверять закончилась ли прежняя транзакция прежде начать новую. ИМХО
|
|
|
|
24.04.2009, 17:07
|
|
Прописка
Регистрация: 29.09.2007
Адрес: Донецк, ????
Сообщений: 199
Сказал спасибо: 21
Сказали Спасибо 19 раз(а) в 15 сообщении(ях)
|
I2C
Спасибо за помощь, но увы, надо для ASM-а
Продолжаю пробовать и ковырять
|
|
|
|
24.04.2009, 17:34
|
|
Супер-модератор
Регистрация: 15.10.2007
Сообщений: 3,539
Сказал спасибо: 172
Сказали Спасибо 1,561 раз(а) в 811 сообщении(ях)
|
Я смотрю у вас нет задержки. Максимальная частота для I2C в 24С16 100 kHz. Какая тактовая частота контроллера? Не пробовали, в соответствии со спецификацией I2C, иммитировать открытый коллектор (дергать только биты TRIS, защелки выводов обнулены), линии подтянуты к Vdd?
|
|
|
|
24.04.2009, 18:08
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
tolyanv8 поищи на форуме,где то я делал мучился на ассамблере код под i2c,если не сможеш найти посмотрю у себя.
|
|
|
|
24.04.2009, 18:36
|
|
Прописка
Регистрация: 29.09.2007
Адрес: Донецк, ????
Сообщений: 199
Сказал спасибо: 21
Сказали Спасибо 19 раз(а) в 15 сообщении(ях)
|
Для realid -
попробовал с задержкой - вот так-
Код:
|
i2c_send_byte
bsf STATUS,RP0 ;bank1
bcf SDA_SET ; SDA - вывод
bcf SCL_SET ;SCL - тоже
bcf STATUS,RP0 ;bank 0
bcf SCL_PIN ; SCL - 0
movlw 0x08
movwf i2c_tmp
send_bit btfsc i2c_byte,7 ; бит данных - 0?
bsf SDA_PIN ; нет,выводим 1 на SDA
get_scl_write bsf SCL_PIN ; SCL - 1
btfss SCL_PIN ; ожидаем подтверждения SCL!!!
goto get_scl_write
rlf i2c_byte,1 ; сдвигаем влево байт данных
bcf SCL_PIN ; SCL - 0
bcf SDA_PIN ; выводим 0 на SDA
decfsz i2c_tmp,1 ; конец цикла ?
goto send_bit ; нет - переход
bsf STATUS,RP0 ;bank1
bsf SDA_SET ; SDA - ввод
bcf STATUS,RP0 ;bank 0
get_scl_ack bsf SCL_PIN ; SCL - 1, получаем ACK-бит и игнорируем его (!)
; btfss SCL_PIN ; ожидаем подтверждения SCL!!!
; goto get_scl_ack
get_ack btfsc SDA_PIN ; читаем АСК, и идем дальше
goto get_ack ; или что нить делаем... (т.е. ожидаем подтверждения ACK :)
bcf SCL_PIN ; SCL - 0
return;
;************************************************* *********************
; I2c_read
; считывание 8 бит с шины
;
i2c_read_byte
bsf STATUS,RP0 ;bank1
bsf SDA_SET ;SDA - на ввод
bcf SCL_SET ;SCL - вывод
bcf STATUS,RP0 ;bank 0
bcf SCL_PIN ;SCL - на 0
movlw 0x08
movwf i2c_tmp
read_bit rlf i2c_byte,1 ; сдвигаем байт влево
bcf i2c_byte,0 ; устанавливаем бит в 0
set_scl bsf SCL_PIN ; SCL - 1
btfss SCL_PIN ; ожидание подтверждения SCL
goto set_scl
btfsc SDA_PIN ; SDA - 0?
bsf i2c_byte,0 ; нет - устанавливаем бит в 1
bcf SCL_PIN ; SCL - 0
decfsz i2c_tmp,1 ; конец цикла ?
goto read_bit ; нет - переход
return;
send_ack
bsf STATUS,RP0 ;bank1
bcf SDA_SET ; SDA - вывод для АСК
bcf STATUS,RP0 ;bank 0
bcf SDA_PIN ; выдаем АСК
bsf SCL_PIN ; SCL - 1, выдаем ACK-бит и игнорируем его (!)
bcf SCL_PIN ; SCL - 0
bsf STATUS,RP0 ;bank1
bsf SDA_SET ; SDA - ввод
return; |
т.е, с ожиданием подтверждения SCL - ничего
,хотя хаос перестал считываться
Насчет тактовой, - по умолчанию используется
внутренний осциллятор, по адресу 0x3FF вписана константа 37FF
|
|
|
|
24.04.2009, 22:03
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.02.2008
Адрес: Днепр. Украина
Сообщений: 3,294
Сказал спасибо: 442
Сказали Спасибо 1,048 раз(а) в 706 сообщении(ях)
|
Вот когда-то делал проект на 876 без использования аппаратного И2С. Все рабочее. Основной нюанс - задержка между последовательными операциями записи и чтения.
Прикрепленный файл: 7764728.zip
|
|
|
|
25.04.2009, 10:58
|
|
Супер-модератор
Регистрация: 15.10.2007
Сообщений: 3,539
Сказал спасибо: 172
Сказали Спасибо 1,561 раз(а) в 811 сообщении(ях)
|
tolyanv8 Подтяжка к +5 на линии SDA есть?
|
|
|
|
25.04.2009, 12:15
|
|
Прописка
Регистрация: 29.09.2007
Адрес: Донецк, ????
Сообщений: 199
Сказал спасибо: 21
Сказали Спасибо 19 раз(а) в 15 сообщении(ях)
|
Подтяжка +5V
Нет, подтяжки нет, выводы заведены прямо, но все дело в том,
что я переписываю программу для уже существующей платы, а та прошивка, которая была там до этого спокойно все читала безо всяких подтяжек
|
|
|
|
25.04.2009, 12:35
|
|
Супер-модератор
Регистрация: 15.10.2007
Сообщений: 3,539
Сказал спасибо: 172
Сказали Спасибо 1,561 раз(а) в 811 сообщении(ях)
|
Возможно в той прошивке были использованы внутренние подтяжки на выводах порта А (см. даташит). Я вообще не понимаю как у вас будет считываться линия SDA без подтяжки. Дело в том что у памяти выход SDA это открытый коллектор, он требует подтяжки линии к Vdd, если её нет, то будут считываться либо 0, либо чепуха всякая.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
PIC16F630
|
Lex_DJ |
Микроконтроллеры, АЦП, память и т.д |
39 |
06.11.2010 22:22 |
asm программирование МК PIC16F630
|
SVDimon |
Микроконтроллеры, АЦП, память и т.д |
13 |
13.12.2007 12:15 |
программирование PIC16F630
|
Lex_DJ |
Микроконтроллеры, АЦП, память и т.д |
0 |
25.05.2007 10:39 |
Проблема с I2C
|
HaZaR |
Микроконтроллеры, АЦП, память и т.д |
3 |
04.07.2005 17:10 |
I2C
|
chipic128 |
Микроконтроллеры, АЦП, память и т.д |
4 |
23.02.2005 02:19 |
Часовой пояс GMT +4, время: 01:25.
|
|