Wederom 4 vragen over i2c example code

Wederom 4 vragen over deze i2c example code.

1 = Moet de Start_I2C en de Stop_I2C nu in de hoofd repeat loop staan? of daarvoor en daarna ?

2 = Moet de eerste 2 stuks Send_I2C_Byte nu voor of na de 1e Start_I2C staan?

3 = Welke nummertjes moet ik letterlijk geven als parameter met de eerste 2 Send_I2C_Byte?

4 = Wat zijn de geprefereerde waardes voor de 2 pull up weerstanden? 4K7 goed? / is 1K5 te laag?

Groet, Wouter van Wegen

Delphi WIN10 / www.freepascal.org AVR Pascal / www.freepascal.org RPI /
Arco

Special Member

1) Start komt als eerste en stop als laatse in een compleet i2c pakketje.
2) Zie 1)
3) Hangt van de aan te sturen chip af, die weten we niet.
4) Hangt af van bus, voedingsspanning, en wat er aan de bus hangt. 4k7 is meestal goed bij 100kHz, 1k5 bij 400kHz. (zie grafieken in i2c specs)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Wat een gekke taal. Lijkt wel Pascal.

Een bericht versturen is altijd:
I2cStart
I2cSend (1 of meer keer)
I2cEnd
Die moeten altijd dicht bij elkaar in je programma, met niks ander ertussen.

De parameter voor I2CSend mag je zelf kiezen. Wat je in de ene processor verstuurt komt later in de andere binnen. De eerste byte die je verstuurt is het adres. De andere kant moet dat dan wel herkennen, dwz dat die daar ook als adres is geprogrammeerd.

Als je met een i2C chip communiceert, dan heeft de fabrikant van die chip al gekozen welke data je kunt versturen. Dat staat dan uitgebreid beschreven in de datasheet.

Zo dan ? de start en stop zo dicht mogelijk bij elkaar.

Werkt echter niet. Wat moet ik nog meer veranderen?

[Bericht gewijzigd door pascalbythree op donderdag 8 april 2021 15:09:04 (24%)

Delphi WIN10 / www.freepascal.org AVR Pascal / www.freepascal.org RPI /
Arco

Special Member

Ik zie nergens een adres van de slave bij de master? (zonder gaat 't niet werken)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Bij I2C heb je een master die een bericht begint en de clock verzorgt, en een slave die daarop reageert.

I2CStart is voor de master. Die genereert een start conditie op de bus en begint een bericht te versturen.

De andere kant moet wachten tot er een bericht binnenkomt. Die doet dus geen I2CStart, maar iets als I2C-Wait-for-message(Slave address).

In jouw voorbeeld zijn ze allebei master en is er niemand die luistert.
Dat gebeurt bij mensen ook wel eens, maar daar bereik je niks mee. :)

Arco

Special Member

Het kan wel (met multi-master) maar da's weer iets lastiger...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

ajj ajj,

dit word me een stuk te a praktisch.

De voldene procedure en fucties kan ik uit kiezen:

WVW_CODE_I2C_UNIT_TURBO51.bmp

Heeft iemand een mega duidelijke code beschrijving ? Dan pak ik het daarna wel weer op qua code.

Want ik kan zeer goed pascal programmeren, zelf vanuit de vroegere BBS scene.

PS: Het betreft 2 MCU's, de AT89S52

Delphi WIN10 / www.freepascal.org AVR Pascal / www.freepascal.org RPI /

Het maken van een "slave" in hardware is super-simpel. Een hoop "handige" chips hebben daarom gewoon een i2c interface.

Een CPU/microcontroller is dan meestal de "master". Daarom zijn alle voorbeelden, libraries etcetc gemaakt om de microcontroller als master te zien. Wil je de microcontroller als slave gebruiken zul je veel meer "zelf" moeten doen. In hardware kan het ding het meestal wel (behalve bijvoorbeeld de BCM2835!), maar het programmeren is tricky.

Als je tussen twee microcontrollers wilt communiceren raad ik aan om "UART" te gebruiken. Dan kan je bijvoorbeeld ook de boel 1 voor 1 debuggen door de "master" of "slave" in z'n eentje aan een USB-UART bordje te hangen en te kijken wat ie nu stuurt....

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

gebruik je bascom?
wat communiceert er met wat over je i2c bus?

Lambiek

Special Member

Op 8 april 2021 15:38:35 schreef pascalbythree:
Heeft iemand een mega duidelijke code beschrijving ? Dan pak ik het daarna wel weer op qua code.

Kun je hier iets mee?

pic basic code:


Run:                                       

    If S1 = 1 Then                          
    BStart                                  ; Start I2C bus
    BusOut %01110000                        ; Zend doel adres [112]
    BusOut %11111111                        ; Zend poort adres [alles uit]
    BStop                                   ; Stop I2C bus
    EndIf                                  
    
    If S2 = 1 Then                          
    BStart                                  ; Start I2C bus
    BusOut %01110000                        ; Zend doel adres [112]
    BusOut %01111110                        ; Zend poort adres [P0 en P7 aan]
    BStop                                   ; Stop I2C bus
    EndIf                                       
GoTo Run                                   

End                                         

En je moet wel het adres weten van het IC of component waar je naar toe wil zenden. In dit geval is dat adres 112.

De controller waar dit in staat is de Master en waar je naar toe zend is de Slave. Dus die 112 is je slave adres. Dat slave adres kan bij jou anders zijn, maar dat kun je in de datasheet vinden van je desbetreffende IC.

Als je haar maar goed zit, GROETEN LAMBIEK.
Arco

Special Member

TS wil twee controllers 8051 gebruiken.
Je kunt dan kiezen voor master/slave, of voor multi-master. (beide zijn wat lastiger als master cpu met dedicated slave ic...)

UART lijkt mij ook een heel stuk simpeler in dit geval...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Lambiek

Special Member

Op 9 april 2021 09:52:37 schreef Arco:
TS wil twee controllers 8051 gebruiken.

Oké, daar heb ik even overheen gelezen. :)

