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



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3359 Aktiv.: 14.18 Kraj: Dragomer
|
Objavljeno: Tor Avg 21, 2007 9:28 am Naslov sporočila: I2C in prekinitve? |
|
|
Pozdrav.
Nekje sem bral, da je potrebno onemogočiti prekinitve ( = Disable Interrups), kadar naslovim 1wire element. Menda zaradi časovnih zank.
To pravilo spoštujem in nimam problemov.
Ali velja isto tudi, kadar naslovim I2C element? Imam problme z I2C RTCRAM-om. Dela ure pravilno in potem enkrat napačna informacija iz I2C RAM-a, sledeče branje istega naslova je spet pravilno??
Kakšna ideja? Res je, nisem onemogočil prekinitve ko sem startal proces branja RAM-a, bi mi lahko škodovalo pri komunikaciji za RX/TX pini. Imam precej zapleteno RX prekinitveno rutino, vendar ta pri samem testiranju še ne sodeluje, in torej ne more biti vzrok za nesrečno branje I2C RAMA. Imam pa precej kratko timer0 interrupt rutino, (ima samo increment števec in return), ki bi pa po moje ne smela povzročati težav...
Morda bi moral le vprogramirati 'toleranco' do napačnega branja I2C RAMA tako, da podatek preberem dvakrat, in če je dvakrat enak, upoštevam, da sem bral RAM pravilno.
Kaj pravite? |
|
Nazaj na vrh |
|
 |
jur Član


Pridružen-a: Pet 02 Dec 2005 14:45 Prispevkov: 5142 Aktiv.: 21.71 Kraj: [color=zelena]Ljubljana[/color]
|
Objavljeno: Tor Avg 21, 2007 9:36 am Naslov sporočila: Re: I2C in prekinitve? |
|
|
vilko je napisal/a: |
... Imam pa precej kratko timer0 interrupt rutino, (ima samo increment števec in return), ki bi pa po moje ne smela povzročati težav...
Morda bi moral le vprogramirati 'toleranco' do napačnega branja I2C RAMA tako, da podatek preberem dvakrat, in če je dvakrat enak, upoštevam, da sem bral RAM pravilno. |
Dvakratno branje in primerjanje če je podatek enak nima smisla. Mogoče bo dvakrat enak napačen podatek. Potrebno je odpraviti napako v programu. Če je občasno podatek slab, gre za napako v programu. Ali pa je morda timing napačen. Morda je tudi napaka v designu vezja (slabo blokiranje napajanja).
Brez ogleda kode in sheme ... 42.
Jur
Nazadnje urejal/a jur Tor Avg 21, 2007 9:43 am; skupaj popravljeno 2 krat |
|
Nazaj na vrh |
|
 |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3359 Aktiv.: 14.18 Kraj: Dragomer
|
Objavljeno: Tor Avg 21, 2007 9:39 am Naslov sporočila: Bascom |
|
|
Uporabljam Bascom AVR kjer se tudi interrupt podprogrami končajo z Return.
Assembler je seveda drugače.
Hvala
(Nekdo je odgovoril, da je potrebna nekakšna drugačna return instrukcija, a je to sporočili 'izginilo'). Jaz pa svojega ne morem več brisati, lahko ga pa urejam. Zato to tako.)
Nazadnje urejal/a vilko Tor Avg 21, 2007 9:44 am; skupaj popravljeno 1 krat |
|
Nazaj na vrh |
|
 |
trot Član


Pridružen-a: Čet 18 Jan 2007 20:25 Prispevkov: 1282 Aktiv.: 5.72 Kraj: glej fogl
|
Objavljeno: Tor Avg 21, 2007 9:39 am Naslov sporočila: |
|
|
Imaš zadevo rešeno softversko ali hardversko? Kater uC imaš?
Če imaš softverski I2C (kot je to v primeru 1wire), potem moraš izključit tiste prekinitve, ki se ti lahko zgodijo med komunikacijo. Če pa je zadeva hardverska, pa drugi interrupt ne bo zmotil komunikacije. |
|
Nazaj na vrh |
|
 |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3359 Aktiv.: 14.18 Kraj: Dragomer
