PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit SAA1064 und Bascom



harry2212
26.03.2008, 08:22
Hallo Alle zusammen, ich habe die LED - Anzeige mit dem SAA1064 aufgebaut. Läuft auch, allerdings ein Effekt den ich mir nicht erklären kann.
Der Multiplexbetrieb ist derart langsam, dass man das umschalten sehen kann. Also so im 1/2 Sekunden Takt. Ich weiß nicht ob es an der I2C - Communikation liegt. Habe leider auch kein Oszi um den Datenverkehr anzuschauen. Ich benutze den 89S8252 und habe in Bascom52 programmiert.
Als test habe ich einfach ein kleines Programm geschrieben welches nur inkrementiert.
Weiß Jemand wo ich ansetzen könnte.
In diesem Sinne, vielen Dank erstmal.
Gruß Harald

PicNick
26.03.2008, 10:39
Tscha, ich fürchte, du wirst deinen Code rausrücken müssen. Vergiss aber die Code-Tags nicht, sieht hübscher aus :-)

harry2212
26.03.2008, 17:42
Also ich versuchs nochmal. Der ist, glaub ich, sogar aus dem Forum.
Gruß,Harald


$regfile = "89s8252.dat"






Declare Sub Wandeln_lcd

Dim A As Byte
Dim F As Byte
Dim C As Byte
Dim D As Byte
Dim E As Byte
Dim Wert As Byte


Anfang:
For E = 0 To 9
For D = 0 To 9
For C = 0 To 9
For F = 0 To 9
I2cstart
I2cwbyte &H70
I2cwbyte &H00
I2cwbyte &H17


A = E
Call Wandeln_lcd
I2cwbyte Wert
'Wait 1

A = D
Call Wandeln_lcd
Wert = Wert + 128
I2cwbyte Wert
'Wait 1

A = C
Call Wandeln_lcd
I2cwbyte Wert
'Wait 1

A = F
Call Wandeln_lcd
I2cwbyte Wert
'Wait 1

I2cstop
Wait 1

Next F
Next C
Next D
Next E
Goto Anfang



Sub Wandeln_lcd
If A = 0 Then Wert = &H3F
If A = 1 Then Wert = &H06
If A = 2 Then Wert = &H5B
If A = 3 Then Wert = &H4F
If A = 4 Then Wert = &H66
If A = 5 Then Wert = &H6D
If A = 6 Then Wert = &H7D
If A = 7 Then Wert = &H07
If A = 8 Then Wert = &H7F
If A = 9 Then Wert = &H6F
If A = 10 Then Wert = &H77
If A = 11 Then Wert = &H7C
If A = 12 Then Wert = &H39
If A = 13 Then Wert = &H5E
If A = 14 Then Wert = &H79
If A = 15 Then Wert = &H71
End Sub

End

harry2212
26.03.2008, 17:50
Sorry, gleich noch ne Frage hinterher. =D>
Die Hex - Werte in der Sub Wandeln.
Wie kommt der Ersteller zu diesen Werten. Muß man sich für jedes Zeichen den Hex-Wert zusammenbasteln oder gibt es dafür Tabellen. #-o
Gruß, Harald

PicNick
26.03.2008, 18:19
Denke mal, die Segmente a-g entsprechen den Bits in der Tabelle.
Vermutlich
&H01 -> a
&H02 -> b
...
&H40 -> g
Diese Tabellen sind meist im Datenblatt. Aber 7 Segment von 0-F bringst du auch so zusammen.

Ein Tip, statt der "if"-Orgie


Sub Wandeln_lcd
Wert = lookup(A, Tabelle)
End Sub

Tabelle:
DATA &H3F , &H06 , &H5B , ......., &H71



Ich muss mir erst das Datasheet vom SAA anschauen, von wegen Protokoll.

harry2212
26.03.2008, 18:50
Hallo, sieht aus wie Bascom AVR oder?
In Bascom51 müsste das anders aussehen so viel ich weiß. Bin noch Anfänger.
Also im Datasheet vom SAA1064 kann ich nichts finden von den darszutellenden Zeichen. Gut, das ist wohl reine Fleißarbeit sich das zusammen zu basteln.
Ich dachte das I2C - Prtokoll ist im Bascom Compiler integriert, da dürfte es doch eigentlich keine Probleme geben oder.
Vorab mal danke für Deine Interesse.
Gruß, Harald 8-[

PicNick
27.03.2008, 08:54
1) Ein Beispiel für diese Tabelle findest du
www.alldatasheet.com find-> DM9368

Nun, habe mir den saa1064 angesehen. Ich sollte jetzt wirklich wissen, wie (schaltplan?) du das ganze aufgebaut hast. Nach den application notes im Datasheet ? welches ?

