- 12V Akku mit 280 Ah bauen         
Seite 3 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 21 bis 30 von 36

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

  1. #21
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Anzeige

    Praxistest und DIY Projekte
    So,
    jetzt funktioniert auch die Ziffernausgabe mit Timer. Dabei mußte ich wohl den Fehler machen, das man in Bascom mit sowas ohne Warnung Probleme kriegt:
    Spiout Displaydigit(Displaydigitaddress(x) + 1) , 1

    und besser so macht:
    Y = Displaydigitaddress(x) + 1
    Spiout Displaydigit(y) , 1


    entsprechende Codeschnipsel:
    Code:
    .
    .
    '8 bit Timer zur Ziffernausgabe on Overflow 8MHz / 128 / 256 ~ 244 Hz ~ 60Hz pro Ziffer
    Config Timer1 = Timer , Prescale = 128
    On Ovf1 Isr_timer1
    Enable Timer1
    .
    .
    Isr_timer1:   'wird ca. 244 mal / Sek. aufgerufen und zeigt jedesmal 1 von 4 Ziffern an
       If X > 4 Then
          X = 1
       End If
       Y = Displaydigitaddress(x) + 1
       Spiout Displaydigit(y) , 1
       X = X + 1
    Return
    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  2. #22
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Hallo,
    ein weiteres Machwerk auf dem Weg zum Servotester mit Pulsweitenanzeige. Noch nicht ganz ausgereift und die Auflösung ist noch verbesserungswürdig. Aber damit hab ich hoffentlich schon ein paar Hürden zum Verstehen des ATtiny45 überwunden.

    Mit dem CONFIG SERVO Befehl des BASCOM-AVR kam ich überhaupt nicht klar. Nach meinen Erfahrungen zu ungenau, abhängig von $CRYSTAL und sobald ISR laufen, nicht mehr kalkulierbar.

    Deshalb den Timer1 "per Hand" für PWM konfiguriert. Da der Servo ein Impuls alle 20ms braucht, der zwischen 1 bis 2 ms lang sein soll und dieser Impuls auch noch möglichst fein einstellbar sein soll und auch noch sehr konstant sein muß, hab ich folgende Lösung versucht:
    Kleinste Auflösung für Servopulseinstellung=16µs. Da man bei dem 8bit Timer damit nicht auf die 20ms Pulsabstand kommt - den Timer dann alle 5 Mal mit der Pulsweite als "Monoflop" Interrupt gesteuert auf den Ausgang wirken lassen - funktioniert.
    Pulsweite einstellbar mit 10k Poti am ADC.

    Code:
    '###################################################
    'File: Servotester mit Display.bas
    'IDE: BASCOM-AVR Version 1.11.9.8
    'HW circuit: ATtiny45_4_X_7_Segment_SPI (ADC- & Servoanschluß nicht eingezeichnet)
    'Multiplexing und Servosignal via Timer1
    'Servo an PB4. 10k Poti für Servopulseinstellung an PB3
    '4 x 7 Segment zeigt Servopuls in ms an. Bereich 0,720ms bis 2,304ms in 16µs steps
    '#######################################################
    
    $regfile = "attiny45.dat"
    $eepleave
    $framesize = 32
    $swstack = 32
    $hwstack = 96                           'hwstack reichlich wg Interruptroutine
    $crystal = 8000000
    
    Dim X As Byte
    Dim Y As Byte
    Dim Z As Byte
    
    Dim Init7segment As Byte
    
    Dim Displaydigitaddress(4) As Word
    
    Dim Displaydigit(17) As Byte            'darzustellende Zeichen (hex 0..F)
                       '0gfedcba (segmente, msb immer 0)
    Displaydigit(1) = &B01000000            'Ziffer "0", 0 = segment ein, 1 = aus
    Displaydigit(2) = &B01111001            'Ziffer "1"
    Displaydigit(3) = &B00100100            'Ziffer "2"
    Displaydigit(4) = &B00110000
    Displaydigit(5) = &B00011001
    Displaydigit(6) = &B00010010
    Displaydigit(7) = &B00000010
    Displaydigit(8) = &B01111000
    Displaydigit(9) = &B00000000
    Displaydigit(10) = &B00010000
    Displaydigit(11) = &B00001000
    Displaydigit(12) = &B00000011
    Displaydigit(13) = &B01000110
    Displaydigit(14) = &B00100001
    Displaydigit(15) = &B00000110
    Displaydigit(16) = &B00001110
    Displaydigit(17) = &B01111111           'Wert um eine Ziffer dunkel zu schalten
    
    Displaydigitaddress(1) = 16             'Wenn noch keine Ziffer eingegeben -> dunkel
    Displaydigitaddress(2) = 16
    Displaydigitaddress(3) = 16
    Displaydigitaddress(4) = 16
    
    X = 0                                   'Initialisierung von Zählvariablen
    Y = 0                                   'Initialisierung von Zählvariablen
    Z = 0                                   'Initialisierung von Zählvariablen
    
    '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
    Init7segment = &B11111111
    Spiout Init7segment , 1
    
    
    Config Portb.4 = Output                 'PB4 as output
    Gtccr = Gtccr Or &B01100000             'set PWM1B & OC1B (PB4) to clear on compare
    Ocr1b = 94                              'set pulse to 1504µs (on 8Mhz, prescaler = 128)
    Ocr1c = 254                             'set min pwm frequency (8Mhz / 128 / 255 =~ 245 Hz
    Tccr1 = Tccr1 Or &B00001000             'set prescaler (128) switches timer on
    On Ovf1 Isr_timer1
    Enable Timer1
    
    
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    
    Dim Comparematchvalue_ocr1b As Byte
    Dim Adc_readout As Integer
    Dim Adc_str As String * 5
    Dim Char As String * 1
    Dim Channel As Byte
    Channel = 3                             'ADC3 (auf Pin PB3)
    
    Enable Interrupts
    
    Do
    
       Adc_readout = Getadc(channel)
       If Adc_readout < 10 Then
          Adc_readout = 10
          Elseif Adc_readout > 1000 Then
             Adc_readout = 1000
       End If
    
       Adc_readout = Adc_readout / 10
       Adc_readout = Adc_readout + 43
       Comparematchvalue_ocr1b = Adc_readout
       Adc_readout = Adc_readout * 16
    
       Adc_readout = Adc_readout + 10016
       Adc_str = Str(adc_readout)
       Char = Mid(adc_str , 2 , 1)
       Displaydigitaddress(1) = Val(char)
       Char = Mid(adc_str , 3 , 1)
       Displaydigitaddress(2) = Val(char)
       Char = Mid(adc_str , 4 , 1)
       Displaydigitaddress(3) = Val(char)
       Char = Mid(adc_str , 5 , 1)
       Displaydigitaddress(4) = Val(char)
    
    Loop
    
    End
    
    
    Isr_timer1:
    
    X = X And &B00000011
    X = X + 1
    Y = Displaydigitaddress(x) + 1
    Spiout Displaydigit(y) , 1
    
    If Z >= 4 Then
       Ocr1b = CompareMatchValue_OCR1B
       Bitwait Pinb.4 , Set
       Bitwait Pinb.4 , Reset
       Ocr1b = 0
       Z = 0
       Else
       Z = Z + 1
    End If
    
    Return

    Praxistest mit echtem Servo steht noch aus (nur mit Oszi und 10k Pulldown probiert)
    Anzeige flimmert leicht - warum auch immer - mal sehen...

    EDIT: wg. Flimmern siehe verbessertes Listing im Beitrag vom 12.02.2011 weiter hinten im thread

    Fazit - ich glaub ich hab den "nicht phasen korrekten PWM Timer" verstanden

    Bitte um Aufzeigen möglicher Probleme, Kommentare, Fragen, etc. willkommen.

    (hab mir vorgenommen, den Code demnächst noch ein bißchen besser zu kommentieren)

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

  3. #23
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Servotester hat auch den Praxistest bestanden. Kleines Video dazu:

    Bild hier  
    Bild klicken zum Video

    Die Anzeige flimmert zwar leicht, aber nicht sooo schlimm wie im Video. Meine/die Aufnahmetechnik hat da leider Grenzen.

    Der chip links unten mit den 4 Kondensatoren sind noch Überbleibsel von den UART Versuchen.

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

  4. #24
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.10.2008
    Ort
    Kehnert
    Beiträge
    1.159
    Mach Dir um das Flimmern im Video keine so grossen Gedanken.
    Das ist der typische Stroboskopeffekt, oder Alaysingeffekt, den
    man hat wenn das Multiplexing der Anzeige sich ungeradzahlig mit
    der Abtastfrequenz des Videos verhält. Also ganz normal. VG Micha

  5. #25
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Hallo,

    das Displayflimmern ist auf dem Video sehr stark und sicher größtenteils vom Stroboskopeffekt hervorgerufen worden. Es war aber sozusagen Angesicht zu Angesicht auch noch ein leichtes Flimmern zu erkennen, daß mir aber denn doch keine Ruhe gelassen hat.

    Lag daran, daß eine von 5 Ausgaben mit SPIOUT scheinbar auf Beendigung des Pulses gewartet hat. Das führte dann zu ungleichmäßigen Zeitabständen bei der gemultiplexten Ziffernausgabe. Mir ist noch nicht klar wie das sein konnte.

    Hab das Timing entzerrt und die Anzeige ist jetzt ganz sauber! Lasse nun auch keine anderen Aufgaben mehr vom Interrupt unterbrechen und hab alles überarbeitet und kommentiert.

    Code:
    '###################################################
    'File: Servotester mit Display.bas
    'IDE: BASCOM-AVR Version 1.11.9.8
    'HW circuit: ATtiny45_4_X_7_Segment_SPI (ADC- & Servoanschluß nicht eingezeichnet)
    'Multiplexing und Servosignal via Timer1
    'Servo an PB4. 10k Poti für Servopulseinstellung an PB3
    '4 x 7 Segment zeigt Servopuls in µs an. Bereich 0,720ms bis 2,304ms in 16µs steps
    'Version ohne flimmerndes Display :-)
    '#######################################################
    
    $regfile = "attiny45.dat"
    $eepleave
    $framesize = 32                         'default?
    $swstack = 32                           'default?
    $hwstack = 48                           'hwstack reichlich wg Interruptroutine
    $crystal = 8000000
    
    Dim X As Byte
    Dim Y As Byte
    Dim Z As Byte
    
    Dim Init7segment As Byte
    Dim Displaydigitaddress(4) As Byte
    
    Dim Displaydigit(10) As Byte            'darzustellende Zeichen (hex 0..F)
                       '0gfedcba (segmente, msb immer 0)
    Displaydigit(1) = &B01000000            'Ziffer "0", 0 = segment ein, 1 = aus
    Displaydigit(2) = &B01111001            'Ziffer "1"
    Displaydigit(3) = &B00100100            'Ziffer "2"
    Displaydigit(4) = &B00110000
    Displaydigit(5) = &B00011001
    Displaydigit(6) = &B00010010
    Displaydigit(7) = &B00000010
    Displaydigit(8) = &B01111000
    Displaydigit(9) = &B00000000
    Displaydigit(10) = &B00010000
    
    '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
    Init7segment = &B11111111
    Spiout Init7segment , 1
    
    X = 0                                   'Initialisierung von Zählvariablen
    Y = 0                                   'Initialisierung von Zählvariablen
    Z = 1                                   'Initialisierung von Zählvariablen
    
    Config Portb.4 = Output                 'PB4 as output, Servosignal
    Gtccr = Gtccr Or &B01100000             'set PWM1B & OC1B (PB4) to clear on compare
    Ocr1a = 160                             'timing for int OC1A behind pulse (> max ocr1b)
    Ocr1b = 0                               'if OCR1B = 0 -> Pin OC1B = low in PWM mode
    Ocr1c = 249                             'set pwm frq. (8Mhz / 128 / (249 + 1) = 250 Hz)
    Tccr1 = Tccr1 Or &B00001000             'set prescaler (128) switches timer on
    
    On Oc1a Isr_set_ocr1b                   'execute ISR on Timer 1 Comparematch A
    Enable Oc1a
    
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    
    Dim Comparematchvalue_ocr1b As Byte
    Dim Adc_readout As Integer
    Dim Adc_str As String * 5
    Dim Char As String * 1
    Dim Adc_channel As Byte
    
    Adc_channel = 3                         'ADC3 (at Pin PB3)
    
    Enable Interrupts
    
    Do
    
    Loop
    
    End
    
    
    'ISR wird angsprungen on Timer1 Compare Match A
    'Der Zeitpunkt (Ocr1a = 160) liegt "oberhalb" des Pulses von OCR1B <= 143
    'damit beeinflussen sich Ziffernausgabe und Pulserzeugung nicht
    Isr_set_ocr1b:
    
    X = X And &B00000011                    'X does not exeed the value of 3
    Incr X                                  'set digit position
    Y = Displaydigitaddress(x) + 1
    Spiout Displaydigit(y) , 1              'send digit to display
    
    If Z >= 5 Then                          'make one pulse out of five isr calls
          Ocr1b = Comparematchvalue_ocr1b   'put value for pulse lemgth into OCR1B
          Bitwait Pinb.4 , Set              'wait until pulse starts (TCNT1 at $00)
          Bitwait Pinb.4 , Reset            'wait until pulse ends (match on OCR1B)
          Ocr1b = 0                         'keep PINB.4 LOW
          Z = 1
       Else                                 'if no pulse do all other tasks
          Incr Z
          Adc_readout = Getadc(adc_channel) 'read ADC
          If Adc_readout < 10 Then          'trim small and large ADC values
                Adc_readout = 10
             Elseif Adc_readout > 1000 Then
                Adc_readout = 1000
          End If
          Adc_readout = Adc_readout / 10    'calculate units for the timer
          Adc_readout = Adc_readout + 43    'calculate units for the timer
          Comparematchvalue_ocr1b = Adc_readout       '16µs units -1 pulsewidth
    
          Adc_readout = Adc_readout * 16    'prepare display register
          Adc_readout = Adc_readout + 10016 'prepare display register
          Adc_str = Str(adc_readout)        'prepare display register
          Char = Mid(adc_str , 2 , 1)       'prepare display register
          Displaydigitaddress(1) = Val(char)       'prepare display register
          Char = Mid(adc_str , 3 , 1)
          Displaydigitaddress(2) = Val(char)
          Char = Mid(adc_str , 4 , 1)
          Displaydigitaddress(3) = Val(char)
          Char = Mid(adc_str , 5 , 1)
          Displaydigitaddress(4) = Val(char)       'prepare display register
    End If
    
    Return
    Entschuldigung wg. Mischmasch Deutsch-Englisch bei den Comments - Das Datenblatt macht einen komplett konfus

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

  6. #26
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    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

  7. #27
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    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

  8. #28
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    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

  9. #29
    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.

  10. #30
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    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

Seite 3 von 4 ErsteErste 1234 LetzteLetzte

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad