Hallo Uli,
kann ich mir eigendlich auch nicht erklären, wobei ich nicht weiß ob alle Ports gleichwertig sind.
Hast Du denn Pullup-Widerstände auf 5V an den Ports?
Gruß Hansi
Hi!
Hab ein Problem mit I2C. Wenn ich den C Port mit C0 und C1 für SCL und SDA nehme funktioniert mein Programm nicht mehr. Andere Ports, wie z.B. B3 und B4 funktionieren. Es ist egal welches I2C Gerät ich da anschliesse.
Hab mal ein Test Programm für das LCD02 geschrieben.
Für die Nutzung von Port B hab ich nur die zwei Zeilen mit SCL und SDA angepasst.Code:'******************************** '* LCD Testprogramm I2C Version * '******************************** Const Lcd_adr = &HC6 'I2C SlaveAdresse von LCD02 Const Ref = 5 / 1023 'Für Batteriespannungsberechnung Dim I As Byte 'Zählvariable für For-Schleife Dim S As String * 80 'max Anzahl Zeichen. 20*4 Zeichen auf LCD Dim A As Byte 'Länge des benutzten Strings ermitteln Dim Volt As Single Dim B As Byte 'Länge des restlichen Strings ermitteln Declare Sub Lcd_clrscr() Declare Sub Batteriespannung() $regfile = "m32def.dat" $crystal = 16000000 $baud = 9600 Config Adc = Single , Prescaler = Auto Config Scl = Portc.0 Config Sda = Portc.1 Sound Portd.7 , 400 , 450 'BEEP Sound Portd.7 , 400 , 250 'BEEP Sound Portd.7 , 400 , 450 Print "-------LCD TEST---------" Print I2cinit Waitms 500 Call Lcd_clrscr Call Batteriespannung A = Len(s) For I = 1 To A I2cstart I2cwbyte Lcd_adr I2cwbyte 0 I2cwbyte S I2cstop B = A - I S = Right(s , B ) Next I End '---------------------SUB's------------------------------' Sub Lcd_clrscr() I2cstart I2cwbyte Lcd_adr I2cwbyte 0 'Command Register I2cwbyte 12 'Command ClrScr I2cstop End Sub Sub Batteriespannung() Local W As Word Start Adc W = Getadc(6) Volt = W * Ref Volt = Volt * 5.2941 S = Str(volt) End Sub
Wie schon gesagt, mit SCL auf B.3 und SDA auf B4 funktioniert alles, nur nicht mit C0 und C1.
Kann ein kompletter Port abrauchen, ohne dass der Rest beeinflusst wird?
Oder steig ich gerade nicht durch?
Kann mir jemand weiterhelfen?
Danke
Uli
Hallo Uli,
kann ich mir eigendlich auch nicht erklären, wobei ich nicht weiß ob alle Ports gleichwertig sind.
Hast Du denn Pullup-Widerstände auf 5V an den Ports?
Gruß Hansi
HI
Mit den Pins hatte ich auch immer ein paar Probleme.
Ich bastel dann immer solange dran run, bis es funzt...
Du benutzt den Mega 16/32, oder?
Probier's doch mal über die internen I²C-Register.
Welche BASCOM-Version hast du?
Ganz liebe Grüße, Tobi
http://www.tobias-schlegel.de
"An AVR can solve (almost) every problem" - ts
Hi!
@Crazy_Hardware:
Bei dem Mega 32 sind die Pullups schon dabei. Da hab ich noch nie was machen müssen. Oder muss ich die noch irgendwie per Software einschalten?
@tobimc:
Ja, ist der Mega 32. Meine Bascom Version ist die 1.11.7.4 mit der neuen I2C Library.
Hab leider keinen 2ten uC für einen Vergleichstest. Wenn ich die LEDs mit Port C verbinde, kann ich mir die H und L Pegel ansehen. Dann müssten die LEDs doch flackern. Zumindest für SCL und SDA, oder?
Grüße
Uli
Hallo Ulrich,
das ist schon korrekt, allerdings reden wir hier über einen Bus, d.h. es können 100 Bausteine mit daran hängen.
Jetzt stell Dir einmal vor, es wären 100 ATmega32 mit aktiviertem Pullup, dann wäre der Gesamtwiderstand auf 5V nur noch 10000/100=100 Ohm.
Normalerweise müßte demnach der Pullup standardmäßig deaktiviert sein.
Eine Ausnahme bildet vieleicht der I2C-Master.
Pack doch sicherheitshalber SDA und SCL mit einen Pullup von jeweils 10KOhm auf VCC.
Bei Portc.5 und Portc.6 habe ich auch was von Spikefilter gelesen, ich weiß nicht ob der nur auf diesen Ports aktivierbar ist oder bei jeden Port.
Der Spikefilter filtert Nadelimpulse ( sehr kurze Störungen ) aus dem Signal.
Gruß Hansi
Ups, ich sehe gerade, Deine Leds flackern nicht?
Sind die denn Konstant an oder aus?
Gruß Hansi
Die LEDs sind bei C0 und C1 konstant aus. Laut Handbuch bedeutet das high Pegel. Meiner Meinung nach müssten die 2 LEDs leuchten und bei der Übertragung kurz flackern, oder?
Was die Pullups angeht, da sind am Bus 2 Ultraschall-Sensoren, 1 LCD, 1 Kompassmodul und die RN-Motor dran, also alles Slaves. Hierbei müsste das mit den Pullups doch funktionieren, da nur ein uC dranhängt, oder?
Gruß Uli
HI
Hm. Bei mir macht der I²C auch immer Probleme...
Aber wenn cih große Geschütze auffahre, und alle beiden Kanäle
vom Oszi anschließe, funzt's plötzlich...
Pack' mal
Ganz an den anfang des Programms, und häng' malCode:$regfile = "m32def.dat" $crystal = 16000000 $baud = 9600
$lib "i2c.lib"
unten dran.
Der Code hier hat bei mir (Mega 16 mit externen 4.7k Metallschicht PullUp)Code:$regfile = "m16def.dat" $baud = 9600 $crystal = 16000000 $lib "i2c.lib" Beep Alias Portd.2 Config Scl = Portc.0 Config Sda = Portc.1 Const 24c64 = &B10100001 Dim Var As Byte I2cinit Do For Var = 0 To 5 Sound Beep , 500 , 350 Waitms 250 I2cstart I2cwbyte 24c64 I2cwbyte 23 I2cstop Wait 1 Sound Beep , 500 , 500 Waitms 1 Next Var End
funktioniert.
Befasst sich mit der Ansteuerung eines 24C64, ist aber nur ein Teil.
Wenn's mit I2cwbyte funzt, geht's auch mit I2csend.
Hat bei mir auch funktioniert. Teste erstmal dashier.
Benutzt du das RN-Board?
Grüße, Tobi
http://www.tobias-schlegel.de
"An AVR can solve (almost) every problem" - ts
O.K. werd ich machen. Ich versteh allerdings nicht den Sinn, da die Bibliothek doch automatisch mit eingelinkt wird, sonst wären die I2C Befehle dem Compiler nicht bekannt und es würden Fehler angezeigt.
Aber auch wenn das expliziete Linken der I2C Library einen Unterschied machen würde, warum geht's dann mit anderen Ports?
Bin gespannt was passiert wenn ich das so mache wie du's beschrieben hast!
Noch was: Ich benutze das RN-Board. Hab schon öfter gelesen, dass die Pullups geändert werden müssen, wenn man mehrere I2C Slaves anschließt. Wie mach ich das?
Grüße und Danke für die Hilfe. Ich poste das Ergebnis wenn ich's ausprobiert habe.
Uli
Naja, bei meinen eigenen Schaltungen kann ich die externen Pullups über einen Jumper aktivieren/deaktivieren.
Wenn keine Daten gesendet/empfangen werden, dann haben die Ports High-Pegel, also 5V. Die Leds leuchten normalerweise bei Low, weil der Port die Masse zu den Leds durchschaltet.
Gruß Hansi
Lesezeichen