btw I Das Multiplexen hat mit I2C mit hoher Wahrscheinlichkeit NIX zu tun.
Die geschwindkeit hängt von dem Kondensator an CEXT ab.

btw II Zumindest der Bascom51 hat das "lookup" im repertoire
(BAscom52 hab ich nicht gefunden)

harry2212
27.03.2008, 19:26
Hallo PickNick,
alles klar es funzt.
Hattest volkommen recht. Ich hatte statt einen 2n7 einen u270 eingelötet.
Also vielen Dank für Deine Hilfe.
=P~
Die Ansteuerung ist eigentlich doch relativ simpel. Wichtig ist nur, dass quasi vier Bytes mit I2Cwryte geschrieben werden bevor das I2cstop Kommando kommt. Die Hex Werte kann man sich auch sehr einfach erarbeiten.
Dabei ist nur zu beachten, dass das element a das niederwertigste bit ist und im MSB das höchstwertige bit dem Dezimalpunkt entspricht.
Gruß, Harald

harry2212
31.03.2008, 22:27
Hallo Alle zusammen,
ich bins nochmal.
Also die Ansteuerung des SAA1064 über I2C habe ich kapiert. Es funktioniert auch alles zufriedenstellend. Nun habe ich aber ein anderes Problem und komme nicht weiter. Ich möchte nun einen analogen Wert z.B. 1250 was einem Spannungswert von 1.250 Volt entspricht anzeigen lassen. Das mit dem Dezimalpunkt ist kein Problem. Aber wie bekomme ich den Wert angezeigt. Fakt ist doch, daß vier bytes (natürlich gewandelt ) mit I2Cwbyte ins SAA geschoben werden bevor dem SAA mit I2Cstop mitgeteilt wird daß alle bytes übertragen wurden. Den Spannungswert habe ich aber als word variable vorliegen. Word = zwei bytes ! muß ich nun in BCD wandeln. Im Simulator bekomme ich aber unsinnige Werte angezeit. Ich machs bestimmt wieder viel zu kompliziert
8-[
Habt Ihr eine Idee #-o
Gruß, Harald

PicNick
01.04.2008, 11:48
Das Word in einen String läßt du am besten Bascom erledigen


DIM dezi as string * 4
dezi = str(word-variable)


dann hast du einen string "1250"

die einzelnen Zeichen am besten mit "overlay"



DIM z(4) as byte at dezi OVERLAY
z(1) "1"
z(2) "2"
z(3) "5"
z(4) "0"

der Ascii-code z.B. "1" ist 49
für deinen "Lookup" also am besten


tmp = asc(Z(1)) - 48
segpattern = lookup (tmp, table)


Die Sache mit Dezimalpunkt ist da aber noch offen

harry2212
01.04.2008, 19:44
Hallo PicNick,
vielen Dank erstmal. das sieht ganz gut aus. Ich muß jetzt mal schauen wie ich das in Bascom51 programmieren muß.
Das mit dem Umwandeln in string ist mir klar, auch das separieren der einzellnen Ziffern nur die Zuordnung von Ziffer zu Hex wert über Tabelle wird nicht so einfach gehen.
weil zum Beispiel eine Null dem Hexwert 3F entspricht und die Eins dem Hexwert 06 u.s.w. Was ich damit meine, es scheint da keinen rechnerischen Zusammenhang zu geben. Es ging eventuell über eine 'case' Auswahl.
Na mal sehen ich versuche mal einiges.
Nochmal danke für Deine Hilfe.
Gruß, Harald =P~

PicNick
02.04.2008, 09:32
eine Null dem Hexwert 3F entspricht und die Eins dem Hexwert 06

Halt, stop retour:
ASCII "0" = &H30 = 48 ==> 48 + 0
ASCII "1" = &H31 = 49 ==> 48 + 1
ASCII "2" = &H32 = 50 ==> 48 + 2
----
ASCII "9" = &H39 = 57 ==> 48 + 9

harry2212
04.04.2008, 16:51
Hallo PicNick,
also jetzt stehe ich total auf dem Schlauch.
Also die Werte welche ich in den SAA1064 reinschiebe setzen sich folgendermaßen zusammen.

db g f e / d c b a wobei a dem LSB entspricht und der Dezimalpunkt dem MSB.

Folglich entspricht die 3 dem Hex Wert H4F und die 4 dem Hexwert H66.
Und das funktioniert auch. Also wenn ich mit IC2write diese Werte schreibe bekomme ich auch die richtige Anzeige Dezimal.
Aus diesem Grund kann ich keinen rechnerischen Zusammenhang sehen.
Wenn ich nun die Werte von Dir schreibe leuchten z.B. bei 48 die mittlere und die untere LED.
Das macht keinen Sinn. Also ich versuchs mal mit einer 'case' Anweisung.

Gruß, Harald