 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
Tonci Član

Pridružen-a: Tor 05 Avg 2008 18:14 Prispevkov: 629 Aktiv.: 3.06 Kraj: Domžale
|
Objavljeno: Sob Feb 21, 2009 5:44 pm Naslov sporočila: 12F675 in I2C |
|
|
Že nekaj časa sepripravljam oziroma spravljam narediti merilnik napetosti in toka za svoj napajalni. Preletel sem forum in našel zanimive izvedbe in ena izmed njih je bil tudi Silvotov vmeter z 12F675 in komunikacijo I2C z gonilnikom za led display. Upam da si nisem zadal pretežkega projekta. Zadevo bi/bom napisal v Cju.
Del kode imam že napisane (merilni del), zataknilo se mi je pri komunikaciji med picem in SAA1064.
1. Dobljeno meritev bo potrebno pošiljati po kosih? Tisočice posebaj, stotice posebaj,..??
2. SCL ni vezan na clock, ampak ga prožim sam?
3.I2C deluje nekako tako(pošiljanje bitov): START->PIŠI(v mojem primeru)->NASLOV REGISTRA-> PODATKI->STOP
Kam umestim preverjanje?
Upam da si nisem zadal pretežak projekt! Hvala za vso pomoč!
|
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.93 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Sob Feb 21, 2009 6:31 pm Naslov sporočila: |
|
|
SAA1064 je zanimiv čip. (o njem nameravam nekaj več napisati v članku, ki ga pripravljam za našo revijo)
Na kratko:Za start bitom sledi naslov čipa 0 1 1 1 0 A1 A0 0 (A0 in A1 je fizični naslov, katerega določiš hardversko) sledijo instruction byte (dejansko naslov kam boš pisal) nato sledi podatek. Naslov se ob vsakem vpisu poveča za 1. Torej če je vrednost instruction byte 0 potem začeš pisat v kontrolni register sledi digit1 -4.
Kar se tiše C-ja ti žal ne znam pomagat.
_________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
Tonci Član

Pridružen-a: Tor 05 Avg 2008 18:14 Prispevkov: 629 Aktiv.: 3.06 Kraj: Domžale
|
Objavljeno: Sob Feb 21, 2009 6:56 pm Naslov sporočila: |
|
|
Glede na sliko (iz datasheeta) me zanimajo te Aji! Jih je potrebno brati ali ne? Namesto Cx mu pošljem binarno kodo vrednost(tosočice, stotice pretvorim v binarno in pošljem)?
Opis: |
|
Velikost datoteke: |
29 KB |
Pogledana: |
7 krat |

|
|
|
Nazaj na vrh |
|
 |
matijap Član

Pridružen-a: Sob 05 Jun 2004 23:24 Prispevkov: 230 Aktiv.: 0.97 Kraj: Žirovnica, LJ
|
Objavljeno: Sob Feb 21, 2009 7:03 pm Naslov sporočila: |
|
|
A-ji pomenijo ACK, torej acknowledge = potrditev. Če si boš prebral kakšen uvod v I2C protokol, boš kmalu videl, kaj je njihova naloga, kdaj jih moraš poslati, in kdaj brati. Veliko piše že v datasheetu za kakšen močnejši PIC, ki podpira hardverski I2C. Glede A1 in A0 ti je pa že Silvo napisal, če slučajno sprašuješ za te A-je. Nastaviš jih tako, da postaviš določene pine tvojega čipa na visok ali nizek nivo.
|
|
Nazaj na vrh |
|
 |
Tonci Član

Pridružen-a: Tor 05 Avg 2008 18:14 Prispevkov: 629 Aktiv.: 3.06 Kraj: Domžale
|
Objavljeno: Sob Feb 21, 2009 7:06 pm Naslov sporočila: |
|
|
Za A1,.. sem razumel! A (acknowledge) so potem nuja! Kar zakomplicirano! Bom najprej spisal kodo za pretvorbo v binarno!
Nazadnje urejal/a Tonci Sob Feb 21, 2009 7:10 pm; skupaj popravljeno 1 krat |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.93 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Sob Feb 21, 2009 7:09 pm Naslov sporočila: |
|
|
Potrditve je seveda potrebno brati. Vsaj clock mora teči - torej tudi 9-ti bit. Pravilno izveden I2C protokol mora delati tako, da logično 1 postavlja pullup - ob logični 1 pin definiraš kot vhod ob logični 0 pa kot izhod z nizkim stanjem. Uporabniki vodila vedno "vlačijo" vodilo na dol. V takem primeru ne more priti do stanja, da bi en uporabnik vlekel vodilo na gor drugi na dol.
_________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.93 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Sob Feb 21, 2009 7:31 pm Naslov sporočila: |
|
|
Tonći je napisal/a: |
Za A1,.. sem razumel! A (acknowledge) so potem nuja! Kar zakomplicirano! Bom najprej spisal kodo za pretvorbo v binarno! |
Ne razumem kaj boš pretvarjal v binarno? Vseeno je ali napišeš 255, 0xff, b'11111111' . Binarni zapis je v danem primeru bolj pregleden.
C-ja ne poznam - če prevajalnik različnih zapisov ne razume (kar dvomim) vzami windowsov calculator ter pretvori vrednost v ustrezno.
_________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
Tonci Član

