Bascom Propleme mit SAA1064 Anzeige

Thorsten_Sch

Mitglied
31. Okt. 2010
152
0
16
47
HH
Sprachen
  1. BascomAVR
Hallo Forum gemeinde und Bastler

ich habe eine folgende schaltung von My-AVR Buch Smiliey Blitzer nachgebaut....
Folgende Daten
ATmega8
Int0 = Start Eingang
Int1 = Stop Eingang
7Segment an PORT B


Ich wollte gern den SAA1064 Segmente Darahn Haben was ich auch sowiet hinbekommen habe
sehe bild
IMG_20150322_090337.jpg
die zahl stimmt ja auf der anzeige nur die an ersten Transitoren hängen leuchten, es sollen aber 3 segmente sein?

hier mein code
Code:
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32

Config Portd = &B11110000
Portd = &B00001111                                          'Pullupwiederstande
Smiley Alias Portd
Const Smiley_lachen = &B11000000
Const Smiley_weinen = &B10100000
Const Smiley_aus = &B00000000

Config Lcdpin = Pin , Db4 = Portb.5 , Db5 = Portb.4 , Db6 = Portb.3 , _
Db7 = Portb.2 , E = Portb.1 , Rs = Portb.0
Config Lcd = 20 * 4
Initlcd
Cursor Off


Const Saa1064_adresse = &H76                                'H76 - I2C Adresse SAA1064 4x7Segmenten
'Config I2cdelay = 15                                        'delay von 5=20µs=50kHz,10=10µs=100kHz;5=5µs=200KHz
Config Scl = Portc.5                                        'I2C SCL Pin
Config Sda = Portc.4                                        'I2C SDA Pin
'Dim _lcd_e As Byte                                          'Daten LCD
'_lcd_e = 64

I2cinit

'Anzeige Hell und 4 Stellen Modus:
I2cstart
I2cwbyte Saa1064_adresse
I2cwbyte 0
I2cwbyte &B01110111
'Bit 0  =  1    4Stellen mit Multiplex
'Bit 4 bis 6  Helligkeit:
'000 =  Aus
'001 = Hell
'011 = Mittel Hell
'111 = Sehr Hell
I2cstop
Wait 2




Cursor Off
Cls
Locate 1 , 3
Lcd "SMILIEY  BlITZER"
Locate 2 , 2
Lcd "7Segment & I2C-BUS"
Wait 2
Cls

'Timer fuer Hundertstel-Sekunden-Takt
Config Timer0 = Timer , Prescale = 1024                     '1024                     '10ms
On Timer0 Hundertsteltimer
Const Timervorgabe_0 = 178                                  '178

'Timer Fuer Multiplex
Config Timer1 = Timer , Prescale = 1                        '1
On Timer1 Anzeige
Const Timervorgabe_1 = 25536

Config Int0 = Falling
On Int0 Starten
Enable Int0

Config Int1 = Falling
On Int1 Stoppen
Enable Int1

Enable Timer0
Enable Timer1
Enable Interrupts


Dim Zeit As Word
Dim Zahl As Word
Dim Zahl_temp As Word
Dim Geschwindigkeit As Single
Dim Einer As Word
Dim Zehner As Word
Dim Hunderter As Word
Dim Tausender As Word
Dim Ziffer As Byte
Dim Dezimalpunkt As Byte
Dim Dunkel As Byte
Dim Stelle As Byte
Dim I As Byte
Dim Segmente As Byte

Dim Modus As Byte
Const Bereit = 1
Const Messen = 2
Const Anzeigen = 3
Const Gesperrt = 4
Modus = Bereit

Dim Hundertstel_sekunden As Long

