PIC - I2C

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
mat100
Příspěvky: 480
Registrován: 04 lis 2009, 01:00
Bydliště: Plzen-jih

PIC - I2C

#1 Příspěvek od mat100 »

Hoj

Prosím poraďte

Potřebuji připojit k procesoru PIC16F628A externí paměť 24C64WP. Procesor bohužel nemá hardwarovou sběrnici. Potřebuji tedy emulovat sběrnici I²C. Na internetu jsem si našel rutinu, kteru jsem poupravil. Na zkoušku jsem k ní připsal program, který zapíše od adresy 1 do adresy 255 číslo adresy, pak postuně po adrese vyčte data z eeprom a odešle je do PC. V simulátoru PIC IDE vše běží správně , v simulátoru RealPIC už ne a ve skutečnosti program taky neběží. V terminálu se vypíše jen 255 x nula. Podprogramy odesílání do PC jsou OK.

Prosím poraďte, kde mám chybu

S pozdravem Matěj
Přílohy
i2C2.asm
(9.3 KiB) Staženo 139 x

Uživatelský avatar
procesor
Příspěvky: 5284
Registrován: 02 říj 2009, 02:00
Bydliště: PO

#2 Příspěvek od procesor »

Akosi mi tam chýba nulovanie I2C_ERR,0 pred každým I2C_WRITE a I2C_READ.
A v aplikácii by sa mohol tento bit kontrolovať po každom zápise, či čítaní a dať o chybe info po RS232.
Ešte by bolo dobré vidieť pôvodné rutiny, zrejme v úprave môže byť pes zakopaný.
Odpory na SDA SCL predpokladám že máš zavesené na Vcc.

Uživatelský avatar
mat100
Příspěvky: 480
Registrován: 04 lis 2009, 01:00
Bydliště: Plzen-jih

#3 Příspěvek od mat100 »

Tak jsem doplnil to nulování a nefunguje to stejně.

Moc děkuji za to, že jsi se na to podíval. Na jiném foru mi akorát řekli, že mám zvolit jiné PICko s hardwarovou sběrnicí.

Dnes už končím, dělám na tom od rána a už mám hlavu jako balón.

Ještě jednou díky

Uživatelský avatar
procesor
Příspěvky: 5284
Registrován: 02 říj 2009, 02:00
Bydliště: PO

#4 Příspěvek od procesor »

Medzi zápismi chýba 10ms čakačka.
Za call STOP vo write zaraď 10ms delay a až potom RETURN.
Pre RAMky s napájaním 1,8V 2,7V 3,3V treba 20ms.

Kód: Vybrat vše

		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

Kód: Vybrat vše


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


Uživatelský avatar
mat100
Příspěvky: 480
Registrován: 04 lis 2009, 01:00
Bydliště: Plzen-jih

#5 Příspěvek od mat100 »

Ahoj

Díky za radu.

Vložil jsem tam tu tvojí čekací smyčku a výsledek je bohužel stejný.

Zde na bastlírně jsem našel jinou emulaci I2C sběrnice a ta se tváří, že funguje. Půjdu cestou menšího odporu.

Díky za pomoc.

Uživatelský avatar
mat100
Příspěvky: 480
Registrován: 04 lis 2009, 01:00
Bydliště: Plzen-jih

#6 Příspěvek od mat100 »

Ahoj

Tak jsem se dostal do stádia, že mi ani nová procedura nefunguje. Moc prosím, poraďte. Teď už jsem opravdu zoufalý. Už nevím, co mám upravovat.

V příloze je nová procedura.
Přílohy
i2C222.asm
(12.68 KiB) Staženo 115 x

Uživatelský avatar
miromatus
Příspěvky: 350
Registrován: 11 pro 2004, 01:00
Bydliště: SK Levice

#7 Příspěvek od miromatus »

Zdravím, práve dnes som na takúto tému narazil tu http://forum.mcontrollers.com/viewtopic ... hlight=i2c

Uživatelský avatar
procesor
Příspěvky: 5284
Registrován: 02 říj 2009, 02:00
Bydliště: PO

#8 Příspěvek od procesor »

