Archiv verlassen und diese Seite im Standarddesign anzeigen : I2C: SCL und SDA an Port C nichtr mehr verfügbar?
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.
'********************************
'* 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
Für die Nutzung von Port B hab ich nur die zwei Zeilen mit SCL und SDA angepasst.
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
Crazy_Hardware
10.02.2005, 20:24
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
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
Crazy_Hardware
11.02.2005, 11:41
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
Crazy_Hardware
11.02.2005, 11:43
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
$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600
Ganz an den anfang des Programms, und häng' mal
$lib "i2c.lib"
unten dran.
$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
Der Code hier hat bei mir (Mega 16 mit externen 4.7k Metallschicht PullUp)
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
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
Crazy_Hardware
11.02.2005, 13:12
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
Hi
Die Lib manuell einzulinken hat wie du schon sagst keinen Sinn.
Bei mir geht's mit anderen Ports erst nach der gleichen Mühe...
Ich werde das Gleiche sowieso demnächst mit den OnBoard TWI
realisieren, denn da schreibt man seine Bytes einfach in ein Registerchen, und harret der Dinge.
Den Rest macht der TWI von selber.
Geht aber nut mit PC.0 und PC.1.
ganz liebe Grüße, Tobi
10K bei RN-Control reicht in der Regel schon für ein paar Slaves (ca. 4 bis 6) aus. Wenn es mehr Slaves werden, dann einfach irgendwo auf einem der Slaves 2 zusätzliche 10k widerstände mit +5V und den Ports verbinden!
Falls kein Slave dafür vorbereitet ist, kann man das auch einfach über ein Stecker am Flachkabel machen. Einfach Buchse mit angelötetem Widerständen anstecken.
Hi!
Das mit dem manuellen Linken der i2c Library hat auch nix gebracht. Beide LEDs leuchten beim Starten 1 mal kurz auf und das war's.
@Gast:
Der Tip mit dem Stecker mit eingelöteten Widerständen ist gut. Bei meinen 5 Slaves also noch nicht nötig.
Fällt euch noch was zum C Port ein?
Was ist eigentlich mit
const Portc.0 = output
const Portc.1 = output
oder so? Bringt das was, immerhin sind scl und sda ja Ausgänge.
@tobimc:
Was ist ein OnBoard TWI?
Grüße Uli
Hi
Bei SCL wäre das kein Fehler, aber SDA muss ja schreiben, und lesen;
wenn man es also als Ausgang beschaltet bringt das nicht viel.
Mienes Wissens machen das die I²C Funktionen selber.
EDIT:
Achso OnBoard TWI...
TWI heißt einfach soviel wie I²C, macht auf jeden Fall das gleiche.
Der TWI ist ein Schaltkreis auf dem AVR, der das I²C Signal selber
d.h. Hardwaremäßig macht.
Die Software sendet ihm nur das zu sendende Byte zu, und tut nichts weiter.
Theoretisch sollte es damit nicht soviel Probs wie mit der Softwareemulation von BASCOM geben.
Ganz liebe Grüße, Tobi
Hab gerade mal das Testprogramm für den Mega 32 ausprobiert, weil da die Motoren angesprochen werden und das unteranderem über Port c6 und c7. Da geht nix mehr. Ich glaube ich hab mir irgendwie den Port C zerschossen. Da muss wohl Ersatz ran.
Grüße Uli
Jetzt gehen die Motoren wieder. Ich hab noch mal einen Vergleichstest mit dem Port b und Portc gemacht. Wenn ich die LEDs so beschalte, dass sie einmal scl und sda auf Port b anzeigen, so bekomm ich das gleiche Ergebnis wie bei Port c.
Offenbar ist eine kurze Low Flanke drin (kurzes leuchten der LEDs), ansonsten liegt immer high an. Ist das eigentlich so richtig?
Ne kurze Zwischenfrage: Wie verbindet Ihr eigentlich die Litzen der Sensoren mit dem Flachbandkabel? Litze in die Buchse vom Flachbandkabel stecken ist ja nicht so toll.
Grüße Uli
Hi
HIGH-Pegel ist sehr gut.
Allerdings glaube ich kaum, dass du die Lowpegel des I²C deutlich an ner LED siehst. Sie flackert vielleicht mal ganz bescheiden.
Portc 2 - 5 - Da liegt das JTAG-Interface. Die Pins seind standardmäßig zu.
Du musst JTAG in den Fusebits deaktivieren.
Ganz liebe Grüße,
Tobi
JTAG ist deaktiviert.
Ich meinte nur Portc 0 und 1. 6 und 7 sind ja für die Motoren.
Die LEDs seh ich deutlich. Wenn aber nun Daten übertragen werden an Port c, aber nix passiert, was soll mir das sagen? Eigentlich alles richtig, geht aber trotzdem nicht.
Jetzt bin ich ganz verwirrt!!!
Grüße Uli
HI
Mach' mal einen ( ;) ) Porttest:
Wait 1
Do
Portc = 255
Waitms 250
Portc = 0
Waitms 250
Loop
End
Deine LEDs sollten am Portc jetzt heftig blinken.
Wenn nicht - dann ist dein Port ziemlich sicher...
Ganz liebe Grüße,
Tobi
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.