|
Objavljeno: Tor Avg 21, 2007 9:47 am Naslov sporočila: Ja |
|
|
Ja, res I2c je softwareski, uporabljam ATMega, ki sicer ima I2C pine, a niso tam, kjer sem predvidel tiskano vezje, ki je bilo narejeno za 89S8252 in ki ga uporabljam preko adapterja.... Hmm, to pomeni predelati in na novo narediti TIV? |
|
Nazaj na vrh |
|
 |
trot Član


Pridružen-a: Čet 18 Jan 2007 20:25 Prispevkov: 1282 Aktiv.: 5.72 Kraj: glej fogl
|
Objavljeno: Tor Avg 21, 2007 9:59 am Naslov sporočila: |
|
|
Ni nujno, odvisno kaj dela uC poleg I2C komunikacije. Jaz sem enkrat delal softversko I2C komunikacijo z atMEGA (ker je imel čip hrošča, in i2c ni več funkcioniral ko se je vrnil iz sleep mode), pa je zadeva delovala brez problema.
Poskusi samo I2C komunikacijo, in vse ostale funkcije ustavi. Jaz sem zadevo naredil z WinAVR, knjižnico pa se pobral na http://www.avrfreaks.net/ |
|
Nazaj na vrh |
|
 |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3359 Aktiv.: 14.18 Kraj: Dragomer
|
Objavljeno: Tor Avg 21, 2007 10:06 am Naslov sporočila: Bascom |
|
|
Trot, ali tudi ti programiraš v Bascomu? |
|
Nazaj na vrh |
|
 |
trot Član


Pridružen-a: Čet 18 Jan 2007 20:25 Prispevkov: 1282 Aktiv.: 5.72 Kraj: glej fogl
|
Objavljeno: Tor Avg 21, 2007 10:13 am Naslov sporočila: |
|
|
Včasih sem. Potem pa sem šel na C (WinAVR). |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.57
|
Objavljeno: Tor Avg 21, 2007 10:37 am Naslov sporočila: |
|
|
Joj fantje, ne klatite neumnosti, ker boste cloveka se bolj zmedli - I2C ima locen clock (za razliko od 1-wire), ki ima za casovni vsak parameter predpisano samo zgornjo mejo. Nikjer ne pise da se frekvenca ne sme spreminjati oz. da ne sme biti kar DC za nekaj casa.
To pomeni, da dokler je SW implementacija pravilno narejena (!) nima prav nobene zveze ce se interrupt pojavi med odposiljanjem oz. branjem, saj clock vedno kontrolira MCU. Ce pride vmes do interrupta, se pac cas enega bita raztegne, ampak to na nic ne vpliva, dokler HW deluje pravilno. Seveda koda v interruptu nima kaj sariti po linijah, namenjenih I2C !
Primerjava z SMBus
@Vilko: ce je HW brezhiben ter pravilno dizajniran (jur je omenil blokirne kondenzatorje) in so SW I2C rutine napisane pravilno (tega najbrz ne mores preveriti, ker izvorne kode Bascoma ne dobis prilozene, disassemblanje je pa mukotrpno pocetje ...), potem mora delati.
Predlagam, da naredis sledece:
1: Ce RAM in MCU nimata blokirnih kondenzatorjev na napajanju, jih dodaj, odstrani morebitne druge naprave z I2C vodila.
2: Preveri ali RAM sploh deluje OK. To pomeni pisanje razlicnih bitnih vzorcev (vsaj 0xaa in 0x55 oz. 0x00 in 0xff) na vse lokacije in branje nazaj, oboje pri dovolj nizkem clocku, da ne pride do motenj na napajanju. Tega ni se nihce omenil, a mozno je da ima RAM kaksno celico poskodovano ali pokvarjeno (to spada pod "brezhiben HW"), kar se sicer ne zgodi pogosto, se pa vseeno kdaj. Z dolocenimi vzorci vpisa te napake ne niti opazis !
Ce do napak ne pride, potem je ali cudno napajanje, ali pa je Bascomov SW I2C zanic napisan, kar se zdi precej neverjetno. Ce imas na voljo baterijo/akumulator namesto usmernika, lahko izlocis napajanje (dokler je napetost dovolj visoka, ob predpostavki, da je ploscica pravilno dizajnirana kar se tice napajanja), slednje pa bos bolj tezko preveril brez izvorne kode, lahko pa poskusis naslednje:
SCL (clock) linijo I2C povezi na vhod zunanjega interrupta. Najprej nastavi polariteto zunanjega interrupta na en prehod (denimo iz 0 v 1), potem pa se obratno. To bo zagotovo sprozilo interrupt ob vsakem bitu in ob razlicnih trenutkih v sekvenci posiljanja/branja. Koda v interruptu naj se izvaja vsakic nakljucno stevilko ciklov (tako da ne bo samo clock nekoliko upocasnjen, ampak se bo stalno spreminjal) in naj ne sari po linijah I2C. Predvidevam, da bi se tak poskus koncal povsem brez napak, ce je HW v redu.
Dobro bi bilo, ce bi pripel shemo ploscice. _________________ Ka ti bo pa torba ce si kupu kolo ? |
|
Nazaj na vrh |
|
 |
trot Član


Pridružen-a: Čet 18 Jan 2007 20:25 Prispevkov: 1282 Aktiv.: 5.72 Kraj: glej fogl
|
Objavljeno: Tor Avg 21, 2007 11:12 am Naslov sporočila: |
|
|
Pardon, moja napaka. Se opravičujem. |
|
Nazaj na vrh |
|
 |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3359 Aktiv.: 14.18 Kraj: Dragomer
|
Objavljeno: Tor Avg 21, 2007 5:33 pm Naslov sporočila: Hvala |
|
|
Hvala za odgovore in pripravljenost deliti z mano vaše znanje.
Ja, to sem si mislil, da pri I2c ne bi smelo biti kaj posebno občutljivo na timing, saj master generira svoj clock, s katerim se partner sinhronizira.
Priznam, nekaj sem zamolčal:
Na moj RTCRAM imata dostop dva mikroprocesorja. Da pa ne posegata hkrati, se preko tretjega pina, ki sem ga imenoval i2cfree dogovarjata, kdaj je prvi mikro master, kdaj drugi. I2cfree pin enega mikroprocesorja je vezan na i2cfree pin drugega mikroprocesorja in vse skupaj z enim pullupom na high.
Enostavno sem pred i2c ukazi naredil nekaj kot:
waitbit i2cfree, high
reset i2cfree
--- i2c pisanje ali branje in na koncu
set i2cfree
ta način mi je dobro deloval in imam že nekaj takih parov mikroprocesorjeve, ki si preko skupnega rama izmenjujejo podatke. A nikdar še nisem imel tako visoke frekvence poseganja po rtcram sužnju. Lahko, da pri manjši frekvenci poseganja po rtcramu sem imel enostavno 'srečo', da ni prišlo do hkratnega zaseganja in moja logika dogovarjanja ne deluje dovolj dobro.
Sledi testiranja programa in istočasno hw-a z enim samim mikroprocesorjem
Pozdrav
vs |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.57
|
Objavljeno: Tor Avg 21, 2007 5:56 pm Naslov sporočila: |
|
|
Vilko, kako (v katerem nacinu) delujeta oba i2cfree pina na obeh MCUjih ? Zakaj je to pomembno: ce oz. dokler si take stvari uganjal s kloni 8051, ki imajo kvazi-dvosmerne vhode, je to najbrz celo delovalo, ker imajo pini interni pull-up (torej bi delalo tudi brez zunanjega).
Ce tvoj AVR nima identicnih tipov vhodov (to pomeni interni pull-up, za delovanje kot vhod mora biti port latch na 1, kar pomeni, da je port driver zaprt), potem to ne more nikakor delovati. Modernejsi mikrokontrolerji od 8051 (in AT89Cx051) imajo ponavadi push-pull izhode z moznostjo nastavitve open drain. Zunanji pull-up v primeru PP izhodov pomeni samo dodatno porabo toka, ko je izhod v stanju logicne 0. Z OD izhodi bi zadeva najbrz morala delovati, vprasanje pa je kaj MCU prebere, kadar je doloceni pin nastavljen kot izhod; ce ti namrec prevajalnik ne spremeni sam smeri (torej izkljuci izhodnega driverja in tako nastavi pina kot vhod), potem najbrz MCU ne prebere nic pametnega (stanje port latcha ?) in pocne traparije.
Ugibam, da sta oba MCUja poskusala hkrati sariti po vodilu, pa se je zadeva bolj slabo koncala.
Pa se to: tvoja koda tako ali tako vsebuje t.i. "race condition"; interrupti morajo biti v vsakem primeru izkljuceni pred izvajanjem vrstice, ki preveri ali je pin i2cfree high, pa se potem je mozno, da en MCU ze zacne spreminjati stanje pina, drugi pa pa misli, da je pin se vedno high in ga zacne spreminjati tudi sam. Vsak ukaz se namrec izvaja dolocen cas, cetudi zelo kratek, in takrat obstaja kratek trenutek, v katerem se lahko zacneta MCUja hkrati puliti za vodilo in dreti po njem. Rezultati so napake v delovanju. Morebiten interrupt se poveca verjetnost, da bo MCU predpostavil, da je vodilo prosto (kar je tudi bilo ... pred veliko casa), v resnici pa ne bo vec. Ni potrebno, da so interrupti se vkljuceni potem, ko je ena naprava ze na vodilu in druga ne more vec sariti po njem.
Ce gre zgolj za komunikacijo dveh MCUjev, potem uporabi UART, pa ne bo nobenih problemov. Za sinhrono komunikacijo potrebujes 3 pine (toliko jih zdaj porabis za I2C + i2cfree), za asinhrono pa samo dva. Ce MCUja uporabljata kvarcni oscilator kot vir ure, potem je asinhrona cez glavo dovolj, hitrosti pa so lahko precej visoke (povsem primerljive z I2C, le da gre tukaj za full-duplex komunikacijo). _________________ Ka ti bo pa torba ce si kupu kolo ? |
|
Nazaj na vrh |
|
 |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3359 Aktiv.: 14.18 Kraj: Dragomer
|
Objavljeno: Tor Avg 21, 2007 6:34 pm Naslov sporočila: Ja |
|
|
Sokrat, razmišljaš tako, kot sem razmišljal jaz, le še malo boljše.
Pri meni si rtcram (in ostale i2c sužnje na busu) delita atmega16 in 89c4051.
Pri avr-u moram poleg tega, da testiram i2cfrepin free še le tega imeti na načinu INPUT, in potem predno ga resetiram na 0, ga moram postaviti na OUTPUT in ga držim dako, vse dokler ni i2cprocess končan.
Moja koda za branje enega bajta je sledeča:
Koda: |
' ---------------------BERIRAM-------------------------------
' Podprograma bere en bajt iz RAM-a RTC
' Naslov, kateri bajt brati dobi v spremenljivki I
' Brebrano vsebino da v spremenljivko I
Beribajt: 'Wrtcsr: <------
Gosub I2cfreesr
If I2cfreepin = 1 Then
Config I2cfreeport = Output
Reset I2cfreeport
I2cstart
I2cwbyte Wrtc
I2cwbyte I
I2cstart
I2cwbyte Rrtc
I2crbyte I , 9
I2cstop
Set I2cfreeport
Config I2cfreeport = Input
Else
Set I2cnotfree
End If
Return |
Začne se z gosub i2creesr. To je podprogram, ki nekako imitira
waitbit i2cfree,high
a za razliko od tega ukaza, ne 'izvisi' v tem ukazu, če je i2cfree permanentno low, kar bi posledično pomenilo, da program izvisi na tej točki. Zato po preteku nekega časa se podprogram vrne z return, tudi če ni i2cfreehigh, a procesor že ve, da od čitanja ne bo nič in postavi i2cnotfree high.
Nisem pa onemogočil prekinitev v tistem kritičnem času, od časa ko ugotovim, da je i2cfree high, do časa, ko ga postavim na low. To bom sedaj popravil.
Ja res gre zgolj za komunikacijo dveh cpujev, od katerih pa imata oba RX/TX pine uporabljene drugje. Eden komunicira z GSM telefonom, drugi z MAX485 in mrežo mikroprocesorjev po hiši. In za to imata vsak svoje hitrosti.
Hvala za sodelovanje in se priporočam |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.57
|
Objavljeno: Tor Avg 21, 2007 7:24 pm Naslov sporočila: |
|
|
Aha ... Kakorkoli, tudi z izkljucenimi interrupti bo prislo do problema:
Prvi MCU pogleda, ali je linija prosta. Ugotovi da je in si misli "Super! Jo bom kar zaplenil.". Zacne torej izvajati ukaz, ki zaseze linijo i2cfree, ravno takrat enkrat (torej od trenutka, ko je prvi MCU ugotovil, da je linija prosta, ter do trenutka, ko ukaz za spreminjanje stanja linije to koncno prestavi v zasedeno stanje) pa drugi MCU pogleda stanje linije in vidi, da je ta prosta. "Super! Bomo mi to kar zasegli." in rezultat je, da oba MCUja mislita, da imata samo ona pravico sariti po I2C vodilu,
Ta nacin ne bo nikoli deloval zanesljivo, je pa zelo majhna verjetnost, da bo prislo do napak. Manj kot je komunikacije, manjsa je verjetrnost za tezave, a je se vedno vecja kot 0.
Moj predlog je, da napisi svoje rutine za sinhrono komunikacijo. Ce je vezje ze narejeno, potem bo malce tezje kar se tice sinhronizacije, sicer pa je stvar preprosta, ce iams le na voljo kaj prostih pinov (4 bi bili super, s tremi bi se vedno slo). _________________ Ka ti bo pa torba ce si kupu kolo ? |
|
Nazaj na vrh |
|
 |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3359 Aktiv.: 14.18 Kraj: Dragomer
|
Objavljeno: Tor Avg 21, 2007 10:13 pm Naslov sporočila: Kako si to zamišljaš |
|
|
No, ne gre samo za komunikacijo, gre tudi za celo paleto podatkov, ki si jih delita preko skupnega rama, a me zelo zanima, kako si zamišljaš sinhrono komunikacijo.
Tole, preko skupnega rama je nekako poštni predal. eden preda drugemu v predal, ne, da bi drugega pri tem oviral, a ta drugi lahko ta čas dela nekaj drugega, le občasno gre pogledat, ali je kaj v predalu. To ni sihrona komunikacija, a je veliko bolj preporstoa kot sinhrona ki prinaša veliko dodatnih zahtev, ki jih je potrebno rešiti. Pred vsem takrat ko eden oddaja, MORA drugi sprejemati in ne se ukvarjati s čim drugim. To pa se mi zdi zelo težko izvesti.
Si ne upam sam seštrikati take sinhrone komunikacije...
Hvala, bom pazil, da bo komunikacija preko skupnega rama 'manj frekventna', da bo skoraj 0 verjetnosti, da bi prišlo do kolizije
mimogrede: če vzamem en mp iz podnožja, drugi bere že ure brez napak. Tukaj je toraj treba iskati črva. |
|
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
|