Pridružen-a: Tor 05 Avg 2008 18:14 Prispevkov: 629 Aktiv.: 3.06 Kraj: Domžale
|
Objavljeno: Sob Feb 21, 2009 7:36 pm Naslov sporočila: |
|
|
AD vrne vrednost med 0 in 1023. Dobljeno vrednost pretvorim v napetost in recimo dobim 16.32V (pika je nepomembna)! Ko bom poslav na prvi displaj 1ko jo moram poslati v binarnem in vsa ostala tri števila, kar pomeni, da moram poljubno število razbiti najprej na 4 števila od 0 do 9 in potem vsako ok dnjih sspremeniti v binarno kodo!
|
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.93 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Sob Feb 21, 2009 7:50 pm Naslov sporočila: |
|
|
Najprej spravi "k pameti" vodilo. Potem bo potrebno narediti tabelo znakov. "Cifre" boš potreboval na koncu, ko ti bo že vse delalo.
_________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
cfrik Član


Pridružen-a: Sre 24 Jan 2007 16:15 Prispevkov: 39 Aktiv.: 0.17 Kraj: Trbovlje
|
Objavljeno: Ned Feb 22, 2009 12:37 pm Naslov sporočila: |
|
|
Tonći na tem mestu imaš nekaj primerov c kode za I2C za pic.
http://www.microchipc.com/sourcecode/index.php
Najprej preštudiraj to in preuredi za tvoj mikrokontroler, potem pa se boš ukvarjal s pretvarjanjem števila v cifre.
LP Samo
_________________ lepo je imeti poklic in hobi na istem področju vendar je časa premalo |
|
Nazaj na vrh |
|
 |
Tonci Član