Als je haar maar goed zit, GROETEN LAMBIEK.

Om wat zelfstandigheid te kweken...

Dit verhaal zou aardig compleet moeten zijn:

https://www.nxp.com/docs/en/user-guide/UM10204.pdf

En ik wil je sterk aanraden om Sigrok / Pulseview te installeren & gebruiken met z'n goedkope chinese Logic Analyser.

B.v. hardware die hier op lijkt:
https://sigrok.org/wiki/VKTECH_saleae_clone

Er zijn een heleboel van die Saleaeae clonen die allemaal de Cypress CY7C68013A in zich hebben (FX2). Deze uC heeft zelf geen Flash geheugen. Het programma wordt er door Sigrok ingestop op het moment dat je hem aan de USB hangt en Sigrok opstart.

In Sigrok zitten ook "protocol Analysers" (100+ verschillende, da's wel wat anders dan die handvol die je op een EUR500 oscilloscoop krijgt (of er nog bij moet kopen). Met die protocol analysers zie je heel veel extra. Hij herkent start en stop bits, geeft aan waar fouten in het protocol zitten en nog veel meer.

Veel te ingewikkeld!

Linker Scherm:

Rechter scherm, alleen algebra, niet de waardes van linker scherm:

kijk hij lijkt wel data te geven op de scope!

WVW_LEFT.pas

code:


   counter := 0;
   s:='<I2C test string';
  
  repeat
    inc(counter);
	if counter > 1000 then counter := 1;
	    	 	 	
	BlinkPIN := False;
	delay(55);
	
    BlinkPIN := True;	 
    delay(55);        
 	 
	 For j:=1 to length(s) do  
	 begin   
        Start_I2C;	

        Send_I2C_Byte(%01110000);
        Send_I2C_Byte(%11111111);
	    Send_I2C_Byte (111); 
		Stop_I2C;

	 end;
     Write(#10+#14);
	 
	 Write (SerialPort, 'counter = '); Writeln (SerialPort, counter);
  until 1=2;

WVW_RIGHT.pas

code:


   counter := 0;

   repeat
    inc(counter);
	if counter > 1000 then counter := 1;
	   	 	 	
	BlinkPIN := False;
	delay(55);
	
    BlinkPIN := True;	 
    delay(55);     
   
      Start_I2C; 
      Send_I2C_Byte(%01110000);
      Send_I2C_Byte(%11111111);
      j := Receive_I2C_Byte;	 
	  Stop_I2C;
	  
	 if j <> 255 then
	 begin
	   Write (SerialPort, 'counter = '); Writeln (SerialPort, counter);
       Write (SerialPort, 'Receive_I2C_Byte = '); Write (SerialPort, j); Write (SerialPort, ' - '); Writeln (SerialPort, chr(j));	
	   Write (SerialPort, j);
	 end;
	 
  until 1=2;
Delphi WIN10 / www.freepascal.org AVR Pascal / www.freepascal.org RPI /

Ze zijn nu allebei master. En versturen omstebeurt een bericht.
Terwijl er niemand luistert.

Je moet er eentje in slave mode zetten en die laten wachten op een binnenkomend bericht. En dan met de andere een bericht versturen.

Hoe zet ik hem dan in slave modus?

als ze zoekt op 'slave' vind je niets op www.turbo51.com

code:


Const High = True;
      Low  = False;

Var Ack: Boolean;
    SDA: Boolean absolute Forward;
    SCL: Boolean absolute Forward;

Procedure Start_I2C;
Procedure Stop_I2C;
Procedure Send_I2C_Byte (Data2Send: Byte);
Function  Receive_I2C_Byte: Byte;
Procedure Send_I2C_Ack;
Procedure Send_I2C_ClockPulse;
Function  I2C_AddressPresent (IIC_Adr: Byte): Boolean;

Dit is de I2C unit van mijn www.turbo51.com compiler, ik zie echter nergens 'slave' genoemd.

Delphi WIN10 / www.freepascal.org AVR Pascal / www.freepascal.org RPI /
Arco

Special Member

Zoals ik reeds zei: slave is complexer en niet standaard op alle controllers.
Ik zou de UART gebruiken, veel simpeler en ook beter geschikt voor dit doel...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Hoe zet ik hem dan in slave modus?

Ja, goede vraag.

Maar ik ken die Turbo51 niet, en die website is ook niet erg behulpzaam.
Misschien kun je daar eens vragen.

Op 8 april 2021 14:25:50 schreef deKees:
Wat een gekke taal. Lijkt wel Pascal.

Ik vind het juist een heel duidelijke taal. Geen gekriebel met tekens als <<@==$ maar gewoon leesbare tekst. Je ziet meteen wat er staat.

Ook ik heb in Pascal gewerkt, en PLM en Modula2. En natuurlijk wel C omdat dat overal gebruikt wordt. Als ik snel iets foutloos moet maken gebruik ik toch iets pascal-achtigs.

Ik vind het juist een heel duidelijke taal.

Kan best.

Maar voor een microcontroller is het nogal ongebruikelijk, en dus is er op het net erg weinig informatie te vinden.