PIC - I2C
Moderátor: Moderátoři
PIC - I2C
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
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 140 x
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.
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.
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.
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
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.
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
Zdravím, práve dnes som na takúto tému narazil tu http://forum.mcontrollers.com/viewtopic ... hlight=i2c
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.
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.
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
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
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.
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.
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á.
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
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
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.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
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 107 x
Tak sa zdá, že ešte stále nerozlišuješ do ktorého registra píšeš...
namiesto tých
daj
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é
Program si pozriem.
namiesto tých
Kód: Vybrat vše
CLRF PORTA
Kód: Vybrat vše
BCF SDA
BCF SCL
Port B s tým nemá nič spoločné
Program si pozriem.