PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie richtig mit Bascom 7 Segmentanzeige Multiplexen



recovery
26.02.2017, 11:15
Hallo Gemeinde,
Ich da ein Problem auch wenn es tausende male durchgekaut wurde, ich habe eine vier stellige sieben Segmentanzeige mit gemeinsamer Kathode.
Natürlich wie es sich gehört habe ich auch googelt, mein Problem ist wie wird Software mäßig mit Bascom Siebensegmentanzeige Gemultiplext ?
Ständig stolpere ich über MOD, Arrays, usw. Kann jemand mir mal das richtig erklären um das zu verstehen oder ein Tip geben ?

Searcher
26.02.2017, 15:11
Ständig stolpere ich über MOD, Arrays, usw. Kann jemand mir mal das richtig erklären um das zu verstehen oder ein Tip geben ?

Sind mit dem Anhang jetzt noch Fragen offen? ;):) :lol:

Gruß
Searcher

EDIT: Noch'n Fehler. Es muß heißen:


Select Case Stelle 'und eine Stelle der vier wieder unter Strom setzen
Case 1 : Portd.1 = 1 'Stelle 1 einschalten
Case 2 : Portd.2 = 1 'Stelle 2 einschalten
Case 3 : Portd.3 = 1 'Stelle 3 einschalten
Case 4 : Portd.4 = 1 'Stelle 4 einschalten
End Select

In der Datei sind mir die Portnummern verrutscht.
Anhang getauscht wegen noch einem Bug.

recovery
26.02.2017, 17:02
Ja damit kann ich was anfangen das sieht gut aus ist auch gut Kommentiert DANKE

Searcher
26.02.2017, 17:27
Jedesmal, wenn ich ins Programm schaue, finde ich weitere kleine Fehler, sei es im Programm oder auch in den Kommentaren. Falls etwas seltsam oder nicht verständlich erscheint, einfach nachfragen. Das Programm konnte ich nicht life mit Anzeige und µC testen.

Gruß
Searcher

recovery
26.02.2017, 17:36
Es ist schon alles auf dem Steckbrett aufgebaut ich werde es testen und bei Fragen werde ich mich auch melden. :rolleyes:

recovery
26.02.2017, 20:28
Hm es tut sich was ich habe nur Nullen die flackern. Wahrscheinlich ist das flackern Timer sache.

Searcher
27.02.2017, 07:17
Hm es tut sich was ich habe nur Nullen die flackern. Wahrscheinlich ist das flackern Timer sache.
Flackern nur die Nullen oder werden auf 4 Stellen Nullen angezeigt, die alle flackern?

Vermutlich eher keine Timersache, sondern ISR oder Datensache. Ich kann da sozusagen offline aber keinen Fehler entdecken.

Check nochmal den HW-Aufbau.

Beinchen der Transistoren nicht vertauscht? Welche Transistoren?

Alle Anschlüsse der 7-Seg eindeutig identifiziert und in richtiger Reihenfolge angeschlossen?.

Abblockkondensatoren am µC?

Welcher µC ist es denn überhaupt? Hattest Du zufällig den ATtiny2313 da? und läuft der auch mit 1MHz (was eher nicht die Fehlerursache ist)

Welchen Wert haben die LED-Vorwiderstände. 1k wären erstmal OK um die Ausgänge des µC nicht zu hoch zu belasten - kein Reset wegen Einbruch derVersorgungsspannung. Wird vielleicht ein bißchen dunkel - wenn es läuft kann man die ja leicht auf dem Steckbrett austauschen.

Welche Stromversorgung nutzt Du?

Eventuell ein Foto vom Aufbau, auf dem man die Verdrahtung erkennen kann.

Und: Kannst auch Dein aktuell verwendetes Programm mal posten. Ich hatte meines bis zu Deiner ersten Antwort oben öfter ausgetauscht wegen der immer wieder entdeckten Bugs.

Ansonsten versuchen, das Programm zu verstehen und selbst eventuell Fehler entdecken.

Gruß
Searcher

