- Akku Tests und Balkonkraftwerk Speicher         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 19

Thema: I2C: SCL und SDA an Port C nichtr mehr verfügbar?

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    01.09.2004
    Alter
    48
    Beiträge
    33

    I2C: SCL und SDA an Port C nichtr mehr verfügbar?

    Anzeige

    Praxistest und DIY Projekte
    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.
    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
    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

  2. #2
    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

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.06.2004
    Ort
    Bad Schussenried in Oberschwaben
    Alter
    34
    Beiträge
    1.461
    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

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    01.09.2004
    Alter
    48
    Beiträge
    33
    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

  5. #5
    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

  6. #6
    Ups, ich sehe gerade, Deine Leds flackern nicht?
    Sind die denn Konstant an oder aus?

    Gruß Hansi

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    01.09.2004
    Alter
    48
    Beiträge
    33
    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

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.06.2004
    Ort
    Bad Schussenried in Oberschwaben
    Alter
    34
    Beiträge
    1.461
    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

    Code:
    $regfile = "m32def.dat" 
    $crystal = 16000000 
    $baud = 9600
    Ganz an den anfang des Programms, und häng' mal
    $lib "i2c.lib"
    unten dran.

    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
    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
    http://www.tobias-schlegel.de
    "An AVR can solve (almost) every problem" - ts

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    01.09.2004
    Alter
    48
    Beiträge
    33
    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

  10. #10
    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

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test