Stránka 1 z 1

PIC - I2C

Napsal: 08 říj 2011, 18:27
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

Napsal: 08 říj 2011, 19:52
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.

Napsal: 08 říj 2011, 20:03
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

Napsal: 08 říj 2011, 21:55
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


Napsal: 09 říj 2011, 08:15
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.

Napsal: 09 říj 2011, 14:36
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.

Napsal: 09 říj 2011, 21:30
od miromatus
Zdravím, práve dnes som na takúto tému narazil tu http://forum.mcontrollers.com/viewtopic ... hlight=i2c

Napsal: 09 říj 2011, 23:29
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.

Napsal: 10 říj 2011, 16:44
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

Napsal: 11 říj 2011, 10:57
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.

Napsal: 16 říj 2011, 14:26
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

Napsal: 16 říj 2011, 18:09
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.