Re: das edip macht Probleme bzw. ich bin das Problem Kategorie: Programmierung (von André H. - 11.06.2006 9:16) | ||
Als Antwort auf Re: das edip macht Probleme bzw. ich bin das Problem von Heribert - 9.06.2006 20:56 | ||
| ||
Hallo Heribert, > ich habe jetz mal Andrès Rat befolgt und die Interrupt-Leitung der eDIPs angeschlossen. > Mal sehen, event. hat es ja daran gelegen das das ständige Pollen via edip.receiveframe() die Ursache > für das Problem war. Eigentlich sollte das Problem, da� ein eDIP den Bus infolge zu schnellen Sendens lahmlegt, mit der aktuellen Version 0.50b behoben sein, da vor der Veröfentlichung jemand (nicht ich) bereits ca. eine Woche lang einen Stre�test mit seinen unzählen im Haus befindenden eDIPs gamacht hatte, und es bisher zu keinerlei Ausfällen mehr kam. Allerdings habe ich nur bei den ASM-Routinen eigene Lese und Schreibroutinen mit Clockstreching als Ersatz für die internen I²C-Bus-Routinen geschrieben. Die direkten I²C-Aufrufe in edip.c2 erfolgen noch ohne Clockstreching. Daher kann ich nicht ausschlie�en, da� noch nicht alle Probleme beseitigt sind. Bis zur finalen Version von edip.c2 werde ich nach und nach die ASM-Routinen erweitern, damit alles, au�er das Senden der Startbedingung samt der Adresse, über Clockstreching läuft. Das Problem ist einfach, da� das eDIP240 die Daten nicht so schnell verarbeiten, wie die CC2 senden kann. Das betrifft u.U. auch das Pollen zum Abfragen des eDIP-Sendepuffers. Daher sollte im normalen Einsatz eine Interruptleitung für den I²C-Bus verwendet werden, und so nur bei einem Low-Pegel der Leitung edip.receiveframe() aufgerufen werden. In Deinem Fall in etwa so: o=0; while not ports.get(IntPort) { o=o%2; edip.receiveframe(eDIPAddr[o],Display[o]); o=o+1; } Aber noch ein Problem könnte evtl. sein, da� Du bei jedem Schleifendurchlauf den Displayinhalt komplett aktualisierst: if var.Anzeige[o] ==1 anzeige.Kist (eDIPAddr[o]); else if var.Anzeige[o] ==2 anzeige.Sist (eDIPAddr[o]); else if var.Anzeige[o] ==3 anzeige.SWist (eDIPAddr[o]); else if var.Anzeige[o] ==4 ; else if var.Anzeige[o] ==5 anzeige.ASollIstK (eDIPAddr[o]); else if var.Anzeige[o] ==6 anzeige.betrieb (eDIPAddr[o]); else if var.Anzeige[o] ==7 anzeige.oel (eDIPAddr[o]); else if var.Anzeige[o] ==9 {anzeige.ver (eDIPAddr[o]);var.Anzeige[o] =0;} else if var.Anzeige[o] ==10 {anzeige.Temp (eDIPAddr[o]);} Es würde reichen, wenn Du das nur machst, wenn sich der Wert von var.Anzeige[o] ändert. Denn sonst bringt die Interrupt-Leitung wenig, wenn Du immernoch nonstop Daten zu den eDIPs sendest. Das würde ganz einfach gehen, wenn Du die diese Routinen in eine eigene Funktion setzt, und in dieser auch das setzen der Anzeige-Variabel übernimmst. Diese Funktion rufst Du dann einfach aus den Auswertung der Touchtasten auf, wenn die Menüposition geändert werden soll. MfG André H. Antworten bitte nur ins Forum! Fragen per EMail auf Forum-Postings werden nicht beantwortet! Das macht meine Heizung gerade | ||
Antwort schreiben Antworten: Re: das edip macht Probleme bzw. ich bin das Problem (von Heribert - 12.06.2006 22:18) Re: das edip macht Probleme bzw. ich bin das Problem (von Heribert - 14.06.2006 9:46) |