Hallo Leute! Habe hier mal ne kleine Schaltung aufgebaut, um einen DS1820 Temperatursensor auszulesen und dann auf einer 7-Segment Anzeige, anzeigen zu lassen. Die 7-Segmente werden vom Timer0 gemultiplext. Das Problem was ich habe. Jedes mal, wenn der DS1820 ausgelesen wird, flackern die 7-Segmente kurz. Was kann ich da machen, um das Problem zu lösen?
Christian Betzen schrieb: > > Was kann ich da machen, um das Problem zu lösen? Evtl. wäre es hilfreich, Deinen Quelltext bereitzustellen. Ansonsten vermute ich den Fehler in Zeile 165, direkt vor dem Komma.
egbert schrieb: > Ansonsten vermute ich den Fehler in Zeile 165, direkt vor dem Komma. Nein, die ist korrekt. Der Fehler ist in Zeile 42.
Christian Betzen schrieb: > Habe hier mal ne kleine Schaltung aufgebaut, um einen DS1820 > Temperatursensor auszulesen und dann auf einer 7-Segment Anzeige, > anzeigen zu lassen. Wenn deine Anzeige flackert, kommen sich die Abfrage des Sensors und die Steuerung der Anzeige zeitlich ins gehege. Aber - mal ehrlich - wie soll dir bei der Informationslage irgendjemand ohne hellseherische Fähigkeiten einen Tip geben können. > Was kann ich da machen, um das Problem zu lösen? Vor der Lösung musst du erstmal verstehen, was schief geht.
Also gut! Stimmt zwar, ohne Quelltext wirds schwierig. Dachte nur das es event. das Problem öfters gibt. Also hier der gesamte Quelltext. Danke schon mal....
Christian Betzen schrieb: > Also hier der gesamte Quelltext. Das Programm besteht ja fast nur aus Timer0-ISR. Dann bleibt für andere Dinge vielleicht einfach keine Zeit. Lass dir mal auf einem Pin anzeigen, wenn die ISR aktiv ist und auf einem anderen, wenn die 1-Wire Kommunikation läuft. Der ganze Dekodierungs- und Zurechtlegekram für BCD und Multiplex (Multipwm:) hat nichts in der ISR zu suchen. Die ISR sollte sich nur die fertig vorbereiteten Bitmuster greifen und auf die Anzeigeports rausgeben.
Ohne den Quellcode angesehen zu haben (kenne von Bascom nur den Namen), gehe ich beim ds1820 mal vom parasitären Modus aus. Der braucht für die Temperaturmessung eine längere Zeit einen stabilen High-Pegel. Es könnte sein, dass das Programm so schlecht ist, dass es wärend der Temperaturmessung alles stehen und liegen lässt und erst danach wieder mit dem Multiplexing weiter macht.
Also gut! Habe jetzt mal verschiedene Tests gemacht. Wenn ich mir über eine LED anzeigen lasse, wann das Programm in der ISR fürs Multiplexing ist, Leuchtet die LED ständig. Das is ja klar, wird ja über die Timerfrequenz aufgerufen. Wenn ich die makebcd Sachen z.b. in das Hauptprogramm schreibe, läuft alles asynchron ab. Fehler ist aber immer noch da. Interessant dürfte nachstehendes Ergebnis sein. Habe mal ne LED über den Befehl led = not led aus dem Hauptprogramm angesteuert. Ein ähnlicher Fehler tritt auf. Die Anzeige fängt an zu flackern. Das sollte doch darauf hinweisen, das es ein Timingproblem gibt. Wenn nicht einmal Zeit ist um eine LED zu schalten.
> Config 1wire = Portc.5
Du nutzt augenscheinlich eine fertige Software-OneWire-Emulation. Die
Vermutung liegt nahe, dass ebenjene rücksichtslos am globalen
Interrupt-enable rumfuhrwerkt. Das zusammen mit 'timer0-ISR um
Größenordnungen zu langsam' dürfe das beobachtete Verhalten
vollumfänglich erklären.
Wenn Du schneller werden willst räum mal sauber auf und pass die
OneWire-Emulation an Deine Anforderungen an (i.e. die Interrupts nicht
lange sperren nur weil man Busy-Waiten will). Vielleicht willst Du ja
auch gleich auf C umsteigen, da ist das wesentlich einfacher :-)
Christian Betzen schrieb: > Wenn ich mir über eine LED anzeigen lasse, wann das Programm in der ISR > fürs Multiplexing ist, Leuchtet die LED ständig. Bei der Anzeige hatte ich mehr an ein Oszilloskop gedacht ;-) Der DS18B20 braucht, je nach eingestellter Auflösung, zwische 94 und 750ms für die Wandlung. Falls Bascom während der ganzen Zeit Däumchen dreht, müßte man das daran sehen, dass während der Zeit das Multiplexing aussetzt. Da ohne Oszi reinzugucken, wird allerding schwierig.
Das aufräumen werd ich mir mal zur Hauptaufgabe machen. Es gibt da schon noch einige Zeilen die so noch nicht ganz ihren richtigen Platz, oder Formulierung gefunden haben. Es ist ja noch alles im Aufbau. Aber mal davon abgesehen. Selbst wenn ich den Temperatursensor nur einmal in der Stunde abfragen würde, würde das Problem immer noch bestehen. Für so Funktionen wie "disable Timer..." hat das Programm keinen Platz. Das stimmt wohl. Achso. Noch der Hinweis. Aber auch das sollte nicht so wirklich das Problem sein. Hab die interne clock Funktion noch aktiviert. Also arbeitet der Timer2 auch ganz fleißig mit. Um den Sekundentakt genau zu bestimmen, ist ein separates Quarz angeschlossen. Der Systemtakt kommt aber von einem 16 MHz Quarz. Mal ganz allgemein. Wie tut ihr denn in Bascom eine Anzeige multiplexen und dann parallel dazu einen Bus auslesen. Egal ob jetzt 1W oder i2c usw. Das ist doch eine Situation die nicht selten vor kommt? Basic kannte ich noch teilweise von C64. Deshalb ist die Wahl auf Bascom gefallen. Mit C hab ich noch nie was gemacht.
Schau doch mal im Bascom-Forum, z.B. hier http://bascom-forum.de/showthread.php?4772-7Segment-Uhr-mit-Encoder-und-2-DS1820&p=35490&viewfull=1#post35490 Marcus
Christian Betzen schrieb: > Wie tut ihr denn in Bascom eine Anzeige multiplexen > und dann parallel dazu einen Bus auslesen. Egal ob jetzt 1W oder i2c > usw. Das ist nicht egal, sondern ein großer Unterschied. I2C hat überhaupt keine Zeitanforderungen, muß also Interrupts nicht sperren. 1-Wire muß nur für 60µs sperren, sollte also nicht merkbar flackern, wenn das Multiplexen z.B. alle 1000µs erfolgt. Die beste Lösung ist natürlich, das Samplen der 1W-Bits mit im Timerinterrupt nach der Multiplexausgabe zu machen. Dann flackert absolut nichts mehr.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.