-         

Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 33

Thema: MAX6958 - 7-Segment-Anzeigen leuchten nicht

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    15.08.2013
    Ort
    Güstrow
    Beiträge
    31

    MAX6958 - 7-Segment-Anzeigen leuchten nicht

    Anzeige

    Guten Abend zusammen,

    ich wage mich jetzt mal an Sieben Segment Anzeigen heran.
    Ansteuern möchte ich die mit einem ATMega88 und einem MAX6958.
    An den SCL und SDA kommen die richtigen Werte heraus. (Angezeigt mit Oszi).
    Aber der Anzeigentreiber gibt kein Signal aus.

    Was mach ich falsch?

    Als Adresse hab ich aus dem Datenblatt folgende Information:

    Code:
    Slave Address
    The MAX6958/MAX6959 have a 7-bit-long slave
    address (Figure 3). The eighth bit following the 7-bit
    slave address is the R/W bit. Set the R/W bit low for a
    write command and high for a read command.
    The MAX6958/MAX6959 are available in one of two
    possible slave addresses (see Table 2 and Ordering
    Information). The first 6 bits (MSBs) of the MAX6958/
    MAX6959 slave address are always 011100. Slave
    address bit A0 is internally hardwired to either GND in
    the MAX695_A_, or V+ in the MAX695_B_. A maximum
    of two MAX6958/MAX6959 devices can share a bus.
    
    Message Format for Writing
    A write to the MAX6958/MAX6959 comprises the trans-
    mission of the MAX6958/MAX6959s ’slave address with 
    the R/W bit set to zero, followed by at least 1 byte of
    information. The first byte of information is the com-
    mand byte, which determines the register that stores
    the next byte written to the MAX6958/MAX6959. If a
    STOP condition is detected after the command byte is
    received, the MAX6958/MAX6959 take no further action
    (Figure 6) beyond storing the command byte.

    hier der Code:

    Code:
    $regfile = "m88def.dat"
    $hwstack = 128
    $framesize = 128
    $swstack = 128
    
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portd.0 , _
           Db7 = Portd.1 , E = Portb.4 , Rs = Portb.5
    Config Lcd = 16 * 2
    Cursor Off
    
    Config Sda = Portc.4
    Config Scl = Portc.5
    
    Const Ad = &B011100
    
    Dim X As Byte
    
    X = 0
    
    Do
    
      For X = 0 To 65
    
          Upperline : Lcd "     Os Ram     "
          Lowerline : Lcd "       " ; X ; "        "
    
          I2cstart
          I2cwbyte Ad
          I2cwbyte X
          I2cstop
    
          Waitms 1000
      Next X
    
    Loop
    
    End

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705
    So wie es aussieht, reagiert der MAX6958 auf ein Kommando mit 8 Bits. Die ersten 6 Bits sind in der Tat 011100.
    Danach kommt aber noch ein siebtes Adress-Bit, das beim MAX6958A 0 ist, und beim Typ B 1. Das ist dafür gut, wenn man zwei ICs mit dem selben Bus bedienen und einzeln ansprechen möchte. Und schließlich kommt das Read-write-Bit, das dem IC sagt, ob es Daten empfangen oder senden soll. In Deinem Fall soll es Daten empfangen, also muss dieses letzte Bit 0 sein.

    Versuch´s also mal mit Const Ad = 01110000 (MAX6958A) bzw. 01110010 (MAX6958B)!

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705
    ...und im Datenblatt steht nochwas wichtiges:

    Nach dem korrekten Adressieren muss als erstes ein Kommando-Byte gesendet werden, damit der MAX überhaupt weiß, was er tun soll. Denn man kann ihm eine Menge anderer Befehle geben als einfach nur das Anzeigen von irgendwelchen Ziffern.

    Wie ich das verstanden habe, ist das Kommando für den "decode"-Modus die Bitfolge 00000001. Die sagt dem IC, dass das nächste gesendete Byte (= Datenbyte) auf der 7-Segment-Anzeige dargestellt werden soll. Da sich mit einem einzelnen Digit nur 16 Zeichen darstellen lassen (0-9 und A-F), werden auch nur die niedrigsten 4 Bits des Datenbytes ausgewertet. Soweit klingt das Datenblatt ganz schlüssig.

    Du brauchst also mal mindestens drei Bytes: Adressbyte, Kommandobyte und Datenbyte, die komplette Sequenz müsste etwa so aussehen:


    I2cstart
    I2cwbyte Ad
    I2cwbyte &b00000001
    I2cwbyte X
    I2cstop

    Wenn X 16 ist, müsste die Anzeige wieder bei 0 anfangen hochzuzählen.

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.557
    ... nur die niedrigsten 4 Bits des Datenbytes ausgewertet ... I2cwbyte X ... Wenn X 16 ... wieder bei 0 anfangen hochzuzählen.
    Irgendwie verstehe ich das anders: bei I2cwbyte X mit X = 15dez sieht (m)ein Byte so aus 0b00001111, bei x = 6dez genauso trivial 0b00000110. Mit X = 16 dann 0b00010000, damit stimmt die Aussage, die stimmt aber auch für X = 48dez => 0b00110000, kurz - wenn I2cwbyte ein unsigned integer ist - für alle Zahlen über 16, bei denen die letzten vier Bits 0 sind, allgemein bei allen Werten bei denen die letzten vier Bits 0 sind. Mag pingelig klingen.
    Ciao sagt der JoeamBerg

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705
    @ Oberallgeier:

    Vielleicht meinen wir ja das gleiche - ich habe mich auf diese Passage aus dem Datenblatt zum "Decode Mode Register" bezogen:

    In hexadecimal code-decode mode, the decoder looks
    only at the lower nibble of the data in the digit register
    (D3–D0), disregarding bits D7–D4.

    Leider habe ich gerade keinen MAX6958 da, sonst würde ich glatt mal ein wenig damit rumspielen

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    15.08.2013
    Ort
    Güstrow
    Beiträge
    31
    Vielen Dank für Eure Antworten.

    Das war ein guter Tipp mit dem Kommandobyte. Das probiert ich heute Abend mal aus.
    Ich hab an dem Treiber zwei Anzeigen dran, da ich Werte von 0 bis ca. 65 anzeigen lassen will. (Geschwindigkeitsanzeige für ne fahrende Bierkiste)
    Muss ich dann den Dezimalwert auch noch in Hex oder Bit umrechnen lassen oder muss ich jede Stelle der zweistelligen Dezimalzahl dann getrennt auf die
    jeweiligen Digits ausgeben lassen?

    The decode-mode register sets hexadecimal code
    (0–9, A–F) or no-decode operation for each digit. Each
    bit in the register corresponds to one digit.
    Ich lese das so, dass ich wenn ich die hexadezimale Ausgabe haben möchte, dieses Register setzen muss.
    Ich glaube, ich probier auch mal &b00000000 aus für "keine Änderung am Standard.
    Heute Abend gibt's mehr.

    Gruß Udo
    Geändert von therealosram (13.11.2014 um 15:07 Uhr)

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705
    Hi Udo,

    schade dass ich so´n IC gerade nicht da habe - das Datenblatt klingt interessant und ich würde gerne einiges ausprobieren
    Inzwischen glaube ich folgendes zu verstehen:

    1. Man muss mehrstellige Zahlen wohl tatsächlich in Hunderter, Zehner und Einer zerlegen und sie einzeln rüberschicken.

    2. Das Decode Mode Register scheint festgzulegen, wieviele Stellen ("Digits") angezeigt werden sollen. Tab.7 im Datenblatt ist da sehr aufschlussreich. Wenn &b00000000 drinsteht (wie nach dem Power-On) findet gar keine Decodierung von binär nach (hexa)dezimal statt. Für eine zweistellige Zahl (also die Digits 1 und 2) müsste man also &b00000010 in dieses Register schreiben.

    3. Die Ziffern, die in den Digits tatsächlich angezeigt werden sollen, müssen dann per I2C in die Register "Digit 1.... Digit 4" geschrieben werden. Hierbei ist die Funktion interessant, dass der MAX die Adresse des nächsten zu beschreibenden Registers automatisch um 1 erhöht, nachdem er ein Datenbyte empfangen hat. Man müsste wahrscheinlich also nur die Adresse des ersten Digits senden (&b00100000) und dann alle darzustellenden Ziffern einfach nacheinander weg.

    4. Wenn dieser Thread noch länger geht, besorge ich mir irgendwo so´n Teil und probiere es selber aus

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    15.08.2013
    Ort
    Güstrow
    Beiträge
    31
    Hab noch einen liegen. Wenn der nicht so teuer wär, würd ich ihn dir glatt schicken

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    15.08.2013
    Ort
    Güstrow
    Beiträge
    31
    Das hat leider auch nicht funktioniert

    HTML-Code:
          Zehner = X / 10
          Zehner = Zehner Mod 10
          Einer = X Mod 10
    
    
          I2cstart
          I2cwbyte &B01110000
          I2cwbyte &B00100000
          I2cwbyte Zehner
          I2cwbyte &B00100001
          I2cwbyte Einer
          I2cstop

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705
    Ich glaube das Problem ist, dass der MAX nicht wissen kann, dass &b00100000 und &b00100001 die Adressen der zu beschreibenden Register sind.
    Im Datenblatt steht folgendes:

    The address pointer in the MAX6958/MAX6959 autoincrements
    after each data byte. If multiple data bytes
    are transmitted before a STOP condition is detected,
    these bytes are stored in subsequent MAX6958/
    MAX6959 internal registers (Figure 8 ), unless the
    address pointer has reached address 01111111. The
    address pointer does not autoincrement once address
    01111111 has been reached (Table 3).

    Das heißt also, er schreibt den Wert "Zehner" noch korrekt in das Register &B00100000. Das nächste Byte (&b00100001) wird dann aber wieder als Datenbyte interpretiert und in das nächsthöhere Register geschrieben, und das Byte "Einer" in das wiederum nächsthöhere Register.

    Andersrum gesagt würde ich es mal so versuchen, einfach nur das erste Digit-Register zu adressieren (also &b00100000), und dann beide Ziffern-Bytes nacheinander zu senden. Sie müssten dann von selbst in den beiden aufeinanderfolgenden Registern (00100000 und 0100001) landen.

    Bleibt natürlich noch ein Problem: Das Decode-Mode-Register (0x01): Da steht beim Einschalten ´ne &b00000000 drin - also "no decode for digits 3-0".
    Damit die Digits 0 und 1 angesteuert werden, muss da &b00000011 reingeschrieben werden. Dieses Register steht aber an einer ganz anderen Stelle als die anderen zu beschreibenden Register, so dass man das nicht unmittelbar hintereinander weg per automatischem Increment machen kann.

    Ich würde also mal versuchen, zuerst das data decode register zu beschreiben, und dann in einem zweiten Teil die eigentlichen Ziffern in die Digit-Register:

    I2cstart
    I2cwbyte &b01110000
    I2cwbyte &b00000001 (Adresse des Data Decode Registers)
    I2cwbyte &b00000011 (=Digits 0 und 1)
    I2cstop

    I2cstart
    I2cwbyte &b01110000
    I2cwbyte &b00010000 (= 0x20, Adresse Digit 0)
    I2cwbyte Einer
    I2cwbyte Zehner (geht automatisch ins Register 0x21)
    I2cstop

Seite 1 von 4 123 ... LetzteLetzte

Ähnliche Themen

  1. Verkaufe 100mm 7 Segment anzeigen
    Von atmega318 im Forum Kaufen, Verkaufen, Tauschen, Suchen
    Antworten: 0
    Letzter Beitrag: 14.04.2013, 14:13
  2. 7 Segment Anzeigen ?
    Von KrosseKrabbe im Forum Suche bestimmtes Bauteil bzw. Empfehlung
    Antworten: 6
    Letzter Beitrag: 14.04.2011, 20:20
  3. 2-Farbige 7-Segment-Anzeigen?
    Von Jaecko im Forum Suche bestimmtes Bauteil bzw. Empfehlung
    Antworten: 3
    Letzter Beitrag: 10.05.2009, 18:02
  4. k8055 und 7-Segment Anzeigen?
    Von elvis im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 16.05.2007, 15:09
  5. unbekannte 7-Segment-Anzeigen
    Von orph im Forum Elektronik
    Antworten: 14
    Letzter Beitrag: 08.05.2006, 00:07

Stichworte

Berechtigungen

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