- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 8 von 8

Thema: GrafikLCD spinnt wenn I2C aktiv

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.04.2005
    Ort
    Hannover
    Beiträge
    190

    GrafikLCD spinnt wenn I2C aktiv

    Hallo!

    Ich habe mal wieder ein ganz komische Problem:

    Ich habe an einem Mega32 ein Grafikdisplay mit KS0108 Controller hängen. So weit so gut. Es funktioniert auch wunderbar wenn ich es alleine betreibe oder im Zusammenhang mit dem DCF77 Modul.
    Nun will ich allerdings per I²C einen ADC auslesen. Sobald ich dieses mache spinnt auf einmal das LCD und macht was es will. Woran kann das liegen?
    Hier mein Programm:
    Code:
    $regfile = "m32def.dat"
    
    $crystal = 8000000
    
    $lib "glcdKS108.lib"
    
    Declare Sub Ads1100
    
    
    Dim Luftdruck As String * 8
    
    Config Sda = Portc.1
    Config Scl = Portc.0
    
    Config Timer2 = Pwm , Pwm = On , Compare Pwm = Clear Up , Prescale = 1
    Config Graphlcd = 128 * 64sed , Dataport = Porta , Controlport = Portb , Ce = 7 , Ce2 = 6 , Cd = 5 , Rd = 4 , Enable = 3 , Reset = 2
    Config Dcf77 = Pinb.0 , Timer = 1
    Config Date = Dmy , Separator = .
    
    
    Enable Timer2
    Enable Interrupts
    
    
    Ocr2 = 10
    
    
    Setfont Font8x8
    Cls
    
    I2cstart
    I2cwbyte &B10010000                                         'Adresse (A0) und schreiben
    I2cwbyte &B10001100                                         'continous conversion, 8SPS, gain 1
    I2cstop
    
    
    
    Do
       Lcdat 1 , 1 , Time$
       Gosub Ads1100
       Lcdat 3 , 1 , "Druck: " ; Luftdruck
    
    Loop
    
    End
    
    
    Sub Ads1100                                                 'Subroutine für ADS1100, Ausgabe: String * 7
    
    Local W As Word
    Local U As Single
    Local P As Single
    
    I2creceive &B10010001 , W , 0 , 2                           'Adresse (A0) und lesen, Daten in Variable schreiben
    
    Rotate W , Left , 8                                         'Bytes in richtige Reihenfolge vertauschen
    
    U = W * 0.000152588
    Lcdat 6 , 1 , "u " ; U
    P = U + 0.76
    P = P / 0.005295
    Lcdat 5 , 1 , "d :" ; P
    Luftdruck = Fusing(p , "####.##")
    
    
    End Sub
    
    $include "font8x8.font"
    Vielen Dank
    Marten83

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Hallo,

    Du verwendest in der Sub einen ganzen schwung lokale Variablen, ohne aber softstack und Frame zu erhöhen.

    Du verwendest die für Hardware-I2C vorgesehen Pins, dann könntest du die Lib einbinden, das auch die Hardware (TWI) dafür verwendet wird.

    Mit den Werten etwas probieren bis es geht, evtl. den Platz der Variablen berechnen:
    Code:
    $hwstack = 32
    $framesize = 40
    $swstack = 40
    
    $lib "i2c_twi.lbx"
    Config Twi = 100000    ' oder 400000

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.04.2005
    Ort
    Hannover
    Beiträge
    190
    Was ist denn genau dieses TWI?
    Und muss ich dann die Pins für I²C trotzdem declarieren?

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.04.2005
    Ort
    Hannover
    Beiträge
    190
    OK, habe gerade nachgeguckt. Configurieren muss man die Pins trotzdem.

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Die beiden Pins muss man bei TWI (lib eingebunden) nicht ungedingt angeben, geht bei mir auch ohne.
    TWI ist die Bezeichnung für I2C von Atmel (rechtliches Problem).

    Den Rest auch schon probiert ?

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.04.2005
    Ort
    Hannover
    Beiträge
    190
    Ja, Danke!

    Mein Problem ist, denke ich gelöst.
    Zumindest kommen keine "Störungen" mehr auf dem Display.
    Irgenwas ist allerdings bei der Messung an sich faul. Ich denke aber das liegt an wackelkontakten.

    MFG
    Marten83

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.04.2005
    Ort
    Hannover
    Beiträge
    190
    Guten Abend!

    Das oben genannte Problem habe ich nun schon wieder.
    Leider hat das erhöhen des Stacks und Frames bisher nichts geholfen (oder muss ich noch weiter erhöhen?).
    Hier mein Code:
    Code:
    $regfile = "m32def.dat"
    
    $crystal = 1000000
    
    '$hwstack = 64
    
    $framesize = 64
    
    $swstack = 64
    
    $lib "glcdKS108.lbx"
    
    
    
    Config Graphlcd = 128 * 64sed , Dataport = Porta , Controlport = Portc , Ce = 2 , Ce2 = 3 , Cd = 4 , Rd = 5 , Enable = 6 , Reset = 7
    Config Timer2 = Pwm , Pwm = On , Compare Pwm = Clear Up , Prescale = 1
    
    
    
    
    Config Pind.2 = Input
    Config Pind.3 = Input
    Config Pind.1 = Input
    
    
    Set Portd.2
    Set Portd.3
    Set Portd.1
    
    'Enable Timer2
    
    Declare Sub Beleuchtung
    
    
    Dim Frameindex As Byte
    Dim V1 As Byte , V2 As Byte , V3 As Byte
    Dim Helligkeiteram As Eram Byte
    Dim Mbeleuchtung As Bit
    
    
    Setfont Font8x8
    Cls
    Waitms 100
    
    V1 = Helligkeiteram
    Ocr2 = Lookup(v1 , Helligkeitswerte)
    Mbeleuchtung = 0
    Frameindex = 8
    
    
    Do                                                          'Hauptschleife
    
    Select Case Frameindex
    
       Case 0 : Gosub Menue
       Case 1:
       Case 8 : Gosub Beleuchtung
    
    
    End Select
    
    
    
    Loop
    
    End
    
    
    
    
    Menue:
    
       Showpic 86 , 33 , Frame_exit
       Showpic 44 , 33 , Frame_einst
       Showpic 2 , 1 , Frame_uebers
       Wait 1
       Showpic 86 , 33 , Frame_exit_inv
       Showpic 44 , 33 , Frame_einst_inv
       Showpic 2 , 1 , Frame_uebers_inv
       Wait 1
    
    Return
    
    
    
    $include "includes\Beleuchtung.bas"
    
    $include "includes\Grafiken.bas"
    
    $include "includes\font8x8.font"
    und Beleuchtung.bas
    Code:
    'Unterprogramm / -menü für die Einstellung der Hintergrundbeleuchtung
    'Wichtig!: Variable V1 und V2 müssen im Kopfteil als Byte deklariert werden
    'Ebenfalls muss Timer2 als PWM konfiguriert sein
    
    
    Sub Beleuchtung:
    
       If Mbeleuchtung = 0 Then
    
       Line(22 , 30) -(105 , 30) , 255
       Line(22 , 41) -(105 , 41) , 255
       Line(22 , 31) -(22 , 40) , 255
       Line(105 , 31) -(105 , 40) , 255
    
       Lcdat 1 , 1 , "Beleuchtung"
       Lcdat 2 , 1 , V1
       V1 = V1 - 1
       For V3 = 0 To V1
       V2 = V2 * 8
       V2 = V2 + 24
       Showpic V2 , 35 , Balken8x8
       Next
    
       Mbeleuchtung = 1
    
       End If
    
    
       V2 = V1 * 10
    
       Lcdat 4 , 47 , V2 ; "%"
       Lcdat 3 , 1 , V1
       Debounce Pind.2 , 0 , Heller
       Debounce Pind.3 , 0 , Dunkler
       Debounce Pind.1 , 0 , Speichern1
    
    
    
    End Sub
    
    
    Heller:
    
       If V1 = 10 Then
       Return
       Else
       V1 = V1 + 1
       Ocr2 = Lookup(v1 , Helligkeitswerte)
       V2 = V1 * 8
       V2 = V2 + 16
       Showpic V2 , 35 , Balken8x8
       End If
    
    Return
    
    
    Dunkler:
    
       If V1 = 0 Then
       Return
       Else
       V2 = V1 * 8
       V2 = V2 + 16
       Showpic V2 , 35 , Balken8x8 , 1
       V1 = V1 - 1
       Ocr2 = Lookup(v1 , Helligkeitswerte)
       End If
    
    Return
    
    
    Speichern1:
    
       Helligkeiteram = V1
       Frameindex = 0
       Mbeleuchtung = 0
       Cls
    
    Return
    
    Helligkeitswerte:
    
       Data 0 , 3 , 5 , 8 , 12 , 21 , 34 , 56 , 93 , 154 , 255
    und Grafik.bas
    Code:
    Frame_einst:
    
       $bgf "Grafiken\Frame_einst.bgf"
    
    Frame_einst_inv:
    
       $bgf "Grafiken\Frame_einst_inv.bgf"
    
    Frame_exit:
    
       $bgf "Grafiken\Frame_exit.bgf"
    
    Frame_exit_inv:
    
       $bgf "Grafiken\Frame_exit_inv.bgf"
    
    Frame_uebers:
    
       $bgf "Grafiken\Frame_uebers.bgf"
    
    Frame_uebers_inv:
    
       $bgf "Grafiken\Frame_uebers_inv.bgf"
    
    Balken8x8:
    
       $bgf "Grafiken\Balken8x8.bgf"
    An dieser Stelle soll nun gesagt sein, dass es noch ein wenig kaotisch aussieht und ich mir dessen bewusst bin.

    Folgendes passiert nun auf dem Display:
    Die linke Displayhälfte funtioniert einwandfrei, die rechte ist allerdings um 4 Zeilen und ein bisschen verschoben (nach oben oder unten...kann man nicht sagen).
    Wenn ich nun die For Schleife aus der Beleuchtung.bas auskommentiere klappts Wunderbar. Liegts einfach an den vielen Variablen?

    Vielen Dank!

    Marten83

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.04.2005
    Ort
    Hannover
    Beiträge
    190
    So, ich weiss zwar immer noch nicht woran es gelegen hat, aber ich habe das Problem irgendwie gelöst und bin jetzt auch schon um einiges weiter gekommen.

    Vielen Dank

    Marten83

Berechtigungen

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

Labornetzteil AliExpress