recovery
27.02.2017, 17:56
Also es werden vier Nullen angezeigt die flackern bzw. ein flimmern.
Die Pinbelegung mit den Stellen Stimmen so weit es wird der Atmega16 mit 8Mhz Quarzoszillator benutzt,
angesteuert werden sie mit einem PNP Transistor mit einem Basiswiderstand von 2,2k und die Segmente werden mit 180 Ohm Widerstände betrieben.

32443

Searcher
28.02.2017, 07:17
Die Pinbelegung mit den Stellen Stimmen so weit es wird der Atmega16 mit 8Mhz Quarzoszillator benutzt,

Das bedeutet, daß Du das Programm, das ich gepostet hatte, geändert hast. Ich hatte Dich gebeten, das aktuelle Programm zu zeigen.



angesteuert werden sie mit einem PNP Transistor

das ist auch anders, als die Schaltung, auf die die Links im Programm nach http://rn-wissen.de/wiki/index.php?title=Siebensegmentanzeige#Multiplexing zeigen und nach der mein Programm geschrieben ist.

Danke für das Foto, aber kannst Du selber darauf Deine Verdrahtung nachvollziehen? Ich hatte noch weitere Fragen gestellt. Da Du einen anderen µC und andere Transistoren benutzt, kann man aus der Ferne nur weiterkommen, wenn ein Schaltplan und Dein aktuelles Programm vorliegt.

Gruß
Searcher

recovery
04.03.2017, 17:56
Das bedeutet, daß Du das Programm, das ich gepostet hatte, geändert hast. Ich hatte Dich gebeten, das aktuelle Programm zu zeigen.
Nein habe ich noch nicht ich habe nur die Regfile geändert weil ich kein Attiny2313 habe, natürlich werde ich Änderungen posten.


das ist auch anders, als die Schaltung, auf die die Links im Programm nach http://rn-wissen.de/wiki/index.php?t...e#Multiplexing zeigen und nach der mein Programm geschrieben ist.
Ich habe am Anfang geschrieben das es sich um eine gemeinsame Kathode handelt der Link ist mir nicht entgangen, ich habe leider nur gemeinsame Kathode
Segment Anzeige.

Zumindest habe ich mal das flimmern weg

$Regfile="m16def.dat"
$Crystal=8000000
$hwstack=40
$swstack=16
$framesize=32


Getaktet wird mit External Clock 8MhZ

Searcher
04.03.2017, 19:00
Ich habe am Anfang geschrieben das es sich um eine gemeinsame Kathode handelt der Link ist mir nicht entgangen, ich habe leider nur gemeinsame Kathode
Segment Anzeige.
Hallo recovery,
das Schaltbild zum Link aus RN-Wissen zeigt eine 4 X 7 Segmentanzeige mit gemeinsamer Kathode. Der erklärende Text dazu beschreibt das auch. Ich habe das Schaltbild unten eingefügt.

Die Stellen werden über npn-Transistoren geschaltet. Wenn zB Transistor T1 durchschaltet, schaltet er ein GND auf die gemeinsame Kathode der 7 Segmente der Stelle LD1. Zum Durchschalten braucht der Transistor ein High Potential vom µC an dem Anschluß "Stelle_1".

Du hast geschrieben, daß Du pnp-Transistoren verwendest. Dazu paßt das Programm, das ich geschrieben habe nicht. Um Dir weiterhelfen zu können müßtest Du einen Schaltplan zu Deiner Anzeige mit Typenbezeichnung und die Verschaltung der pnp Transistoren (auch mit Typenbezeichnung) posten.

Wenn Du eine Anzeige mit gemeinsamer Kathode wie unten im Schaltbild hast, solltest Du die pnp-Transistoren raus nehmen und npn-Transistoren einbauen und so wie im unten gezeigten Schaltbild verdrahten. Die Vorwiderstände R1..R8 mit 8 X 47Ω sind zu klein. Laß da Deine drin oder baue zunächst 1kΩ Widerstände zum Testen ein. Wenn dann noch die Portpins wie in den Programm Kommentaren beschrieben, verdrahtet sind, könnte mein Programm sogar die Anzeige mit dem anderen µC ansteuern.

Gruß
Searcher


http://rn-wissen.de/wiki/images/5/5d/Siebensegment_4fach_Multiplexing_V2.png

recovery
05.03.2017, 09:59
So läuft es ich habe noch einige Fehler entdeckt und korrigiert, Stelle 4 war auf PD5 anstatt auf PD4 und die Tabelle war das ein oder andere Bit falsch für die Ziffern Darstellung.
Deine Beschreibung habe ich etwas geändert.

'BASCOM Demo Version 2.0.7.5
'
'Multipexen einer 4-stelligen, 7 Segment Anzeige mit gemeinsamer Kathode
'zB µC Atmega16
'Dargestelt wird die Zahl 2017
'
'by Searcher im 26.02.2017
'Hardware auf Stekboard getestet.
'
'In Anlehnung an Zeichnung http://rn-wissen.de/wiki/index.php?title=Datei:Siebensegment_4fach_Multiple xing_V2.png'
'auf http://rn-wissen.de/wiki/index.php?title=Siebensegmentanzeige#Multiplexing
'
'Verschaltung am Atmega16
'PD1 über Transistor an Kathode Stelle 1
'PD2 über Transistor an Kathode Stelle 2
'PD3 über Transistor an Kathode Stelle 3
'PD4 über Transistor an Kathode Stelle 4

'Dezimalpunkt (dp) nicht genutzt
'PB6 an Segment a
'PB5 an Segment b
'PB4 an Segment c
'PB3 an Segment d
'PB2 an Segment e
'PB1 an Segment f
'PB0 an Segment g
'
'Zur Darstellung der Ziffer 0 an der ersten Stelle der 4 X 7 Segment Anzeige
'muß die Kathode Stelle 1 und die Segmente a, b, c, d ,e, f angesteuert werden.
'Nach dem Stromlauf müssen die entsprechenden Segmente ein HIGH vom µC bekommen.
'Grundzustand: alle Portpins auf 0 -> Anzeige komplett aus.
'PB0, PB1, PB2, PB3, PB4, PB5 auf "1" setzen. PB6 (Segment g auf "0")
'Segmente sind nun zum Einschalten vorbereitet.
'
'Da die Stellen über einen NPN Transistor angesteuert werden, muß bei Ansteuerung
'der Stellen die Basis des Transistors auch ein HIGH vom µC ausgegeben werden damit die
'Kathode der 7-Segment-Anzeige ein GND bekommt. Also für die erste Stelle den PD1 auf "1",
'die anderen auf "0". Vorbereitete Segmente sind nun eingeschaltet und Ziffer 0
'wird nun an erster Stelle der 4 X 7 Segment Anzeige angezeigt.
'
'Soll die Ziffer 0 an der zweiten Stelle der 7-Segment Anzeige angezeigt werden, wird
'PD1 auf "0" gesetzt (Stelle 1 ausgeschaltet), dann die Segmente für die Ziffer 0 gesetzt,
'die ja die gleichen Segmente und Portpins wie für Stelle eins sind, und dann
'PD2 auf "1" setzen. Ziffer 0 wird an Stelle 2 angezeigt.
'
'Ziffer 1 auf Stelle 3 anzeigen: PD2 auf "0", alle Segment Pins PB0..PB6 mit Pattern
'für Ziffer 1 überschreiben. Segment Pins PB1, PB2 auf "1", die anderen PBs auf "0". Dann PD3 auf "1".
'u.s.w






$Regfile="m16def.dat"
$Crystal=8000000
$hwstack=40
$swstack=16
$framesize=32





Dim Zahl As Word
Dim Hilfs_variable As Word
Dim Dezimalziffern(4) As Word
Dim Stelle As Byte

DDRB = Bits(pb6 , Pb5 , Pb4 , Pb3 , Pb2 , Pb1 , Pb0) 'Portpins für Segmente als Ausgang
DDRD = Bits(pd1 , Pd2 , Pd3 , Pd4) 'Portpins für die Stellen als Ausgang


Config Timer0 = Timer , Prescale = 8 'Overflow Interrupts mit ca. 488Hz bei 1MHz Systemtakt

On Ovf0 Isr_multiplex 'in der Overflos Interrupt Service Routine wird die Anzeige geschaltet
Enable Ovf0



Zahl = 2017 'Diese Zahl soll in der Anzeige erscheinen

'Den Inhalt der Variablen Zahl, der als Binärzahl gespeichert ist, in Dezimalstellen zerlegen
'und die Stellen zum späteren einfachen Abruf (indexen) beim Multiplexen in ein Array geben.
Dezimalziffern(1) = Zahl / 1000
Hilfs_variable = Zahl Mod 1000
Dezimalziffern(2) = Hilfs_variable / 100
Hilfs_variable = Zahl Mod 100
Dezimalziffern(3) = Hilfs_variable / 10
Hilfs_variable = Zahl Mod 10
Dezimalziffern(4) = Hilfs_variable / 1

Enable Interrupts 'startet das Multiplexing (Schalten der ziffern in der ISR)

Do
'leere Hauptschleife, Action findet in der ISR statt.
Loop

End


Isr_multiplex: 'schaltet Stellen mit ca. 488Hz (ca alle 2ms) weiter
'Bei jedem Aufruf der ISR wird
'sicherheitshalber alle Stellen über die Transistoren der Stellenansteueung die Anzeige abgeschaltet
'die Segmente der nächsten anzuzeigenden Dezimalziffer vorbereitet
'die entsprechende Stelle eingeschaltet.
'Eine Stelle is 2ms an und 6ms aus
If Stelle < 5 Then Incr Stelle Else Stelle = 1 'Index weiterschalten zur nächsten Stelle
Portd = Portd And &B11100001 'Alle 4 Stellen abschalten, andere Portpins nicht verändern

Portb = Lookup(dezimalziffern(stelle) , Ziffern_pattern) 'Lookup holt aus den Daten unter Ziffern_pattern
'das Pattern, das zur Zahl in Dezimalstellen(stelle) gehört
'und setzt damit im PORTB die Segmentportpins
Select Case Stelle 'und eine Stelle der vier wieder unter Strom setzen
Case 1 : Portd.1 = 1 'Stelle 1 einschalten
Case 2 : Portd.2 = 1 'Stelle 2 einschalten
Case 3 : Portd.3 = 1 'Stelle 3 einschalten
Case 4 : Portd.4 = 1 'Stelle 4 einschalten
End Select
Return


Ziffern_pattern: 'Daten zur Segmentansteuerung.
'Eine "1" bringt zusammen mit der Stellenansteuerung
'das entsprechende Segment zum leuchten
'Seg.dp,abcdefg (dp: Dezimalpunkt nicht genutzt)
Data &B01111110 'Muster für Ziffer 0
Data &B00110000 'Ziffer 1
Data &B01101101 'Ziffer 2
Data &B01111001 'Ziffer 3
Data &B00110011 'Ziffer 4
Data &B01011011 'Ziffer 5
Data &B01011111 'Ziffer 6
Data &B01110000 'Ziffer 7
Data &B01111111 'Ziffer 8
Data &B01111011 'Ziffer 9
'Wird ein Datenbyte auf PortB geschrieben, kommt das LSB (Segment g) auf PB0,
'MSB (Segment a) auf PB6 - passend zur Verdrahhtung.


32462

Searcher
05.03.2017, 14:03
So läuft es ich habe noch einige Fehler entdeckt und korrigiert, Stelle 4 war auf PD5 anstatt auf PD4 und die Tabelle war das ein oder andere Bit falsch für die Ziffern Darstellung.
Deine Beschreibung habe ich etwas geändert.

Ja, super! Gratuliere. Ich finde es immer ein tolles Erlebnis, wenn man sieht, daß etwas schief läuft, man die Ursache findet, den Fehler behebt und direkt den Erfolg erleben kann.

Gruß
Searcher

recovery
05.03.2017, 15:27
Ja das finde ich auch jetzt muss ich nur noch ein Projekt daraus machen es soll ein Timer werden.