Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

I2C master-slaves communicatie met µ-controller

Pagina: 1
Acties:
  • 304 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Beste forum gebruikers,


Om met de deur in huis tevallen,zal ik mijn probleem even
uitleggen:


de bedoeling is een I2C bus temaken volgens het master-slave principe.


Ik beschik over 5 onafhankelijke microcontroller gestuurde circuits met keypad en LCD deze zijn de slaves type microcontrollers AT89c4051.


Alle informatie die deze circuits (slaves) moeten door geven,gaan naar een master opgebouwd met een microcontroller (A) type AT89S8252 slave/master op basis van poling
welke eveneens een draadlose communicatie moet leggen met een opafstand geplaatst circuit met eveneens een microcontroller (B) van het type AT89S8252 slave/master.


Mijn bedoeling zou zijn,een interupt tedoen via de I2C bus van uit de microcontroller (A) welke hier als master fungeert te communiceren met de 5 slaves welke een verschillend adres hebben .


De reden waarom ik een I2C BUS wil gebruiken is het beperkt aantal ingangs/uigangs pinnen van de AT89c4051 welke momenteel reeds gebruikt zijn voor de LCD en Keypad.
LCD is aangesloten in 4Bit mode ,en het keypad heeft een serial uitgang + interupt voor de controller
Deze slaves staan ongeveer 5 meter van elkaar.


Mijn vragen zijn:


1) heeft iemand hier ervaring mee
2) Code voorbeelden voor master/slave I2C heb reeds verschillende internetsites bekeken o.a.(Philips)


note: ik wens geen extra ic's op de slaves PCB's teplaatsen
enkel twee signalen SDA en SCL voor I2C communicatie.


Wat ik dacht:


De Master(A) stuurt een interupt naar alle slaves (5)op het zelfde moment,de interupt routine in de slaves wordt opgehaald deze wachten 100µs gedurende deze tijd gaat de master een adres verzenden naar de slaves (5) deze zullen op hun beurt het adres opgestuurd door de master in een register "Address?" plaatsen en vergelijken met hun eigen aders komt dit overeen met een van de 5 slaves dan zal de slave met het juiste adres zijn informatie door geven aan
de master (A) alle andere slaves zullen een RTI geven en hun werkzaamheden verder zetten.

vraag:

1) welke geteste code bestaat hier voor?
graag info, werkt nog met assembler code A51


In de hoop u allen een beeld te hebben gegeven


groeten


Marina

  • Super_ik
  • Registratie: Maart 2001
  • Laatst online: 20:35

Super_ik

haklust!

i2c heeft een apart interrupt kanaal. welke gegenereerd kunnen worden door de slaves. daarna moet je pollen waar het interrupt vandaan komt.

ps. kun je een overzicht tekening maken ofzo. k vindt t maar een moeilijk te volgen verhaal.

8<------------------------------------------------------------------------------------
Als ik zo door ga haal ik m'n dood niet. | ik hou van goeie muziek


Verwijderd

Handige I2C linkjes (sommige zullen je wellicht bekend voorkomen ;) :
kun je een overzicht tekening maken ofzo. k vindt t maar een moeilijk te volgen verhaal.
Bij I2S / 2 wire interface moet je hier aan denken:
Afbeeldingslocatie: http://www.esacademy.com/faq/i2c/general/i2cproto_files/g01proto.gif
  • Master: Stuurt eerst een START, daarna een ADRESS gevolgd door een READ of WRITE.
  • Slaves: kijken of het ontvangen adres overeenkomt met hun eigen adres en zo niet dan wachten ze op een STOP opdracht.
  • Bewuste slave: stuurt een ACKNOWLEDGE terug.
  • Daarna wordt de DATA verzonden (hetzij door Master danwel Slave afhankelijk van lees of schijfopdracht) gevolgd door een STOP opdracht.

Verwijderd

Topicstarter
Heb vorig bericht aandachtig bestudeerd,
De µ controllers AT89c2051 of at89c4051 en AT89s8252 hebben geen hardwire I2C aanboord
Moet dus zelf software matig een I2C programma schrijven.

