PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : I2C: SCL und SDA an Port C nichtr mehr verfügbar?



Ulrich
10.02.2005, 18:19
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

tobimc
10.02.2005, 20:47
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

Ulrich
11.02.2005, 10:27
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

Ulrich
11.02.2005, 11:59
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

tobimc
11.02.2005, 12:52
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

Ulrich
11.02.2005, 13:07
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

tobimc
11.02.2005, 13:23
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

11.02.2005, 14:37
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.

11.02.2005, 17:30
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

tobimc
11.02.2005, 17:37
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

11.02.2005, 17:52
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

Ulrich
11.02.2005, 18:21
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

tobimc
11.02.2005, 18:26
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

Ulrich
11.02.2005, 18:44
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

tobimc
11.02.2005, 18:53
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