Zeit = 888                                                  '888                                                  'Wahr Voher 888
Dunkel = 0
Dezimalpunkt = 1
Cls
Locate 1 , 1
Lcd "LED TEST -> Smiliey"
Wait 2
Locate 2 , 1
Lcd "LED Smiliey Lachen"
Smiley = Smiley_lachen
Wait 3
Cls
Locate 1 , 1
Lcd "LED TEST -> Smiliey"
Locate 2 , 1
Lcd "LED Smiliey Weinen"
Smiley = Smiley_weinen
Wait 3
Cls
Locate 1 , 1
Lcd "LED TEST -> Smiliey"
Locate 2 , 1
Lcd "LED Smiliey aus"
Smiley = Smiley_aus


Wait 2
Cls
Locate 1 , 3
Lcd "Messergebnisse"



Do

Select Case Modus
  Case Bereit:
     Zahl = 8888
     Dunkel = 0
     Dezimalpunkt = 1
     I2cstart
     I2cwbyte Saa1064_adresse
     I2cwbyte Stelle
     I2cwbyte Segmente
     I2cstop

  Case Messen :
    Zahl = Zeit
    Locate 3 , 1
    Lcd "Zeit= "
    Lcd Zeit
    If Zeit = 1000 Then Modus = Bereit                      'Voher 1000
    I2cstart
    I2cwbyte Saa1064_adresse
    I2cwbyte Stelle
    I2cwbyte Segmente
    I2cstop

  Case Anzeigen :
     Dunkel = 1
    ' Locate 3 , 1
     'Lcd "Zeit"
     'Lcd Zeit
'     Zahl = Zeit                                            'nur zur testzwecken die zeit kurz anzeigen
'     Wait 1                                                 'nur zur testzwecken die zeit kurz anzeigen
     Zahl = Round(geschwindigkeit )
     Locate 4 , 1
     Lcd "Km/H= "
     Lcd Round(geschwindigkeit )


     If Zahl > 50 Then                                      'wenn zu schnell dann Blinken
     Smiley = Smiley_weinen
     Locate 2 , 1
     Lcd "Smiliey Traurig"
       For I = 1 To 5                                       '5
         Dunkel = 0
         Waitms 500
         Dunkel = 1
         Waitms 500
       Next
     Else
       Smiley = Smiley_lachen
       Locate 2 , 1
       Lcd "Smiliey  Lachen"
       Wait 3
     End If

     Smiley = Smiley_aus
     Dunkel = 1
     Wait 2
     Modus = Bereit

   Case Gesperrt
     Dezimalpunkt = 0
     Wait 2
     Modus = Bereit
End Select
Gosub Anzeige
Loop

End

'Multiplexer: (Zahl wird zerlegt und angezeigt)
Anzeige:
Timer1 = Timervorgabe_1
Zahl_temp = Zahl
Einer = Zahl_temp Mod 10

Zahl_temp = Zahl_temp - Einer
Zahl_temp = Zahl_temp / 10
Zehner = Zahl_temp Mod 10

Zahl_temp = Zahl_temp - Zehner
Zahl_temp = Zahl_temp / 10
Hunderter = Zahl_temp Mod 10

Zahl_temp = Zahl_temp - Hunderter
Zahl_temp = Zahl_temp / 10
Tausender = Zahl_temp Mod 10

If Stelle < 4 Then
  Incr Stelle
Else
  Stelle = 1
End If
If Stelle = 1 Then Ziffer = Einer
If Stelle = 2 Then Ziffer = Zehner
If Stelle = 3 Then Ziffer = Hunderter
If Stelle = 4 Then Ziffer = Tausender

Select Case Ziffer
  Case 0 : Segmente = &B00111111
  Case 1 : Segmente = &B00000110
  Case 2 : Segmente = &B01011011
  Case 3 : Segmente = &B01001111
  Case 4 : Segmente = &B01100110
  Case 5 : Segmente = &B01101101
  Case 6 : Segmente = &B01111101
  Case 7 : Segmente = &B00000111
  Case 8 : Segmente = &B01111111
  Case 9 : Segmente = &B01101111
End Select