Het is de bedoeling dat de master op basis van tijd een poling gaat doen om
de data van de slaves op tehalen

Kan ik dit doen door interupt INT0 of INT1 van de slaves te activeren en zo
hun aandacht er op tevestigen dat er data opgevraagd wordt door de master???

Hoe kan ik het programma van de slaves onderbreken (interupt) via I2C
om data op te vragen van de slave met het juiste adres?

Wil dit zeggen dat ik het software programmatjes welke ik heb geschreven in de slave controllers (AT89c4051) mee moet laten lopen met het hoofd programma van de slaves?

vlg

marina

  • Super_ik
  • Registratie: Maart 2001
  • Laatst online: 20:35

Super_ik

haklust!

je kunt de kloklijn van i2c aan een interrupt ingang hangen. in rust is de kloklijn namelijk hoog (of was t nou laag). dan weet je wanneer er weer wat gaat gebeuren. je het adres binnen. ackt als jij t bent en handelt het verder af met je master. is t jou adres niet. ga je lekker verder waar je mee bezig was.
zoiets. er zitten nog wel haken en ogen aan, maar die zijn wel te omzeilen. :)

8<------------------------------------------------------------------------------------
Als ik zo door ga haal ik m'n dood niet. | ik hou van goeie muziek


  • Belgar
  • Registratie: Januari 2002
  • Laatst online: 22-09 09:37

Belgar

Archmaster ranzige code..

Ik vind het een beetje verwarrend omdat je zegt dat je I2C wilt en vervolgens toch een eigen polling model wilt maken. Het is dus de bedoeling dat slaves de master vertellen dat ze data hebben. Als je toch polling wilt doen kun je beter geen i2c gebruiken, maar een simpel protocol. bijvoorbeeld met een multiplexer. Krijg je dus 1 a 2 extra componentjes, maar is wel VEEL makkelijker te implementeren.

code:
1
2
3
4
master - multiplexer - slave 1
                       slave 2
                       slave 3
                       etc

...Als het maar werkt


  • sebastius
  • Registratie: September 2000
  • Laatst online: 20:57

sebastius

Laten we lekker link gaan doen

De taal Bascom (www.mcselec.com) heeft zowel een I2C master als slave library beschikbaar. Kun je de boel gewoon in basic programmeren. De slave library kost iets van 10 euro en is op de (gratis) demo Bascom prima te gebruiken. Er zitten ook standaard LCD en keypad libraries in.

  • Super_ik
  • Registratie: Maart 2001
  • Laatst online: 20:35

Super_ik

haklust!

normaal gesproken kan een slave nooit een master aanspreken bij i2c hoor, daarvoor is de int lijn toegevoegt.

8<------------------------------------------------------------------------------------
Als ik zo door ga haal ik m'n dood niet. | ik hou van goeie muziek


Verwijderd

Topicstarter
heb alles nog eens goed gelezen en een misschien een mogelijke oplossing gevonden,

De µ controllers welke ik gebruik AT89c4051 heeft geen
I2C hardware aanboord --> zelf I2C code schrijven

detectie van een start gegeven door de master
kenmerk SDA: bij start I2C van hoog naar laag signaal terwijl Scl hoog blijft,ik kan deze dalende flank detecteren door de SDA lijn op alle slaves te leggen aan pin P3.3 (INT0)
door het TCON register duidelijk te maken dat het om een
flank signaal gaat moet ik de bit (IT1) in het TCON register op nul plaatsen

Zal dit even verduidelijken met een assembler code:

;Declaring

SDA bit P3.3 ;INT1
SCL bit P3.4

;Begin programma

ORG 00h ;reset programma

Ajmp INIT

ORG 13h

Ajmp I2C_start ;detectie start signaal master


INIT:. ;Init TCON register
clr IT1 ;interrupt op faling edge
.
.

Main:. ;start hoofd programma
.
.

I2C_Start:
JNB SCL,Time_wait ;wacht tijd
ajmp Address
ret