Pridružen-a: Tor 05 Avg 2008 18:14 Prispevkov: 629 Aktiv.: 3.06 Kraj: Domžale
|
Objavljeno: Ned Feb 22, 2009 1:23 pm Naslov sporočila: |
|
|
Danes sem napisal začetni in končni ukaz!
Koda: |
void start(void)
{ //SDA=0,SCL=0
SDA=1; //SDA=1,SCL=0
Delay_us(100);
SCL=1; //SDA=1,SCL=1
Delay_us(100);
SDA=0; //SDA=0,SCL=1
Delay_us(100);
SCL = 0; //SDA=0,SCL=0
Delay_us(100);
}
void stop(void)
{
SDA=0; //SDA=0,SCL=x
Delay_us(100);
SCL=1; //SDA=0,SCL=1
Delay_us(100);
SDA=1; //SDA=1,SCL=1
Delay_us(100);
} |
http://www.robot-electronics.co.uk/htm/using_the_i2c_bus.htm
http://laps.fri.uni-lj.si/ars/ars_files/Osnove_I2C.pdf
Pomagam si z zgornjimi linki!
Hvala za vso pomoč do sedaj! Bom še kasneje poročal, kako napredujem!
Edit: Dodana koda za izbor "sužnja"! Upam da ni kje kakšne napake! Vsako opozorilo dobrodošlo!
Koda: |
void slave (void)
{ //01110A1A00
SDA=0; //SDA=0,SCL=0
Delay_us(100);
SCL=1; //SDA=0,SCL=1
Delay_us(100);
SCL=0; //SDA=0,SCL=0
Delay_us(100);
SDA=1; //SDA=1,SCL=0
Delay_us(100);
SCL=1; //SDA=1,SCL=1
Delay_us(100);
SCL=0; //SDA=1,SCL=0
Delay_us(100);
SCL=1; //SDA=1,SCL=1
Delay_us(100);
SCL=0; //SDA=1,SCL=0
Delay_us(100);
SCL=1; //SDA=1,SCL=1
Delay_us(100);
SCL=0; //SDA=1,SCL=0
Delay_us(100);
SDA=0; //SDA=0,SCL=0
Delay_us(100);
SCL=1; //SDA=0,SCL=1
Delay_us(100);
SCL=0; //SDA=0,SCL=0
Delay_us(100);
SDA=A1; //SDA=A1,SCL=0
Delay_us(100);
SCL=1; //SDA=A1,SCL=1
Delay_us(100);
SCL=0; //SDA=A1,SCL=0
Delay_us(100);
SDA=A0; //SDA=A0,SCL=0
Delay_us(100);
SCL=1; //SDA=A0,SCL=1
Delay_us(100);
SCL=0; //SDA=A0,SCL=0
Delay_us(100);
SDA=0; //SDA=0,SCL=0
Delay_us(100);
SCL=1; //SDA=0,SCL=1
Delay_us(100);
SCL=0; //SDA=0,SCL=0
Delay_us(100);
} |
Evo naletel sem na manjšo težavo! In sicer potrdilni bit! Uro SCL dam iz 1 v nič in čakam da SDA postavi na 0? To pomeni da predčasno dam SDA na 1 potem pa čakam, da postavi na 0 pri prehodu SCL iz 1 v 0? Moram SDA predstaviti kot vhod v tem primeru? HVALA!
Nazadnje urejal/a Tonci Ned Feb 22, 2009 3:19 pm; skupaj popravljeno 1 krat |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.93 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Ned Feb 22, 2009 3:15 pm Naslov sporočila: |
|
|
Upam, da veš, da SAA1064 nima vgrajenega kakega character seta (kot recimo kontroler za lcd HD44780) Podatki, ki jih pošlješ se shranejo v latch ter se v isti obliki pošljejo na izhodne pine. Torej, če mu boš poslal "1" se bo na izhodu vklopili pini ASCI vrednosti "1" Pri izdelavi hardvera pa moraš biti pozoren, da enaki biti različnih izhodov pripadata enakemu segmentu displjeja, sicer boš imel precej težav s programiranjem.
_________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
Tonci Član

Pridružen-a: Tor 05 Avg 2008 18:14 Prispevkov: 629 Aktiv.: 3.06 Kraj: Domžale
|
Objavljeno: Ned Feb 22, 2009 3:24 pm Naslov sporočila: |
|
|
Če te prav razumem, ciljaš na to, da postavljam SCL in SDA vrednost 0 in 1?
Definiral sem ju tako #define SDA GPIO.F5
#define SCL GPIO.F4 in ko sem probal na led diodi je delovalo, tako da mislim, da nebi smelo biti težav ali se motim?
da enaki biti različnih izhodov pripadata enakemu segmentu displjeja, sicer boš imel precej težav s programiranjem. - je to zgolj kot opozorilo (ste imeli podobne težave) ali zaradi moje kode?
|
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.93 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Ned Feb 22, 2009 3:41 pm Naslov sporočila: |
|
|
Citiram: |
...da enaki biti različnih izhodov pripadata enakemu segmentu displjeja, sicer boš imel precej težav s programiranjem. - je to zgolj kot opozorilo (ste imeli podobne težave) ali zaradi moje kode? |
Koda nima nobene veze z napisanim. (kar se "C"-ja tiče ti bo moral pomagat kdo drug) Na tole sem te le opozoril, ko boš prišel tako daleč, da bo začelo kaj "letet" na displej. (domnevam sicer, da imaš hardware sestavljen na testni plošči)
_________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
Tonci Član

Pridružen-a: Tor 05 Avg 2008 18:14 Prispevkov: 629 Aktiv.: 3.06 Kraj: Domžale
|
Objavljeno: Ned Feb 22, 2009 4:00 pm Naslov sporočila: |
|
|
ACK funkcijo bom pisal na konci, ker moram še malo pobrskati in ta del razumeti.
Sedaj me zanima zgol "teoretični del" če mu lahko tako rečem.
Po startu-slave adress-ACK-instruction Byte-ack sledi vrednost, ki se izbiše na zalonu-ack-stop. To je zaporedje te komunikacije.
Sedaj me zanima, če za 2 številko, 3 in 4 ponovim zgornji postopek ali je možno dat v vtsto 4 tako imenovane vrednosti (control byte) na zgornji sliki in sam zapisuje vse 4 števila na zaslon(g. Silvo je omeniv da se instuction byte sam povečuje, zato sem tako sklepal)?
|
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 493 dni
Powered by phpBB © 2001, 2005 phpBB Group
|