If Stelle = 2 And Zahl < 10 Then Segmente = &B00000000
'fuehrende Null Dunkel
If Stelle = 3 And Zahl < 100 Then Segmente = &B00000000
'fuehrende Null Dunkel
If Stelle = 4 And Zahl < 1000 Then Segmente = &B00000000
'fuehrende Null Dunkel

If Dunkel = 1 Then Segmente = &B00000000
'If Dezimalpunkt = Stelle Then Segmente = Segmente Or H80

I2cstart
I2cwbyte Saa1064_adresse
I2cwbyte Stelle
I2cwbyte Segmente
I2cstop

Return



Hundertsteltimer:
Timer0 = Timervorgabe_0
Incr Hundertstel_sekunden                                   'Auskommentiertes wenn teilung gewuenscht
If Hundertstel_sekunden = 10 Then
  Incr Zeit
   Hundertstel_sekunden = 0
End If
Return

Starten:
If Modus = Bereit Then
  Start Timer0
  Zeit = 0
  Modus = Messen
  Dunkel = 1                                                'für testzwecke auf 0 setzen
  Dezimalpunkt = 1
End If
Return

Stoppen:
If Modus = Messen Then                                      'nur wenn Zeitmessung schon laeuft. nicht beimRückwärtsfahren Rueckwaertsfahren
  Stop Timer0

' Geschwindigkeit = Strecke / Zeit
  Geschwindigkeit = 5 / Zeit                                '5 Meter / Hunderstelsekunde
  Geschwindigkeit = Geschwindigkeit * 100                   ' m/s

' M / S * 60 * 60 / 1000 - > Km / H
  Geschwindigkeit = Geschwindigkeit * 3600
  Geschwindigkeit = Geschwindigkeit / 1000                  ' Km/h

  Modus = Anzeigen
  Dezimalpunkt = 0
Else
  Modus = Gesperrt
End If
Return

wo habe ich da einen fehler drin, ich BITTE um rat und tipps

Mit Freundtlichen Grüßen
Th.Sch.
 
Hallo Thorsten!

Ich weiß nicht wo du das Beispiel nun her hast und ich persönlich habe den SAA1064 auch noch nicht eingesetzt!

Was ich aber seltsam finde....

Im Programmcode taucht immer wieder folgendes auf:
Code:
     I2cstart
     I2cwbyte Saa1064_adresse
     I2cwbyte Stelle
     I2cwbyte Segmente
     I2cstop



Im Datenblat steht für den "Write-Mode" aber etwas anderes!
Hier mal der Auszug aus dem Datenblatt:

SAA1064write.jpg


Ändere doch erst mal die Anweisung für den "Write-Zugriff" entsprechend dem Datenblatt....
und dann sehen wir weiter.


Viel Spaß beim Basteln,
Cassio
 
Hmm...

I2C-Adresse+w -- instruction -- control -- digit1 -- digit2 -- digit3 -- digit4

zu Instruction steht aber, daß das ein Adresspointer ist, und das nächste Byte dann dorthin geschrieben wird.
The bits SC, SB and SA form a pointer and determine to which register the data byte following the instruction byte will be written. All other bytes will then be stored in the registers with consecutive subaddresses. This feature is called Auto-Increment (AI) of the subaddress and enables a quick initialization by the master.

Irgendwie paßt das nicht zusammen.

Ein einmaliges senden von
addr+w -- 0 -- control -- digit1value -- digit2value -- digit3value -- digit4value
sollte bereits alle 4 digits erscheinen lassen, um später ein digit zu ändern, kann man dann einfach
addr+w -- digitnumber -- digitvalue senden.

Wo ich nicht so recht durchsehe, ist die ganze Multiplexerei in seinem Programm - wozu?
Sobald 'ne neue vierstellige Zahl darzustellen ist, kann man doch einfach die vier digits (also die darzustellenden Bytes) ausrechnen, und die in einem Rutsch in den SAA übertragen
addr+w -- 1 -- digit1value -- digit2value -- digit3value -- digit4value
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)