PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : GrafikLCD spinnt wenn I2C aktiv



Marten83
20.08.2007, 10:09
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:

$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

linux_80
20.08.2007, 11:56
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:

$hwstack = 32
$framesize = 40
$swstack = 40

$lib "i2c_twi.lbx"
Config Twi = 100000 ' oder 400000

Marten83
20.08.2007, 12:08
Was ist denn genau dieses TWI?
Und muss ich dann die Pins für I²C trotzdem declarieren?

Marten83
20.08.2007, 12:15
OK, habe gerade nachgeguckt. Configurieren muss man die Pins trotzdem.

linux_80
20.08.2007, 15:20
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 ?

Marten83
20.08.2007, 22:58
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

Marten83
20.11.2007, 21:35
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:

$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

'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

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

Marten83
23.11.2007, 07:46
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