Forum: Mikrocontroller und Digitale Elektronik DS1820 mit Multiplexen


von Christian B. (chris001)


Lesenswert?

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?

von egbert (Gast)


Lesenswert?

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.

von manny (Gast)


Lesenswert?

egbert schrieb:
> Ansonsten vermute ich den Fehler in Zeile 165, direkt vor dem Komma.
Nein, die ist korrekt.
Der Fehler ist in Zeile 42.

von Michael (Gast)


Lesenswert?

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.

von Christian B. (chris001)


Angehängte Dateien:

Lesenswert?

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....

von Michael (Gast)


Lesenswert?

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.

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

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.

von Christian B. (chris001)


Lesenswert?

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.

von g457 (Gast)


Lesenswert?

> 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 :-)

von Michael (Gast)


Lesenswert?

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.

von Christian B. (chris001)


Lesenswert?

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.

von MarTha (Gast)


Lesenswert?


von Peter D. (peda)


Lesenswert?

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
Noch kein Account? Hier anmelden.