a/ pri inicializácii SDA a SCL nech ostanú otočené na IN
b/ do SDA a SDL zapíš 0
c/ ak chceš vyslať SDA=1 do SDADIR zapíš 1
d/ pre SCL detto
e/ ak chceš vyslať SDA=0 do SDADIR zapíš 0 (otočíš iba PORTA,x v x je stále NULA
f/ pre SCL detto
Do portuA na bity SDA a SCL nikdy nepíš JEDNOTKU!, vždy tam musí ostať NULA.
Výstupy SDA a SCL sa ovládajú iba cez register TRISA!


V tom prvom programe, čo si tu dal, to s SDA a SCL bolo dobre urobené, až na inicializáciu PORTA a TRISA a vyššie spomenutom čakaní po zápise 10ms kôli pamäti, ktorej to dlhšie trvá uložiť dáta.
A nulovanie registra chyby pred každou operáciou. Ak sú rutiny správne a k chybe nikdy nedôjde, takže zdanlivo to môže byť zbytočné. Ja by som si tú chybu aspoň indikoval na voľnom porte ledkou.

Uživatelský avatar
mat100
Příspěvky: 480
Registrován: 04 lis 2009, 01:00
Bydliště: Plzen-jih

#9 Příspěvek od mat100 »

Ahoj

Děkuji, že se o můj problém zajímáte. Sám bych to dohromady asi nedal.

To miromatus

Z tohoto odkazu vycházela moje první nefunkční rutina.

To procesor

Těď jsi na to asi kápnul. Zkusím přepsat rutinu podle tvých rad a uvidíme. Ještě bych se chtěl zeptat, kde bereš tyto podstatné informace. Mám před sebou vytištěný datasheet, ale moc informací z něj nevydoluju. Na internetu jsem našel spoustu materiálů ohledně I2C sběrnice, ale vždycky jsou to spíše úryvky, než ucelené informace.

Předem všem děkuji

Uživatelský avatar
procesor
Příspěvky: 5284
Registrován: 02 říj 2009, 02:00
Bydliště: PO

#10 Příspěvek od procesor »

Oprav si aj aplikačný-test program. Najprv píš, potom inkrementuj adresu a dáta , potom test na H00.
Tak ako to máš píšeš do 1,2,....255,0.
Ešte treba zaistiť správne časovanie SDA,SCL vzhľadom na typ pamäte:
100kHz/400kHz. Rýchle nemajú problém s pomalým taktovaním, opačne je zlé.
V datasheet-e od atmelu AT24C64W je všetko. O riadení a ovládaní serial ramniek s PIC kontrolermi je plný web. Pozri si nejaký "tutorial"
npr:
http://www.best-microcontroller-project ... orial.html

A neskáč z jedného programu na druhý, postupne ladiť krok za krokom. S fungujúcim RS232 sa to dá detailne vysledovať, ale stačí na to jeden/dva voľné piny pre LED.
Postupne ako sa "môže" generovať chyba I2C_error" si indikuj túto chybu a budeš vedieť kedy vznikne. Tú časť upravíš-opravíš a ide sa ďalej.
Samozrejme, že je to pohodlnejšie ak je možnosť sledovať-pozrieť čo sa deje v procesore v reáli ak sú na to HW-SW prostriedky.

Uživatelský avatar
mat100
Příspěvky: 480
Registrován: 04 lis 2009, 01:00
Bydliště: Plzen-jih

#11 Příspěvek od mat100 »

Hoj

Konečně jsem se dostal zpátky k programu ...

Podržel jsem se všech výše zmíněných rad a poupravil první verzi programu. Program i po úpravách nefungoval. Protože nemám k dispozici osciloskop, musel jsem spoléhat na osciloskop implementovaný v simulátoru. Ten mi upozornil na chybu, která mi dodnes není jasná.
INI_PIC
CLRF PORTA ; Porty do 0
CLRF PORTB

MOVLW b'00000111' ; Komparátor OFF
MOVWF CMCON

BSF STATUS,RP0 ; Banka 1
MOVLW b'11000000' ; TRISA - SDA, SCL - vstupy
MOVWF TRISA
MOVLW b'00000010' ; TRISB - RB1=RX=1
MOVWF TRISB
BCF STATUS,RP0 ; Banka 0
I2C_START
BSF STATUS,RP0 ; Banka 1
BSF SDA ; Data = 1
BSF SCL ; Hodiny = 1
NOP ; Čekej 1us
BCF SDA ; Data = 0
NOP ; Čekej 1us
BCF STATUS,RP0 ; Banka 0
BCF SDA ; Data, hodiny do nuly
BCF SCL
RETURN
Bez těchto dvou příkazů program nefungoval. Na osciloskopu jsem zjistil, že úroveň na výstupním pinu nebyla 0, ale 1 ! Stále nechápu jak je to možné, když v inicializaci procesoru dávám všechny porty do 0.

Po doplnění těchto dvou záhadných instrukcí program začal částečně fungovat. V simulátoru fungoval perfektně, ale ve skutečnosti ne. Zbytek chyb jsem odladil v reálu za pomoci seriové linky a terminálu.

V příloze je upravený program.

Děkuji všem za pomoc.

S pozdravem Matěj
Přílohy
i2c2_net.asm
(15.54 KiB) Staženo 106 x

Uživatelský avatar
procesor
Příspěvky: 5284
Registrován: 02 říj 2009, 02:00
Bydliště: PO

#12 Příspěvek od procesor »

Tak sa zdá, že ešte stále nerozlišuješ do ktorého registra píšeš...
namiesto tých

Kód: Vybrat vše

      CLRF PORTA
daj

Kód: Vybrat vše

        BCF  SDA
        BCF  SCL
potom vo všetkých podprogramoch nepíšeš do POTRA,7 resp. 6, ale do TRISA 7, resp 6, aj keď to tak vyzerá .." BC/SF PORTA SDA". Dôležité je, že je nastavený BANK 1


Port B s tým nemá nič spoločné
:wink:
Program si pozriem.

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“