- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 10 von 36

Thema: 4x7 Seg. mit 3 Ader SW SPI, Einstieg mit BASCOM u. ATtiny45

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.715
    Blog-Einträge
    133
    Hallo,
    diesmal habe ich mit einer IR-Fernbedienung gespielt. Einen TSOP an PB4 und das GETRC5 Kommando ausprobiert. Weil das so einfach lief habe ich dann noch den Power-down des µC und Watchdogfunktion hinzugefügt. Das war dann schon etwas verzwickter um eine annehmbare Funktion hinzubekommen.
    Code:
    '###############################################################################
    'File: RC5.bas
    '4 x 7 Segment zeigt via Infrarotfernbedienung empfangene RC5 Nachricht in hex
    'IDE: BASCOM-AVR Demoversion 1.11.9.8
    'HW circuit: ATtiny45_4_X_7_Segment_SPI (TSOP nicht eingezeichnet)
    'Anzeigemultiplexing via Timer1
    'TSOP an PB4. Bascom Kommando Getrc5 nutzt Timer0 !!!
    '
    'Grober Ablauf:
    'Nach Einschalten oder Watchdogablauf initialisieren und dann in "Power-down"
    'Bei IR Empfang wird µC per Pin Change Interrupt aufgeweckt
    'Mit Watchdog wird auf gültige RC5 Nachricht überwacht
    'Ungültige Nachricht und Ausschalten wird 4s lang mit liegenden Strichen angekündigt
    'Gültige Nachricht bleibt solange stehen bis sie durch neue gültige Nachricht ersetzt wird
    'Ausschalten in den "Power-down" mit Standby Taste oder Watchdogablauf wg. ungültiger Nachricht
    '###############################################################################
    
    $regfile = "attiny45.dat"
    $eepleave
    $framesize = 32                         'default?
    $swstack = 32                           'default?
    $hwstack = 48                           'hwstack reichlich wg Interruptroutine
    $crystal = 8000000
    $lib "mcsbyte.lbx"                      'only byte operations
    
    Dim Displaydigitaddress(4) As Byte      'pointer to segmentpattern
    Dim Address As Byte , Command As Byte   'variables for getrc5
    Dim Digitposition As Byte               'actual digit position, left to right = 1..4
    Dim Helperbyte As Byte                  'multipurpose
    
    'Nutzung von Software SPI - nur Output
    Config Spi = Soft , Dout = Portb.0 , Ss = Portb.1 , Clock = Portb.2
    Spiinit
    'mit Senden von acht high bits sicherstellen, daß über Q7 des Schieberegisters
    'der HEF4017 erste Ziffer der 4 X 7 Segmentanzeige adressiert -> reset des 4017
    Helperbyte = &B11111111
    Spiout Helperbyte , 1
    
    Config Timer1 = Timer , Prescale = 128  'Anzeigetimer ~60Hz pro Ziffer (RCO=8MHz)
    On Ovf1 Isr_display_digit
    
    Config Watchdog = 4096                  '4096 ms timeout
    
    Config Rc5 = Pinb.4                     'TSOP at PB4
    Set Pcmsk.pcint4                        'enable Pin Change Interrupt on TSOP activity
    
    On Pcint0 Show_dashes                   'if PCINT then display dashes
    
    Enable Interrupts
    
    Enable Pcint0                           'enable wake up on Pin Change Interrupt
    Power Powerdown                         'switch µC down, wait for PCINT (IR signal)
    Disable Pcint0                          'in power up avoid further PCINTs
    Enable Ovf1                             'enable display interrupt
    
    Start Watchdog                          'supervise for valid RC5 message
    
    Do
       Getrc5(address , Command)            'function returns FF FF if no RC5 message
       If Address <> &HFF Then              'RC5 message received then...
          Command = Command And &B01111111  'set toggle bit to zero
          Stop Watchdog                     'stop watchdog due to accepted RC5 message
          If Command = &H0C Then            'if "Standby" command received then...
                Gosub Show_dashes           'announce Power-down
                Waitms 4000                 'show dashes for 4 seconds
                Gosub Display_dark          'switch all segments off
                Enable Pcint0               'enable wake up on new TSOP (IR) signal
                Power Powerdown             'switch µC down, wait for PCINT (IR signal)
                Disable Pcint0              'in power up avoid further PCINTs
                Start Watchdog              'supervise for valid RC5 message
             Else
                Gosub Message_to_display    'display all RC5 messages except "Standby"
          End If
       End If
    Loop
    
    Display_dark:                           'all segments off
       Displaydigitaddress(1) = 16
       Displaydigitaddress(2) = 16
       Displaydigitaddress(3) = 16
       Displaydigitaddress(4) = 16
       Waitms 100                           'give time to multiplex
    Return
    
    Show_dashes:                            'dashes to display
       Displaydigitaddress(1) = 17
       Displaydigitaddress(2) = 17
       Displaydigitaddress(3) = 17
       Displaydigitaddress(4) = 17
    Return
    
    Message_to_display:                     'RC5 address and command to display
       Displaydigitaddress(1) = Address
       Shift Displaydigitaddress(1) , Right , 4
       Displaydigitaddress(2) = Address
       Displaydigitaddress(2) = Displaydigitaddress(2) And &H0F
       Displaydigitaddress(3) = Command
       Shift Displaydigitaddress(3) , Right , 4
       Displaydigitaddress(4) = Command
       Displaydigitaddress(4) = Displaydigitaddress(4) And &H0F
    Return
    
    Isr_display_digit:                      'on each interrupt OVF1 send one digit
       Digitposition = Digitposition And &B00000011       'if Digitposition = 4 -> 0
       Incr Digitposition                   'set digit position
       Helperbyte = Lookup(displaydigitaddress(digitposition) , Segmentpattern)
       Spiout Helperbyte , 1                'send digit to display
    Return
    
    Segmentpattern:                         'darzustellende Zeichen (hex 0..F...)
            '0gfedcba (segmente, msb immer 0)
       Data &B01000000                      'Ziffer "0", 0 = segment ein, 1 = aus
       Data &B01111001                      'Ziffer "1"
       Data &B00100100                      'Ziffer "2"
       Data &B00110000
       Data &B00011001
       Data &B00010010
       Data &B00000010
       Data &B01111000
       Data &B00000000
       Data &B00010000
       Data &B00001000
       Data &B00000011
       Data &B01000110
       Data &B00100001
       Data &B00000110                      'Ziffer "E"
       Data &B00001110                      'Ziffer "F"
       Data &B01111111                      'dunkel
       Data &B00111111                      'nur Segment g eingeschaltet=Strich
    Kritik, Fragen etc. willkommen.

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.715
    Blog-Einträge
    133
    Hallo,
    sportlicher Ehrgeiz varanlasste mich zu versuchen mit dem BASCOM-AVR SPIOUT Kommando die 4 X 7 Segmentanzeige mit nur noch zwei Adern anzusteuern. Vom ATtiny45 aus sind jetzt nur Dout und Clock notwendig:
    Config SPI = Soft , Dout = PORTB.0 , Clock = PORTB.2

    Ohne Slave Select werden benötigte Steuersignale für Schieberegister und Ziffernweiterschaltug per HW aus dem SPI Takt gewonnen. Dabei gelang es mir durch viel Fummelei einen stabilen Zustand beim Stromeinschalten herzustellen.

    Schaltbild im Anhang

    Die Schwierigkeit, die es zu überwinden galt, war der 4017 in der Mitte des Schaltbildes, der oft irgendwelche Zustände nach Einschalten hatte und dann Segmente und Ziffern durcheinanderwarf. Ohne aufwendige Resetschaltung haben dann die beiden 100k Widerstände an MR und CP1 geholfen. Wie stabil das auf Dauer ist unterliegt jetzt einer Langzeitstudie

    Natürlich ist der HW Aufwand unverantwortbar und jetzt auch noch überproportional zu der eingesparten Ader gestiegen Die Experimente sind jedoch sehr aufschlußreich.

    Gruß
    Searcher
    Angehängte Dateien Angehängte Dateien
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.715
    Blog-Einträge
    133

    Asynchron gemultiplexte 4 X 7 Segment Speicheranzeige mit 74xx595 für 2 Ader SW-SPI

    Hallo,
    ich hatte da noch ein paar Chips rumliegen und wie immer zu wenig Pins an meinem ATtiny45. Wie der Vorgänger wird diese Anzeige auch nur mit 2 Ader in SW-SPI angesteuert.

    Bei dieser neuen Version ist es aber nicht mehr notwendig die einzelnen Ziffern vom µC aus zu multiplexen. Die einmalige Ausgabe aller 4 Ziffern wird in den kaskadierten Schieberegistern gespeichert und durch einen externen Takt zb von einem 555, an die Siebensegmentanzeige ausgegeben.

    Die Inverter sorgen dafür, daß durch inaktiv schalten von Output Enable am 595 alle Ausgänge hochohmig werden, bis auf die, die gerade zur Segmentansteuerung gebraucht werden.

    Jetzt brauch ich nur per SPI entsprechende Daten dann auszugeben, wenn sie wirklich anfallen und kann dadurch Recourcen zum Multiplexen einsparen.

    Na gut, sowas könnte man sicher auch einfach haben. Für mich war und ist es eine schöne Übung. Konnte bisher nur 2 Ziffern realisieren, da mir noch zwei 595er fehlen.

    Code:
                                                   VCC                  .-----------------.
                                                    +                   |       .---------)-.  irgendein
                                                    |      .------------)-------)---.     | |      Takt
                                                    o------)------------)-----. | .-)-----)-)-------<
                                                    |      |            |     | | | | | | | |
          Seg A                                     |     ===           |     o_o_o_o_o_o_o_o
     D1.->|--o--   Q0-------------------------------)--.  GND           |    |  4017         |
       |     |B                              __     |  |                |    |1_ _ _ _ _ _ _ |
       |->|--)--   Q1---------------o------o|1 |o---o  |                |     o o o o o o o o
       |     |     Q2-------------o-)------o|  |o---)--o       ---------)--.  | | | | | | | |
             |     Q3-----------o-)-)------o|  |o---)--)------'    /|   |  |      | | |     |
             |     Q4---------o-)-)-)------o|  |o---)--)------o--O< |---)--)------. | |     |
             |     Q5-------o-)-)-)-)------o|  |o---)--)------'    \|   |  |      | | |     |
             |     Q6-----o-)-)-)-)-)------o|  |o---)--)----.   Inverter|  |      | | |     |  SPI data
             |            | | | | | |     -o|  |o---o  |    |           |  '------)-)-)-----)-------<
        Seg A|            | | | | | |   o--o|__|o---)--)--. |           |         | | |     |
     D2  ->|-o            | | | | | |   |   595     |  |  | |           |         | | |     |  SPI clock
             |            | | | | | |   |    __     |  |  | o-----------)---------)-)-)-----)-------<
     D3  ->|-o            | | | | | o---)--o|1 |o---o  |  | |           |         | | |     |
             |            | | | | o-)---)--o|  |o---)--o  | |           |         | | |     |
     D4  ->|-'            | | | o-)-)---)--o|  |o---)--)--' |      /|   |         | | |     |
                          | | o-)-)-)---)--o|  |o---)--)----)-o--O< |---)---------)-. |     |
                          | o-)-)-)-)---)--o|  |o---)--)----)-'    \|   |         | | |     |
     4 X 7 Seg            o-)-)-)-)-)---)--o|  |o---)--)----o           |         | | |     |
     mit gem. Anode       | | | | | |   | -o|  |o---o  |    |           |         | | |     |
                          | | | | | |   o--o|__|o---)--)--. |           |         | | |     |
                          | | | | | |   |    595    |  |  | |           |         | | |     |
                          | | | | | |   |    __     |  |  | |           |         | | |     |
                          | | | | | o---)--o|1 |o---|  |  | |           |         | | |     |
                          | | | | o-)---)--o|  |o---)--o  | |           |         | | |     |
                          | | | o-)-)---)--o|  |o---)--)--' |      /|   |         | | |     |
                          | | o-)-)-)---)--o|  |o---)--)----)-o--O< |---.         | | |     |
                          | o-)-)-)-)---)--o|  |o---)--)----)-'    \|   |         | | |     |
                          o-)-)-)-)-)---)--o|  |o---)--)----o           |         | | |     |
                          | | | | | |   | -o|  |o---'  |    |           |         | | |     |
                          | | | | | |   o--o|__|o------)--. |           |         | | |     |
                          | | | | | |   |    595       |  | |           |         | | |     |
                          | | | | |    ===             |  | |           |         | | |    ===
                          | | | |      GND             |  | |      /|   |         | | |    GND
                          | | |                        |  | | .--O< |---)---------)-)-.
                          | |                          |  |   |    \|   |         | | |
       eventuell         Q6                           Q0  |   |         |         | | |
       Treiber                                                          |         | | |
         /|     Digit 1                                                 |         | | |
      --< |-------------------------------------------------------------)---------' | |
         \|   D2 -------------------------------------------------------)-----------' |
           D3 ----------------------------------------------------------              |
         D4 --------------------------------------------------------------------------'
    
    
    
    
                            Pin Belegung
    
               74HC595N                          HEF4017B
                 __                                 __
           Q1 -o|1 |o- VCC                    Q5 -o|1 |o- VCC
           Q2 -o|  |o- Q0                     Q1 -o|  |o- MR
           Q3 -o|  |o- Ds                     Q0 -o|  |o- CP0
           Q4 -o|  |o- OE (low aktiv)         Q2 -o|  |o- CP1 (low aktiv)
           Q5 -o|  |o- STcp                   Q6 -o|  |o- Q5-9 (low aktiv)
           Q6 -o|  |o- SHcp     .             Q7 -o|  |o- Q9
           Q7 -o|  |o- MR (low aktiv          Q3 -o|  |o- Q4
          GND -o|__|o- Q7'                   GND -o|__|o- Q8

    PS Frisch vom Basteltisch weiß ich noch nicht ob es versteckte Fehler gibt. Bis jetzt funktioniert es perfekt. (Hoffe natürlich auch, das ich die ASCII Art fehlerfrei hinbekommen habe

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  4. #4
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Wenn man die Anzeigen gar nicht gemultiplext ansteuern will, kann man sich den 4017 und die Transistoren ganz sparen, und die Anzeigen direkt an die HC595 legen. Und die Anoden fest auf VCC. Das geht aber nur wenn die Anzeigen nicht schon mit den Segmenten verbunden sind. Sonst wäre es einfacher statt der ganzen Logic einen kleinen µC (Tiny261 ) zu nehmen.

    Bei der Schaltung so wie gezeigt braucht man wirklich die OE Pins. Es könnte noch der Anschluss für die Datenübernahme beim 595 fehlen.

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.715
    Blog-Einträge
    133
    Das geht aber nur wenn die Anzeigen nicht schon mit den Segmenten verbunden sind
    @Besserwessi: Danke für die Vorschläge. Leider muß ich multiplexen. Liegt an der Art des Displays. Wie im anderen thread schon beschrieben, ist es eine 4-fach Anzeige in einem Block. Zur Ansteuerung aller 4 Ziffern (28 Segmente) gibt es nur 11 Anschlüsse. (1 Anschluß (gemeiname Anode) pro Ziffer = 4 und 7 Anschlüsse der gleichen parallel geschalteten Segmente aller Ziffern)

    Datenübenahme klappt. Am 595 sind OE und STcp parallel geschaltet. Wenn dort getoggelt wird, gehen die Daten vom Shiftregister ins Outputregister. und spätestens beim nächsten Toggle auf die Ausgänge.

    Anzeige ist ähnlich dieser mit CODE A: http://www.leds.com.hk/pdf/49KT40281AD.pdf

    Gruß
    Searcher
    Geändert von Searcher (24.07.2011 um 13:43 Uhr)
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.715
    Blog-Einträge
    133
    So, die asynchron gemultiplexte 4-fach Siebensegmentanzeige mit SPI Interface existiert nun nicht mehr nur auf dem Steckbrett.

    Klicke auf die Grafik für eine größere Ansicht

Name:	AsynchronMultilpexed_4X7_Seg_gesamt.jpg
Hits:	15
Größe:	29,3 KB
ID:	19463 Klicke auf die Grafik für eine größere Ansicht

Name:	AsynchronMultilpexed_4X7_Seg_innen.jpg
Hits:	12
Größe:	33,8 KB
ID:	19464 Klicke auf die Grafik für eine größere Ansicht

Name:	AsynchronMultilpexed_4X7_Seg_unten.jpg
Hits:	15
Größe:	42,3 KB
ID:	19465

    Der Anzeigeblock ist für Multiplex vorgesehen und war bisher auf Lochraster nur mit Vorwiderständen für die Segmente aufgebaut. Nun wurde auf 2 weiteren Platinen die Schaltung nach angehangenem Schaltplan hinzugefügt, die ein Offline multiplexen durch Speicherung in Schieberegistern ermöglichen.

    Die oberste Platine enthält den Memoryblock mit den vier Schieberegistern. Die darunter die Transistorzifferntreiber, den 4017er Dekadenzähler und den LUV04 sechsfach Inverter, Taktgenerator. Die unterste trägt den Anzeigeblock mit den Segment-LED Vorwiderständen.

    Die anzuzeigende Information wird über zwei SPI Adern, DATA und CLOCK, zur Anzeige übertragen - GND und VCC natürlich auch mit dem SPI Sender verbunden. Die 74HC595 speichern die 4 Byte solange bis sie von anderen Bytes überschrieben werden. Die Verschaltung mit HEF4017 und Taktgenerator bringen die gespeicherten Informationen im Multiplex zur Anzeige.

    Dadurch, daß das Ganze in HW realisiert wurde, wurden doch einige Verdrahtungsarbeiten fällig. Eigentlich wollte ich Höhe der beiden Zusatzplatinen auf die Höhe der Anzeige begrenzen. Das war mir jedoch nicht möglich. Damit ich wenigstens die angepeilte Fläche nicht überschritt, habe ich die vier Schiebergister im Huckepack auf die Platine gebracht und geriet doch noch in der Enge in Verdrahtungsnot. Einige Lötstellen sind nicht so schön, wie ich sie gerne gahabt hätte, egal - elektrisch einwandfrei ist besser als schöne geschmolzene Isolation bei Nachbesserungsversuchen.

    Bei der nächsten wird es besser ...


    Gruß
    Searcher
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken Schaltplan_7_Seg.jpg  
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.715
    Blog-Einträge
    133
    Die Anzeige war mir doch etwas duster und habe das Display wieder umgebaut. Neuer Schaltplan anbei.

    Damit die parallel geschalteten Ausgänge der 74HC595 nicht gleichzeitig eingeschaltet werden können, wird nur jedes zweite high an den Ausgängen des 4017 zur Durchschaltung genutzt. Nachteil vorher: die Segmente sind durch die gleichmäßige Taktung länger ausgeschaltet als es sein müßte, nur um ein sicheres Abschalten der Ausgänge vor Einschalten der nächsten Ausgänge zu gewärleisten.

    Über Kondensator C2 wird nun, sobald ein Zwischenschritt auftritt, der 4017 sofort mit einer kleinen Verzögerung weitergeschaltet und die nächsten Ziffernsegmente aktiviert.

    Damit ist die Ausschaltedauer gegenüber der Einschaltedauer erheblich verkürzt. Außerdem wurden die LED-Vorwiderstände auf 360 Ohm verringert und die Doppelpunkte in der Mitte der Anzeige auch noch angeschlossen. Pro Segment sind damit ca 5mA bei 5V VCC eingestellt. Der HEF4017B ist etwas schwach und seine Ausgangsspannung sinkt etwas, wenn die Transistoren viele Segmente treiben müssen. Wird bei Gelegenheit gegen 74HC4017 ausgetauscht obwohl optisch nicht wahrnehmbar.

    Ich glaub jetzt bin ich wirklich zufrieden und könnte mit den Doppelpunkten nun sogar die Zeit anzeigen lassen ...

    PS Entschuldigung für die schlechte Qualität des Schaltbildes. Ich experimentiere noch, wie ich aus LTspice vernünftige PNGs rausbekomme.

    Gruß
    Searcher
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken Async_multiplex_7_Seg_V1.2.png  
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

Berechtigungen

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

LiFePO4 Speicher Test