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.
Code:'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_Multiplexing_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.![]()







Hoffentlich liegt das Ziel auch am Weg
Zitieren

Lesezeichen