Sida 1 av 2

I2C och PIC

Postat: 26 juni 2009, 16:22:31
av squiz3r
Tjena. Jag tänkte att jag skulle lära mig använda I2C nu, De enda seriella protokollen jag har använt innan är RS232 (och lite hemma snickrat mög), så det behövs!

Jag har läst lite guider och tutorials som jag hittade efter lite googlande, så jag har rätt bra koll på hur själva protokollet ser ut.

Men det första problemet jag har, det är vilken processor jag ska använda. Processorn ska inte utföra särskilt mycket jobb, den får bara ett interrupt, som kan komma så ofta som var 1,8'onde mS, och sen ska den vara en I2C slav. Så, jag skulle vilja ha en liten (billig) processor, utan så många ben och funktioner, men som har fullt stöd för I2C. Jag kollade på MicroChips hemsida, och trotts att jag tycker jag har ett stort lager med olika PIC'ar var det bara 16F887 som hade det... :( Och den är ju varken liten eller billig... Det verkar inte vara en enda i 12F familjen som har MSSP!?

Så, ett annat alternativ skulle ju va om man kan hitta något färdigt (fritt) bibliotek som bitbangar I2C, men det kanske inte är lämpligt när den ska hålla på med andra tidskritiska saker?

Sen en annan sak som jag inte riktigt har fattat, varje I2C slav ska ju ha ett eget ID nummer? Men hur vet man i så fall vilket ID nummer just det tex minnet har som är inkopplat på bussen? Det finns ju något som heter "General call" som jag inte riktigt fattade vad det var, har det något med den att göra?

Helt enkelt, jag behöver lite hjälp och tips att komma igång!

Mvh. Daniel

Re: I2C och PIC

Postat: 26 juni 2009, 16:36:12
av v-g
Jag körde med en 18F2221 som master den har ju I2C inbyggt i sig. Faktist så är inte I2C så våldsamt avancerat. Jag personligen tycker att onewire är mycket värre.

Jag kommunicerade med en extern datum/tid-krets och det fungerade bra. Som jag minns det så var det inte så jättesvårt att få att fungera men som vanligt så krävs ju att man runkar manualen till I2C till punkt och pricka.

I detta fall var 2221 master och jag vet inte hur det skulle fungera som slav men troligen så är det inte mer komplicerat. Har man datablad för båda sidor och oscilloscope så fixar du det på en kafferast (typ 1 dag eller så ;) )

18F är ju överlägsen 12&16F med hästlängder så skulle jag köpa vore det en sån. Men och ett stort men det tycks inte finnas med färre än 18 ben :shock: Vill man ha mindre verkar man hänvisad till andra serier.

2221 kostar en 40lapp från vår käre sodjan och de tycks fortfarande finnas kvar.

Re: I2C och PIC

Postat: 26 juni 2009, 17:20:52
av squiz3r
Jodå, vist finns det gott om 18F som har MSSP, men de enda jag har hemma är 18F4620, och det är inte många, så det känns inte lönt att använda en sån för en sån här enkel uppgift. En 16F eller till och med 12F räcker fint så länge som dem har MSSP, så det känns lite onödigt att använda en stor 18F'are.. :)

Re: I2C och PIC

Postat: 26 juni 2009, 18:55:31
av sodjan
> var det bara 16F887 som hade det...

Hade vadå ? Hårdvarustöd för I2C ?
Tja, eftersom 16F886 har allt som 887 har (förruto lika många "ben"),
så kan du inte ha letat speciellt duktigt... :-)
Sen tror jag det finns I2C stöd i t.ex 16F88 (18 pinnar).

Re: I2C och PIC

Postat: 26 juni 2009, 19:11:37
av squiz3r
sodjan: Såg att jag skrev väldigt otydligt där, jag menade att av alla PIC'ar jag har från 12 och 16 familjerna så var det bara 16F887 som hade fullt hårdvarustöd för I2C. 16F88 hade SSP tror jag det heter, den hade inte fullt hårdvarustöd, utan det var rätt mycket som man var tvungen att göra själv i mjukvaran...

Jag funderar på om jag skulle ta en 16F887 processor ändå ifall jag kan flytta över lite uppgifter till den så att den får mera att göra. Tror det får bli så!

Ingen som har lust att förklara lite kort vad "General Call" är, och om det är det jag söker?

Re: I2C och PIC

Postat: 26 juni 2009, 19:17:25
av sodjan
Jaha, av just de som *du* har. Ja ja... :-)

Första träffen på "Generall Call I2C" i Google :

http://www.i2c-bus.org/addressing/general-call-address/

Re: I2C och PIC

Postat: 26 juni 2009, 20:52:50
av spaderkung
Adressen till slavarna kan vara hårdkodade, som på vissa minnen där pull up/dn på n ben medger en n-bits adress. Microchip för sådana. Slavarna lyssnar ju alltid så även en slav med mjukvaruadress för dig skall ju lyssna, men endast acka sin egen adress (men du hade ju koll på protokollet). Leta inte ihjäl dig efter processorer med hårdvarustöd till en början utan få det att fungera först.

Re: I2C och PIC

Postat: 26 juni 2009, 20:58:05
av Micke_s
i2c är så ohyggligt segt i alla fall, så det brukar funka att köra mjukvara.

Re: I2C och PIC

Postat: 26 juni 2009, 21:08:27
av squiz3r
Edit: Hmm.. Nu har jag suttit och skrivit på detta så länge att folk redan har hunnit svara på allt som detta inlägget handlar om :doh:... :)

Edit2: Micke_s: 400kb/s är väll standard om jag fattat det rätt? Och det verkar som om man kan köra upp till 1Mb/s med snabbare enheter?? Det tycker jag är rätt snabbt... :)

----------------------------------------------------------------------------------------------------------------

Jo, Jag har läst bla den texten ett antal gånger nu, men jag fattar fortfarande inte.. :wink:
The general call addresses all devices on the bus using the I2C address 0.
"general call" adresserar alla enheter på bussen genom att använda I2C-adressen 0
Det har alltså något med adresserna att göra, men här låter det ju mera som om den ger dem adresser :?:
If a device does not need the information provided, it simply does nothing. Devices processing the message acknowledge this address and behave as slave receiver.
Om en enhet inte behöver något av den skickade informationen, så gör den helt enkelt inget alls. Enheter exekverar medelandet, skickar ett acknowledge för denna adressen, och beter sig som en slav.
Om enheten inte behöver vilken information :?:
Vilket medelande är det den exekverar, och vilken adress är det den godkänner :?:
The master cannot detect how many devices are using the message.
Mastern kan inte känna igen hur många enheter som använder sig av meddelandet.
Fortfarande, vilket medelande :!: :?:
The second byte contains a command. The possible commands are described in the I2C specification chapter 3.13. The value 0 e.g. is a Software Reset.
Den andra byten är ett komando.........
Okej, så det är det kommandot som de kallar för medelande tidigare?

Men jag fattar ändå inte alls sammanhanget :|

Är det bara jag som inte fattar!? Jag har läst, funderat, och läst igen hur många gånger som helst...

Eller! Är det bara så enkelt att man skickar en nolla istället för adressen så tar alla enheter emot det!? I så fall kunde dem väll bara skrivit det dirrekt istället... :D :wacko:

Okej, men om det är så, då har den alltså inget med detta att göra... :humm:


Jag läste en massa i databladet för en I2C slav nu, och där stod det:
Table 2. Memory Slave Address
DEVICE SLAVE ADDRESS

DS32C35 1010 000R

R = Read/write select bit
Betyder det alltså att ALLA dem kretsarna har samma ID!? Då kan man ju inte ha flera såna på samma buss? :wall:

Re: I2C och PIC

Postat: 26 juni 2009, 21:21:49
av matkrig
om processorn inte ska göra så mycket annat ändå verkar det väl nästan onödigt att ha en med i2c-stöd, protokollet är ju supersimpelt. ta bara nån billig mögprocessor och koda det själv.

Re: I2C och PIC

Postat: 26 juni 2009, 23:10:52
av squiz3r
Supersimpelt tycker ju inte jag att det är! :)

Det är ju en hel massa olika funktioner inbyggda i det, tex att en slav ska kunna dra ner klocksignalen och då ska mastern upptäcka det och vänta, så det är inte bara att klocka ut datan som vanligt... m.m. m.m.

Men, det kanske är lika bra att göra något sånt.. Men kan det störas av att jag får interrupt då och då?

Re: I2C och PIC

Postat: 26 juni 2009, 23:18:47
av eqlazer
Beror ju på hur lång tid du tar på dig vid ett interrupt. Nu vet jag inte vad det är som ska hända men det är oftast bäst att ha interrupt-callbacksen så korta som möjligt, tex lägga inkommande data i en kö som vanliga programmet betar av istället för att processa det direkt vid interruptet. Men det beror ju helt på applikation.

Sedan är det ju inte säkert du behöver ha all funktionalitet som I2C normalt har. Måste du kunna väcka mastern från din slave? Om inte så skippa bara den biten.

Re: I2C och PIC

Postat: 26 juni 2009, 23:52:14
av TomasL
"General Call" Betyder att du adresserar samtliga slavar på bussen samtidigt, man använder då adressen 0.

Slaven skall ACKa varje mottaget meddelande.

Slaven håller linan låg för att tala om att den inte är klar, tex ett eeprom, som tar lång tid på sig att skriva.

Allt du sänder över linan är ett "meddelande", det kan vara kort, dvs bara adress och kommando, eller långt, adress. kommando och data.

Beträffande adresseringen, så har alla (de flesta) färdiga i2c slavar en fast adress, som är inbränd och en rörlig adress på normalt mellan två och tre bitar, detta innebär att du inte kan ha mer än 3 eller sju enheter av samma slag på bussen.
Den fasta adressen är ett sort device-id kan man säga.

Förövrigt är det mycket svårt att kommentera lösryckta meningar (jag har ingen lust att läsa igenom dokumentet).
Microchip har ett antal (väldigt många) app-exempel på i2c kommunikation, samt en hel del väldigt bra app-notes.

Sedan kan man väl tillägga att en i2c-master är trivial, medan en slav kan vara lite mer komplicerad att få ihop riktigt.

Re: I2C och PIC

Postat: 27 juni 2009, 00:42:31
av Kaggen
squiz3r skrev:Jo, Jag har läst bla den texten ett antal gånger nu, men jag fattar fortfarande inte.. :wink:
The general call addresses all devices on the bus using the I2C address 0.
"general call" adresserar alla enheter på bussen genom att använda I2C-adressen 0
Det har alltså något med adresserna att göra, men här låter det ju mera som om den ger dem adresser :?:
Betyder det alltså att ALLA dem kretsarna har samma ID!? Då kan man ju inte ha flera såna på samma buss? :wall:
Tror denna sida kanske är enklare att börja med. Vet inte varför du hakar upp dig på just "General call"? Skall du "snacka" med alla enheter samtidigt?

Det hela verkar ju mycket enkelt.
1. Först skickar du (uC då eller den enhet som inleder konversationen) ett "START condition". Då lyssnar alla enheter på bussen. (Ungefär som magistern i skolan... Tyst i klassen!)
2. Sedan skickar du en adress på bussen som talar om vilken enhet du vill snacka med. (magistern: jag vill snacka med dig Bertil)
3. Den enhet du addresserat svarar med ett "acknowledge". Asså typ "jag är med i matchen". De övriga enheterna fattar ju att det inte var deras adresser, så dom väntar bara på att ni två ska snacka klart och skicka ett "stop condition" så bussen blir ledig igen. (Bertil: "Ja magistern, jag lyssnar!", klassen väntar andlöst på att magistern och Bertil ska tala klart)
3. Sedan skickar du din data till enheten. Asså vad du nu vill att den skall få. Datat är ju beroende på vad enheten förväntar sig och det bör stå i databladet för den enhet du skall snacka med. (Magistern säger till Bertil att han får kvarsittning)
4. När du jiddrat klart skickar du en "stop condition". Alla enheter på bussen fattar att uC och den berörda enheten har snackat klart och lämnat bussen öppen för någon annan att ta i besittning. (klockan ringer och det är rast... ja, utom för Bertil då... inte riktigt bra liknelse kanske, men men...)

Appropå adressering så är det som TomasL säger, du har en adress + 3 bitar som är 3 ben på enheten (typ E0, E1, E2 som ett EEPROM jag kollat på) som du sätter själv genom att koppla bena till Vcc eller Vss beroende på om det skall vara en "1" eller "0". du har alltså 7 adresser du kan ställa binärt om du har 7 av samma enheter.

Re: I2C och PIC

Postat: 27 juni 2009, 08:57:26
av vfr
Håller med Tomas. Enligt min erfarenhet så är egentligen slaven svårare att göra själv utan hjälp-hårdvara. Mastern är tämligen rättfram, och är det en funktion man inte behöver så kan man utesluta den.