.
.
End

zou dit de juiste oplossing zijn of sla ik de bal verkeerd

vlg
Marina

  • DiLDoG
  • Registratie: Oktober 2002
  • Laatst online: 14-11 09:29
Super_ik schreef op 04 september 2004 @ 10:09:
normaal gesproken kan een slave nooit een master aanspreken bij i2c hoor, daarvoor is de int lijn toegevoegt.
Multi-Master Support
I2C also supports multiple master devices on the bus at the same time, a powerful feature that
optimizes bus use by keeping bus message traffic to a minimum. To support multiple masters,
I2C must resolve signal conflicts, should two or more master devices try to talk on the bus at the
same time. This feat, called bus arbitration loss detection, allows a master to detect when its bus
signals are conflicting with those of another master. A master that detects arbitration loss
terminates its use of the bus, allowing the message generated by another master to cross the bus
unharmed.

  • Super_ik
  • Registratie: Maart 2001
  • Laatst online: 20:35

Super_ik

haklust!

een master is geen slave he. ;)

8<------------------------------------------------------------------------------------
Als ik zo door ga haal ik m'n dood niet. | ik hou van goeie muziek


  • Belgar
  • Registratie: Januari 2002
  • Laatst online: 22-09 09:37

Belgar

Archmaster ranzige code..

Super_ik schreef op 05 september 2004 @ 15:56:
een master is geen slave he. ;)
Klopt, maar zo bedoelde ik het wel. Het ging mij meer om het design. Als je toch een master hebt die de polling verzorgd volgens een synchroon patroon kun je beter een multiplexer gebruiken. I2C is veel beter geschikt in situaties waarbij alleen data verstuurd op random tijden of met complexe interactie. Als je nooit afwijkingen in je patroon hebt is I2C hier gewoon overkill

...Als het maar werkt


Verwijderd

Topicstarter
Na een lange over denking ,zo het beter zijn van een syncroon systeem naar een
assyncroon systeem over te schakelen:

5 slaves (µ controller gestuurd) welke elk max 32 acht bit data bevat
gegevens enkel door tespelen naar de master indien een slave een verandering
in data heeft,
Hierdoor voorkom ik dat er onnodige data, welke niet gewijzigd is ook doorgestuurd word naar de master (hoofdcontroller):

Voordelen:

verwerkings tijd laag
master heeft minder werk om data op tevragen

Ik denk dat de slaves ook master moeten worden ??

Een µ controller circuit (slave 1) heeft data gewijzigd ,dit moet hij melden aan
hoofdcontroller de master (a); de master weet niet van welke slave deze vraag komt !
master zou eerst adres van de slave moeten weten om verder tegaan !

Beter zou zijn dat de slave (1) master is en master (a) op die moment slave word

veronderstel:

Slave (1) wordt ---> master (1)

In master (1) is er data gewijzigd deze laaste moet de hoofd controller hier van op de hoogte brengen
d.m.v. I2C signaal : start 7bit adres --> hoofd controller (a) geeft ack zodat hij weet van waar de data afkomstig is en deze kan collecteren in de registers bestemd voor master (1) deze kan dan enkel de data welke gewijzigd is door geven naar de hoofdcontroller enz ....

vragen:

Is dit mogelijk !!!
bestaat hier code voor AT89c4051

mvg

Marina

Verwijderd

Topicstarter
Beste forum gebruikers

I2C (software)
Is het een gebruikelijke techniek om de ext.interrupt INT
van een microcontroller (AT89c4051)te gebruiken om een start van een I2C te detecteren (dalende flank van de SDA bij start en hoge SCL)??

mvg

  • Super_ik
  • Registratie: Maart 2001
  • Laatst online: 20:35

Super_ik

haklust!

yup. anders moet je continu pollen. als je die interrupt toch overhebt, is het een gebruikelijke manier.

8<------------------------------------------------------------------------------------
Als ik zo door ga haal ik m'n dood niet. | ik hou van goeie muziek

Pagina: 1