Liste der Anhänge anzeigen (Anzahl: 1)
4x7 Seg. mit 3 Ader SW SPI, Einstieg mit BASCOM u. ATtiny45
Hallo,
weil es mit µC viel einfacher ist um alle technischen Probleme zu lösen, konnte ich der Versuchung nicht standhalten :-) und hab mit µC Anwendung begonnen. Zum Einstieg in die Programmierung und als Übungsprojekt sollte zunächst mal eine 4 X 7 Segment low current LED Anzeige angesteuert werden.
Die Anzeige hat 11 Anschlüsse. Sieben zur Segmentansteuerung plus vier zur Ziffernaktivierung. Gemeinsame Anode pro Ziffer. Wenn man vier Ziffern gleichzeitig darstellen möchte, muß also gemultiplext werden.
Außerdem hat der vorhandene ATtiny45 nur fünf verwendbare Portpins, vom RESET Pin mal abgesehen, - ein Portexpander muß also auch noch her.
Über den RN-Wissen Artikel ist angehängte Schaltung und folgendes BASCOM Testprogramm entstanden (In der Schaltung sind Abblock- und Pufferkondensatoren nicht eingezeichnet, VCC=5V)
Code:
'###################################################
'File: schiebe.bas
'Tests on three wire software spi - output only
'on Displayunit: 4 X 7 segment low current LED
'HW circuit: ATtiny45_4_X_7_Segment_SPI
'#######################################################
$regfile = "attiny45.dat"
$eepleave
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 1000000
Dim X As Byte
Dim Y As Byte
Dim Init7segment As Byte
Dim Dunkelziffer As Byte
Dim Displaydigit(16) 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
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
Dunkelziffer = &B01111111 'senden um eine Ziffer dunkel zu schalten
'Nutzung von Software SPI
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 die erste Ziffer der 4 X 7 Segmentanzeige adressiert -> reset des 4017
Init7segment = &B11111111
Spiout Init7segment , 1
Do
'alle Segmente mit Ziffer 8 für ca. 10s flimmerfrei einschalten
For Y = 1 To 7
For X = 0 To 255
Spiout Displaydigit(9) , 1
Waitms 5 'bei "waitms 10" -> flimmern erkennbar
Next X
Next Y
'alle Hexziffern langsam der Reihe nach durchgehend anzeigen
'Ziffern müssen per Spiout byte für byte gesendet werden um die
'HW Ziffernweiterschaltung per SS sicherzustellen!
For X = 1 To 16
Spiout Displaydigit(x) , 1
Waitms 500
Next X
'alle Hexziffern der Reihe nach an der letzten (rechten) Seite des Diplays anzeigen
For Y = 1 To 16
For X = 1 To 3 'die ersten 3 Stellen ausschalten
Spiout Dunkelziffer , 1
Next X
Spiout Displaydigit(y) , 1
Waitms 500
Next Y
Loop
End
Anmerkung zur Funktionsweise: Wenn ein Byte per SPIOUT gesendet wird, wechselt die SlaveSelect-leitung kurz vor Anlegen des ersten Datenbit von HIGH auf LOW. Sind alle Bits von SPIOUT gesendet, wechselt die SS Leitung wieder nach HIGH. Das ist anders als es im Portexpanderartikel im Diagramm "Signalfolge" dargestellt ist.
Vielleicht liegt es am ATtiny und ATMegas verhalten sich anders?
Die Fuse Bits befinden sich im Auslieferungszustand und damit ist der Systemtakt 1MHz. Die Taktrate auf der Clock-leitung für SPI beträgt hier gemessene 25KHz.
Weil noch 2 Ports frei sind, könnte man noch ein Poti am ADC anschließen und am anderen ein Servo. Vielleicht ergibt das ein Servotester mit digitaler Anzeige der Pulsweite. Mal sehen, wo mich der Weg hinführt - hoffentlich nicht direkt in den GAU :) :-) :-) Wie auch immer - es macht Spaß!
Fragen, Kritiken, Kommentare, etc wie immer willkommen!
PS: Bis die Funktion endlich erfüllt war, ist die HW unbemerkt gewachsen :); auf dem Steckbrett kein Problem.
EDIT: alten Titel "4x7 Segment Anzeige mit 3 Ader SW SPI, Servotester?" geändert.
Gruß
Searcher
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
da haben sich ja gleich die beiden Auslöser für meinen µC Einstieg gemeldet :-)
@hardware.bas: Danke für die Anerkennung. Bestimmt wird man für die Anzeige einen größeren µC nehmen. Das Ding hab ich irgendwo ausgeschlachtet und leider kein Datenblatt gefunden. Ein Segment leuchtet mit 2mA schon recht hell. Müßte ohne Treiber also noch gehen. Der 74HC245 ist nur drin, weil der HEF4017 nicht viel Strom liefert. Mit 74HC4017 braucht man den 74HC245 in dieser Schaltung dann auch nicht. Ist aber noch kein festes Projekt sondern einfach Freude am Experimentieren und Räder neu erfinden :-)
@PICture: Auch Dir danke. Ich verwende die Schaltung von hardware.bas für den Programmierdongle. Bei meinen ersten Versuchen mit low current LED blinken lassen hatte ich festgestellt, daß ohne Stromversorgung und mit eingstecktem Dongle die LED schwach leuchtete. Konnte nur vom PC kommen. Als erste Abhilfe eine 1N4148 Diode in die + Leitung des Dongles geschaltet, so daß nur von µC Schaltung der Strom zum Dongle fließen kann.
Als nächstes fand ich auf der RESET Leitung ein GND nach Einschalten des PC, das auch nach vollständigem Booten des PC nicht verschwand (bei an beiden Enden gestecktem Programmierkabel und Spannung auf der µC Schaltung). Erst nach Starten von BASCOM und erstmaligem Ansprechen der Programmierschnittstelle verschwand der GND. Grund lag darin, daß bei meinem PC die entsprechenden LPT Pins auf LOW initialisiert waren - das hat den 74HC125 durchgeschaltet. Erst durch BASCOM wurden die dann "günstig" gesetzt. Dazu ist zu sagen, daß auf dem PC mit WINXP SP3 noch kein Drucker eingerichtet war und ich streng nach BASCOM Hinweis einen HP Laserjet 4 für BASCOM installiert habe. Der Effekt verschwand erst, nachdem ich dann einen "Generic / Text only" Drucker zusätzlich installiert hatte. Es spielt keine Rolle, welcher Drucker als Defaultprinter bestimmt ist - Jetzt sind nach Booten des PC alle LTP Pins auf HIGH.
Hab mal ein Foto von meiner "Testumgebung" angehangen. Für den Dongle benutze ich einen gesockelten :) M74HC125B1 von ST. Als Kabel hab ich das Erstbeste ausprobiert, das mir in die Hände gefallen ist - Es ist 6 adriges flaches Telefonkabel; 1,70m lang und mir war nicht ganz wohl dabei. Bin aber bis jetzt sehr zufrieden damit. Wenn ich mich recht erinnere hab ich da einen Programmiertakt von 48KHz ausgemacht, der sich sogar erhöhte, nachdem ich die $CRYSTAL Einstellung veränderte. Werd das bei Gelegenheit nochmal verifizieren. Hab alles so auf Lochraster bekommen das es in das SUB-D Gehäuse passt.
Scheint mir recht unempfindlich zu sein und bin gespannt, wie lange das noch gut geht :-)
Gruß
Searcher
EDIT: hier noch der Schaltplan zum Dongle (credits to hardware.bas). Bei mir ist in der + Leitung noch eine 1N4148 Diode mit Kathode in Richtung Dongle drin.
Bild hier
Bild hier
Liste der Anhänge anzeigen (Anzahl: 1)
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 :-b Die Experimente sind jedoch sehr aufschlußreich.
Gruß
Searcher
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
Liste der Anhänge anzeigen (Anzahl: 4)
So, die asynchron gemultiplexte 4-fach Siebensegmentanzeige mit SPI Interface existiert nun nicht mehr nur auf dem Steckbrett.
Anhang 19463 Anhang 19464 Anhang 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
Liste der Anhänge anzeigen (Anzahl: 1)
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:confused: 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