Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 23.04.2009, 15:36  
tolyanv8
Прописка
 
Аватар для tolyanv8
 
Регистрация: 29.09.2007
Адрес: Донецк, ????
Сообщений: 199
Сказал спасибо: 21
Сказали Спасибо 19 раз(а) в 15 сообщении(ях)
tolyanv8 на пути к лучшему
По умолчанию Проблема с 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;
Реклама:
tolyanv8 вне форума  
Непрочитано 23.04.2009, 17:28  
Popeye
Почётный гражданин KAZUS.RU
 
Аватар для Popeye
 
Регистрация: 05.08.2007
Адрес: Болгария Перник
Сообщений: 1,771
Сказал спасибо: 74
Сказали Спасибо 357 раз(а) в 245 сообщении(ях)
Popeye на пути к лучшему
По умолчанию

Пример от МикроБейсика
Код:
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.
Почти рабочий, только надо запрещать перерывания при работе с шиной и проверять закончилась ли прежняя транзакция прежде начать новую. ИМХО
Popeye вне форума  
Непрочитано 24.04.2009, 17:07  
tolyanv8
Прописка
 
Аватар для tolyanv8
 
Регистрация: 29.09.2007
Адрес: Донецк, ????
Сообщений: 199
Сказал спасибо: 21
Сказали Спасибо 19 раз(а) в 15 сообщении(ях)
tolyanv8 на пути к лучшему
По умолчанию I2C

Спасибо за помощь, но увы, надо для ASM-а
Продолжаю пробовать и ковырять
tolyanv8 вне форума  
Непрочитано 24.04.2009, 17:34  
realid
Супер-модератор
 
Аватар для realid
 
Регистрация: 15.10.2007
Сообщений: 3,530
Сказал спасибо: 172
Сказали Спасибо 1,560 раз(а) в 810 сообщении(ях)
realid на пути к лучшему
По умолчанию

Я смотрю у вас нет задержки. Максимальная частота для I2C в 24С16 100 kHz. Какая тактовая частота контроллера? Не пробовали, в соответствии со спецификацией I2C, иммитировать открытый коллектор (дергать только биты TRIS, защелки выводов обнулены), линии подтянуты к Vdd?
realid вне форума  
Непрочитано 24.04.2009, 18:08  
CERGEI1982
Почётный гражданин KAZUS.RU
 
Аватар для CERGEI1982
 
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
CERGEI1982 на пути к лучшему
По умолчанию

tolyanv8 поищи на форуме,где то я делал мучился на ассамблере код под i2c,если не сможеш найти посмотрю у себя.
CERGEI1982 вне форума  
Непрочитано 24.04.2009, 18:36  
tolyanv8
Прописка
 
Аватар для tolyanv8
 
Регистрация: 29.09.2007
Адрес: Донецк, ????
Сообщений: 199
Сказал спасибо: 21
Сказали Спасибо 19 раз(а) в 15 сообщении(ях)
tolyanv8 на пути к лучшему
По умолчанию

Для 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
tolyanv8 вне форума  
Непрочитано 24.04.2009, 22:03  
MisterDi
Почётный гражданин KAZUS.RU
 
Аватар для MisterDi
 
Регистрация: 13.02.2008
Адрес: Днепр. Украина
Сообщений: 3,294
Сказал спасибо: 442
Сказали Спасибо 1,048 раз(а) в 706 сообщении(ях)
MisterDi на пути к лучшему
По умолчанию

Вот когда-то делал проект на 876 без использования аппаратного И2С. Все рабочее. Основной нюанс - задержка между последовательными операциями записи и чтения.

Прикрепленный файл: 7764728.zip
MisterDi вне форума  
Непрочитано 25.04.2009, 10:58  
realid
Супер-модератор
 
Аватар для realid
 
Регистрация: 15.10.2007
Сообщений: 3,530
Сказал спасибо: 172
Сказали Спасибо 1,560 раз(а) в 810 сообщении(ях)
realid на пути к лучшему
По умолчанию

tolyanv8 Подтяжка к +5 на линии SDA есть?
realid вне форума  
Непрочитано 25.04.2009, 12:15  
tolyanv8
Прописка
 
Аватар для tolyanv8
 
Регистрация: 29.09.2007
Адрес: Донецк, ????
Сообщений: 199
Сказал спасибо: 21
Сказали Спасибо 19 раз(а) в 15 сообщении(ях)
tolyanv8 на пути к лучшему
По умолчанию Подтяжка +5V

Нет, подтяжки нет, выводы заведены прямо, но все дело в том,
что я переписываю программу для уже существующей платы, а та прошивка, которая была там до этого спокойно все читала безо всяких подтяжек
tolyanv8 вне форума  
Непрочитано 25.04.2009, 12:35  
realid
Супер-модератор
 
Аватар для realid
 
Регистрация: 15.10.2007
Сообщений: 3,530
Сказал спасибо: 172
Сказали Спасибо 1,560 раз(а) в 810 сообщении(ях)
realid на пути к лучшему
По умолчанию

Возможно в той прошивке были использованы внутренние подтяжки на выводах порта А (см. даташит). Я вообще не понимаю как у вас будет считываться линия SDA без подтяжки. Дело в том что у памяти выход SDA это открытый коллектор, он требует подтяжки линии к Vdd, если её нет, то будут считываться либо 0, либо чепуха всякая.
realid вне форума  
 

Закладки
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
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, время: 10:08.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot