Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen
Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.
Hinweis kann nach Kenntnisnahme deaktiviert werden!
Ja klar es kommt auch auf die Anzahl der Anzeigen an.
Ich habe jetzt mal einen Testaufbau mit zwei Anzeigen und habe bei 100 Hz kein Geisterleuchten aber flimmern.
Und wenn ich mit der Frequenz höher gehe flimmert es nicht mehr aber ich habe dieses Geisterleuchten
Hier mal mein Testprogramm.
BASCOM-Quellcode
$regfile="m8def.dat" ' specify the used micro
$crystal=8000000 ' used crystal frequency
$hwstack=64 ' default use 32for the hardware stack
$swstack=32 ' default use 10for the SW stack
$framesize=32 ' default use 40for the frame space
Config Portd.3=Output 'Stelle 2
Config Portd.4=Output 'Stelle 1
Config Portd.5=Output 'Daten
Config Portd.6=Output 'SCK
Config Portd.7=Output 'RCK
Stelle2 Alias Portd.3
Stelle1 Alias Portd.4
Daten Alias Portd.5
Sck Alias Portd.6
Rck Alias Portd.7
Const Timer0_preload =185
Config Timer0 = Timer , Prescale =1024 '110 Hz
Timer0 = Timer0_preload
Const Timer1_Preload =34286
Config Timer1 = Timer , Prescale =256
Timer1 = Timer1_preload
On Timer0 Isr_timer0
On Timer1 Isr_timer1
Enable Timer0
Enable Timer1
Enable Interrupts
Dim Zahl1 AsByte , Zahl2 AsByte , Daten_out AsByte , I AsByte , Stellex AsBit
Do
If Stellex =0Then
Set Stelle1
Reset Stelle2
Daten_out =Lookup(zahl1 , Segmente)
Else
Set Stelle2
Reset Stelle1
Daten_out =Lookup(zahl2 , Segmente)
EndIf
Gosub Anzeige
Loop
End
Anzeige:
For I =0To7
Daten = Daten_out.i
Sck =1
Sck =0
Next I
Rck =0
Rck =1
Return
Isr_timer0:
Timer0 = Timer0_preload
Toggle Stellex
Return
Isr_timer1:
Timer1 = Timer1_preload
Incr Zahl1
If Zahl1 =10Then
Incr Zahl2
Zahl1 =0
EndIf
If Zahl2 =10Then Zahl2 =0
Return
' A,B,C,D,E,F,G,DP
Segmente:
Data &B11111100 ' 0
Data &B01100000 ' 1
Data &B11011010 ' 2
Data &B11110010 ' 3
Data &B01100110 ' 4
Data &B10110110 ' 5
Data &B10111110 ' 6
Data &B11100000 ' 7
Data &B11111110 ' 8
Data &B11110110 ' 9
Data &B00000000 ' Blank
'Ende
Alles anzeigen
Die Segmente werden über eine 74HC595 angesteuert.
Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
und habe bei 100 Hz kein Geisterleuchten aber flimmern.
Schwebung mit der Netzfrequenz?
Meine Handykamera flimmert auch, wenns zu nah an der Lampe ist.
Vielleicht hakt dein Timer1 auch regelmäßig rein.
Zahlen inkrementieren kannst du sicher besser im Hauptprogramm oder in nur einem Timer.
wenn die eine Stelle erst eingeschaltet wird, bevor die andere aus ist passiert das.
Ebenso, wenn zuwenig Zeit ist für's Leuchten.
Ich würde den Timer nur nutzen, um ein Flag zu setzen.
Das Hauptprogramm wartet dann auf das Bit (bitwait) und setzt die entsprechende Stelle.
Die Zeit bis zum nächsten bitwait leuchtet dann die entsprehende Stelle.
Also Timer1 läuft mit 1s (1 Hz) und darin zähle ich auch nur die Variablen hoch.
In der Timer0 ISR wird auch nur ein Flag gesetzt und in der Hauptschleife abgefragt
Ich sehe, dass eine Ziffer erst umgeschaltet wird und dann erst die Daten bekommt.
Die Daten schickst du mit einer For-Schleife raus, die sehr langsam ist. Hier wäre Shiftout eine schönere Variante
In dieser Zeit hast du auch das Geisterbild auf der falschen Anzeige.
Das Umschalten der Anzeigen würde zeitlich besser in der Nähe vom Rck Impuls aufgehoben.
Versteh mich nicht falsch, For-next ist schon in Ordnung, nur sollten die Daten nicht genau in diesem Moment kommen, in dem du gar keine Zeit dafür hast. Die Aufschaltung der Daten erfolgt ja erst mit Rck.
Was sind denn das für Anzeigen, die die Daten seriell brauchen?
Sind das keine 7-Sehment-Anzeigen?
Oder steuerst du das 7-Segment Teil über einem Schieberegister an?
Ich denke das Toggel-Flag ist das Problem.
Klar musst du die Anzeigen hin und herschalten.
Aber ein 2. Flag wäre gut, damit die Hauptschleife weis, wann den die Anzeige zu aktualisieren ist.
Das Toggle-Flag für die Stelle in der ISR setzen und zusätzlich ein Refresh-Flag, damit die Hauptschleife weiß, wann eine Ausgabe erfolgen muss. Dann nach der Ausgabe das Refresh-Flag löschen.
Die gesamte Anzeige Routine sollte in die Isr. Den spätestens wenn die Main noch was anderes zu tun bekommt wirds flackern. Die Main kann die Ziffern bereitstellen aber die Umschaltung würde oft humpeln.
Evt läßt sich ein HW Schieberegister nutzen (SPI,Uart..) dann braucht die Isr nicht so lange.
'Hier ist nur eine kleine Spielerei zu Testzwecken in der Hauptschleife
Do
Incr Ausgabe
If Ausgabe = Zufall Then
Toggle Led
Ausgabe =0
EndIf
Loop
End
'Anzeige
Isr_timer0:
Timer0 = Timer0_preload
Toggle Stellex
If Stellex =0Then
Set Stelle2
Daten_out =Lookup(zahl1 , Segmente)
Waitus500 'für die Helligkeit der Anzeigen
Reset Stelle2
Else
Set Stelle1
Daten_out =Lookup(zahl2 , Segmente)
Waitus500 'für die Helligkeit der Anzeigen
Reset Stelle1
EndIf
Shiftout Daten , Sck , Daten_out , 1
Rck =0
Rck =1
Return
'Sekunden-Timer
Isr_timer1:
Timer1 = Timer1_preload
Incr Zahl1
If Zahl1 =10Then
__rseed =Getadc(0)
Incr Zahl2
Zahl1 =0
Zufall =Rnd(65535)
EndIf
If Zahl2 =6Then
Zahl2 =0
EndIf
Return
' DP,G,F,E,D,C,B,A
Segmente:
Data &B00111111 ' 0
Data &B00000110 ' 1
Data &B01011011 ' 2
Data &B01001111 ' 3
Data &B01100110 ' 4
Data &B01101101 ' 5
Data &B01111101 ' 6
Data &B00000111 ' 7
Data &B01111111 ' 8
Data &B01101111 ' 9
Data &B00000000 ' Blank
'Ende
Alles anzeigen
So funktioniert es erstmal auch ohne flimmern und Geisterbilder und die Anzeigen haben auch eine gute Helligkeit.
Die Helligkeit erreiche ich allerdings nur wenn ich ein kleines Waitus einbaue. Ohne wären die Anzeigen viel zu dunkel.
Allerdings werde ich für mein Projekt mit diesen Anzeigen auf das Multiplexen verzichten und die zwei Anzeigen direkt über zwei 74HC595 betreiben.
Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
Die ISR verbraucht 20% der Cpu-Leistung. Stelle1/2 sind zwei Transistoren? Sollte sie dann nicht die halbe Zeit leuchten - nicht nur während der 500µs? 2-4 Anzeigen sollten mit einem 74HC595 zu betreiben sein. Für mehr liefert er zu wenig Strom.
So entfallen die 500µs in der ISR.
Bei jedem Durchgang wird immer die nächste Stelle ausgegeben und eingeschaltet.
Die bleibt dann solange an, bis der nächste Interrupt kommt.
Danke das passt super Keine Geisterbilder, kein flimmern und die Helligkeit ist auch sehr gut.
Hätte ich auch selbst drauf kommen können
Aber manchmal steht man einfach auf dem Schlauch...
Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
Jenseits von acht wird's dann schwierig mit dem Strom. Sollte das System stoppen bekommt ein Digit >100mA
Ab 12 scheint es kein brauchbares Helligkeit /Flackerfrei - Verhältnis mehr zu geben.