Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
03.03.2008, 12:04
|
|
Частый гость
Регистрация: 13.12.2006
Сообщений: 36
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
pic16f628 , I2C и ЕЕПРОМ 24С08
подскажите программкуу для работы с интерфейсом I2C
для pic16f628 для считывания из микросхемы ЕЕПРОМ типа 24С08 .
пробовал не один вариант программок с инета
к сожалению мне не удалось ни одну "заточить" для себя не точ то заточить но и запустить
моя тестовая схемка :
попробовал эту прошивку с http://www.piclist.com/
тоже не стала работать после переназначения портов и ног пинов. подскажите реально работающий код для 628 пика
Код:
|
; Call with: EEPROM address in Mem_Loc
; Returns with: byte in Data_Buf
ReadEPROM
bcf STATUS, RP0
movf PORTA, 0 ; for EEPROM operation,
andlw 0xF9 ; load zero into RB1 and RB2
movwf PORTA ; for passive control of bus
bsf STATUS, RP0 ; select Bank 1 for TRISB access (passive SCL/SDA control)
bsf SDA ; let SDA line get pulled high
bsf SCL ; let SCL line get pulled high
bcf SDA ; START - data line low
movlw 0xA0 ; send "dummy" write (10100000) to set address
call Byte_Out
btfsc flags, 0
goto Error_Routine ; NOTE: MUST USE "RETURN" FROM THERE
movf Mem_Loc, 0
call Byte_Out
btfsc flags, 0
goto Error_Routine
bcf SCL ; pull clock line low in preparation for 2nd START bit
nop
bsf SDA ; pull data line high - data transition during clock low
bsf SCL ; pull clock line high to begin generating START
bcf SDA ; 2nd START - data line low
movlw 0xA1 ; request data read from EPROM (read=10100001)
call Byte_Out
btfsc flags, 0
goto Error_Routine
;------ Note that Byte_Out leaves with SDA line freed to allow slave to send data in to master.
call Byte_In
movf Data_Buf, 0 ; put result into W register for returning to CALL
bcf SCL ; extra cycle for SDA line to be freed from EPROM
nop
bcf SDA ; ensure SDA line low before generating STOP
bsf SCL ; pull clock high for STOP
bsf SDA ; STOP - data line high
bcf STATUS, RP0 ; leave with Bank 0 active as default
return
;------ Save each byte as it's written (not page write mode).
;------ We can speed this up to ~1.5ms for fast page write capable EEPROMs, but in case we want to
;------ use another slower memory chip, the default is 10ms delay per write.
;
; Call with: EEPROM address in Mem_Loc, byte to be sent in Data_Buf
; Returns with: nothing returned
WriteEPROM
bcf STATUS, RP0
movf PORTA, 0 ; for EEPROM operation,
andlw 0xF9 ; load zero into RB1 and RB2
movwf PORTA ; for passive control of bus
bsf STATUS, RP0 ; select Bank 1 for TRISB access (passive SCL/SDA control)
bsf SDA ; ensure SDA line is high
bsf SCL ; pull clock high
bcf SDA ; START - data line low
movlw 0xA0 ; send write (10100000) to set address
call Byte_Out
btfsc flags, 0
goto Error_Routine ; NOTE: MUST USE "RETURN" FROM THERE
movf Mem_Loc, 0
call Byte_Out
btfsc flags, 0
goto Error_Routine
movf Data_Buf, 0 ; move data to be sent to W
call Byte_Out
btfsc flags, 0
goto Error_Routine
bcf SCL ; extra cycle for SDA line to be freed from EPROM
nop
bcf SDA ; ensure SDA line low before generating STOP
bsf SCL ; pull clock high for STOP
bsf SDA ; STOP - data line high
call Delay10ms ; 10ms delay max. required for EPROM write cycle
bcf STATUS, RP0 ; leave with Bank 0 active by default
return
;------ This routine reads one byte of data from the EPROM into Data_Buf
Byte_In
clrf Data_Buf
movlw 0x08 ; 8 bits to receive
movwf GenCount
ControlIn
rlf Data_Buf, 1 ; shift bits into buffer
bcf SCL ; pull clock line low
nop
bsf SCL ; pull clock high to read bit
bcf STATUS, RP0 ; select Bank 0 to read PORTB bits directly!
btfss SDA ; test bit from EPROM (if bit=clear, skip because Data_Buf is clear)
goto $+3
bsf STATUS, RP0 ; select Bank 1 to access variables
bsf Data_Buf, 0 ; read bit into 0 first, then eventually shift to 7
bsf STATUS, RP0 ; select Bank 1 to access variables
decfsz GenCount, 1
goto ControlIn
return
;------ This routine sends out the byte in the W register and then waits for ACK from EPROM (256us timeout period)
Byte_Out
movwf OutputByte
movlw 0x08 ; 8 bits to send
movwf GenCount
rrf OutputByte, 1 ; shift right in preparation for next loop
ControlOut
rlf OutputByte, 1 ; shift bits out of buffer
bcf SCL ; pull clock line low
nop
btfsc OutputByte, 7 ; send current "bit 7"
goto BitHigh
bcf SDA
goto ClockOut
BitHigh
bsf SDA
ClockOut
bsf SCL ; pull clock high after sending bit
decfsz GenCount, 1
goto ControlOut
bcf SCL ; pull clock low for ACK change
bsf SDA ; free up SDA line for slave to generate ACK
nop
nop
nop ; wait for slave to pull down ACK
bsf SCL ; pull clock high for ACK read
clrf GenCount ; reuse this register as a timeout counter (to 256us) to test for ACK
WaitForACK
bsf STATUS, RP0 ; select Bank1 for GenCount access
incf GenCount, 1 ; increase timeout counter each time ACK is not received
btfsc STATUS, Z
goto No_ACK_Rec
bcf STATUS, RP0 ; select Bank0 to test SDA PORTB input directly!
btfsc SDA ; test pin. If clear, EEPROM is pulling SDA low for ACK
goto WaitForACK ; ...otherwise, continue to wait
bsf STATUS, RP0 ; select Bank1 as default during these routines
bcf flags, 0 ; clear flag bit (ACK received)
return
;------ No ACK received from slave (must use "return" from here)
;; Typically, set a flag bit to indicate failed write and check for it upon return.
No_ACK_Rec
bsf flags, 0 ; set flag bit
return ; returns to Byte_Out routine (Bank 1 selected)
;------ No ACK received from slave. This is the error handler.
Error_Routine
; Output error message, etc. here
bcf STATUS, RP0 ; select Bank0 as default before returning home
return ; returns to INITIAL calling routine
Delay10ms
movlw 0x0A
movwf GenCount
Delay_Start
nop
movlw 0x07 ; 249 cycles * 4us per cycle + 5us = 1.000ms
Delay
addlw 0x01
btfss STATUS, Z
goto Delay
decfsz GenCount, 1
goto Delay_Start
return |
‹center›
-- Прилагается рисунок: --
‹IFRAME src = "nuke/users_images/03032008/8639148.GIF" frameborder="0" name="fr4943417" scrolling="yes" width="470" height="463" align="bottom"›[img]nuke/users_images/03032008/8639148.GIF[/img]
‹font color=red›Рисунок не умещается на странице и поэтому сжат!‹/font›
Для того, чтобы просмотреть его полностью, щелкните здесь.
‹/IFRAME›
‹/center›
|
|
|
|
03.03.2008, 13:48
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Если знаеш какие команды выполняет ЕЕПРОМ 24С08 то проблем с написание обмена по шине i2c не должно быть,если конечно шину знаеш как работает,где у меня было на ассамблере,если надо позже выложу.
|
|
|
|
03.03.2008, 15:22
|
|
Частый гость
Регистрация: 13.12.2006
Сообщений: 36
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Сообщение от CERGEI1982
|
Если знаеш какие команды выполняет ЕЕПРОМ 24С08 то проблем с написание обмена по шине i2c не должно быть,если конечно шину знаеш как работает,где у меня было на ассамблере,если надо позже выложу.
|
дело для меня новое откудаж мне все знать
вся информация на буржуйском языке
окей буду ждать тогда твоего кода на Асме спасибо
если для ЕЕПРОМ 24С128 или ЕЕПРОМ 24С02 тоже пойдет
|
|
|
|
03.03.2008, 18:10
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Сообщение от stepashka
|
Сообщение от CERGEI1982
|
Если знаеш какие команды выполняет ЕЕПРОМ 24С08 то проблем с написание обмена по шине i2c не должно быть,если конечно шину знаеш как работает,где у меня было на ассамблере,если надо позже выложу.
|
дело для меня новое откудаж мне все знать
вся информация на буржуйском языке
окей буду ждать тогда твоего кода на Асме спасибо
если для ЕЕПРОМ 24С128 или ЕЕПРОМ 24С02 тоже пойдет
|
Почитай вот эту книжку http://dasbook.ru/?book=22 ,там что то есть об ЕЕПРОМ,с ней не работал,но думаю ничего сложно нет.
Код на ассамбере посмотрю,тока там подпрограммы-старт,рестарт,стоп и передача байта.В той же книжке есть описание i2c так что почитай,потом сможеш подпрограммы подключить в свою программу.
|
|
|
|
04.03.2008, 09:08
|
|
Прописка
Регистрация: 11.07.2006
Адрес: Ru, Nsk
Сообщений: 249
Сказал спасибо: 1
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
вот если что код на С. Работает как надо.
Код:
|
void putatmel(unsigned int adr ,unsigned char data1){
char a;
unsigned char adrL;
unsigned char adrH;
GIE=0;
WP=0;//write protect off
adrL = adr & 0xff;
adrH = (((adr ›› 8) ‹‹ 1) & 0x0E) | 0xA0;
i2c_WriteTo(adrH);
i2c_PutByte(adrL);
i2c_PutByte(data1);
i2c_Stop();
WP=1;//write protect on
GIE=1;
DelayMs(20);
}
unsigned char getatmel(unsigned int adr){
unsigned char result;
unsigned char adrL;
unsigned char adrH;
GIE=0;
adrL = adr & 0xff;
adrH = (((adr ›› 8) ‹‹ 1) & 0x0E) | 0xA0;
i2c_WriteTo(adrH);
i2c_PutByte(adrL);
i2c_ReadFrom(adrH);
result=i2c_GetByte(I2C_LAST);//MORE
i2c_Stop();
GIE=1;
return result;
} |
|
|
|
|
04.03.2008, 17:48
|
|
Частый гость
Регистрация: 13.12.2006
Сообщений: 36
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Сообщение от CERGEI1982
|
Почитай вот эту книжку http://dasbook.ru/?book=22 ,там что то есть об ЕЕПРОМ,с ней не работал,но думаю ничего сложно нет.
Код на ассамбере посмотрю,тока там подпрограммы-старт,рестарт,стоп и передача байта.В той же книжке есть описание i2c так что почитай,потом сможеш подпрограммы подключить в свою программу.
|
книга отличная прочел почти все спасибо большое за ссылку , насчет програмки все таки посматри ее
попробую разобраться ..
Сообщение от stri
|
вот если что код на С. Работает как надо.
.
|
вот к сожелению пока в СЯХ никак
если нужда заставит то буду разбираться ....
|
|
|
|
04.03.2008, 20:27
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
stepashka можно сказать спасибо тебе,просто был проект который на ассамблере не додел,бросил давным давно(термометр делал на жки),все таки дадел сейчас,ведь обещал тебе подпрограммы на шину i2c.
Вот сами подпрограммы,если что не понятно спрашивай
Код:
|
;================================================= ==============
;+++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++
;ЗАДЕРЖКА 2 Мкс
PAUSE5 NOP
CLRWDT
nop
RETLW 0
;ПОДПРОГРАММА СТАРТА ШИНЫ I2C
I2CSTART
BCF SDA
CALL PAUSE5
BCF SCL
CALL PAUSE5
RETURN
startR ;Рестарт
bcf SCL
CALL PAUSE5
bsf SDA
CALL PAUSE5
bsf SCL
CALL PAUSE5
bcf SDA
CALL PAUSE5
bcf SCL
return
;ПОДПРОГРАММА СТОПА ШИНЫ I2C
I2CSTOP CALL PAUSE5
BSF SCL
CALL PAUSE5
BSF SDA
RETURN
;ПОДПРОГРАММА ЗАПИСИ В SLAVE УСТРОЙСТВО
I2CSEND MOVWF I2CTEMP
MOVLW .8
MOVWF COUNTER
LOOP CLRWDT
BCF STATUS,C
RLF I2CTEMP,1 ;СДВИГ ВЛЕВО ЧЕРЕЗ БИТ С
BTFSC C1
BSF SDA
NOP
BTFSS C1
BCF SDA
BSF SCL
CALL PAUSE5
MOVLW 0X01 ;ЕСЛИ ПЕРЕДАЛИ ПОСЛЕДНИЙ БИТ,
SUBWF COUNTER,W ;ТО SCL ОПУСКАЕМ КОГДА ВЫЙДЕМ ИЗ ЦИКЛА
BTFSS STATUS,Z
BCF SCL
CALL PAUSE5
DECFSZ COUNTER
GOTO LOOP
BSF SHIFT ;ПРОВЕРКА БИТА АСК
BSF TRISB,7
BCF SHIFT
BCF SCL
CALL PAUSE5
BSF SCL
CALL PAUSE5
BTFSS SDA
BSF ACK
NOP
BSF SHIFT
BCF TRISB,7
BCF SHIFT
BCF SCL
BCF SDA
RETURN
;ПОДПРОГРАММА СЧИТЫВАНИЯ СО SLAVE УСТРОЙСТВА
I2CREAD BSF SHIFT
BSF TRISB,7
BCF SHIFT
MOVLW .8
MOVWF COUNTER
LOOP1 CLRWDT
BSF SCL
CALL PAUSE5
BCF C1
BTFSC SDA
BSF C1
BCF SCL
CALL PAUSE5
RLF I2CTEMP,1 ;СДВИГ ВЛЕВО ЧЕРЕЗ БИТ С
DECFSZ COUNTER
GOTO LOOP1
BSF SHIFT
BCF TRISB,7
BCF SHIFT
BSF SDA
BTFSS F ;ПРОВЕРКА ВЫДАВАТЬ ИЛИ НЕТ АСК
GOTO $+2
BCF SDA
BSF SCL
CALL PAUSE5
BCF SCL
BCF SDA
MOVF I2CTEMP,W
RETURN |
Вот объявлены имена
Код:
|
#DEFINE SHIFT STATUS,RP0
#DEFINE ZERO STATUS,Z
#DEFINE SCL PORTB,6
#DEFINE SDA PORTB,7
#DEFINE LED PORTA,0
#DEFINE ACK FLAG,0
#DEFINE F FLAG,1
#DEFINE C1 STATUS,C
#DEFINE E PORTB,0
#DEFINE RS PORTB,2
#DEFINE RW PORTB,1 |
Также прикрепляю проект термометра на ЖКИ,тока нужен руссифицированый жки в протеусе,отлаживал за вечер на скорую руку
Прикрепленный файл: 1762186.rar
|
|
|
|
04.03.2008, 20:29
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
stepashka а Си учу на будущее,советую,дельная вещь,но знание ассамблера не помешает
|
|
|
|
05.03.2008, 02:31
|
|
Частый гость
Регистрация: 13.12.2006
Сообщений: 36
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Сообщение от CERGEI1982
|
stepashka можно сказать спасибо тебе,просто был проект который на ассамблере не додел,бросил давным давно(термометр делал на жки),все таки дадел сейчас,ведь обещал тебе подпрограммы на шину i2c.
Вот сами подпрограммы,если что не понятно спрашивай
[code]
Вот объявлены имена
Код:
|
#DEFINE SHIFT STATUS,RP0
#DEFINE ZERO STATUS,Z
#DEFINE SCL PORTB,6
#DEFINE SDA PORTB,7
#DEFINE LED PORTA,0
#DEFINE ACK FLAG,0
#DEFINE F FLAG,1
#DEFINE C1 STATUS,C
#DEFINE E PORTB,0
#DEFINE RS PORTB,2
#DEFINE RW PORTB,1 |
Также прикрепляю проект термометра на ЖКИ,тока нужен руссифицированый жки в протеусе,отлаживал за вечер на скорую руку
|
вопрос такой а насколько совместимы подпрограммы от термометра и еепром чипа ?
мне кажется придется доробатывать ?
дело в том что я уже много программок перепробывал а результата нет почему то (прередача ни считывание еепром не работает ) пробовал код кулакова достаточно прозрачный и понятный но результат прежний
мн е кажется переключатель страниц тому виной
код вечером проверю спасибо .
Прикрепленный файл: 1762186.rar
|
|
|
|
05.03.2008, 02:50
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Так в чем проблема? ты не можеш скачать даташифт на ЕЕПРОМ и посмотреть каким образом записывается в память? или хочеш чтоб всю работу сделал за тебя?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
ВИТАЯ ПАРА +220В И КАК ЗАШИТЬ ЕЕПРОМ
|
Gladkih |
Микроконтроллеры, АЦП, память и т.д |
26 |
24.12.2008 20:31 |
как записать массив 50 на 16 в еепром atmega128&
|
sma-etu |
Микроконтроллеры, АЦП, память и т.д |
0 |
15.02.2007 16:05 |
PIC16F628
|
max0000 |
Микроконтроллеры, АЦП, память и т.д |
3 |
07.01.2007 02:19 |
PIC16F628
|
max0000 |
Микроконтроллеры, АЦП, память и т.д |
1 |
06.01.2007 17:18 |
PIC16F628
|
max0000 |
Микроконтроллеры, АЦП, память и т.д |
0 |
26.12.2006 22:40 |
Часовой пояс GMT +4, время: 00:48.
|
|