Ich habe ein 4-fach-Thermometer mit ATtiny85 aufgebaut Nach dieser Bauanleitung: http://www.technoblogy.com/show?1MP7 Programm: http://www.technoblogy.com/list?1XGS Jetzt würde ich noch gerne einen Taster einbauen und den Zustand beim Programmstart abfragen. Vielleicht kann mir jemand helfen, wie ich das mache. Ich erwarte keinen fertigen Code. Nur ein paar Tipps und eine Idee, wie ich den Taster anschließe, da ich keine freien Ports mehr habe. Vielleicht lässt sich einer, der mit dem Display verbunden ist, doppelt belegen? Den Code könnte ich am Programmanfang einfügen. Es würde mir also völlig ausreichen, den Taster beim Programmstart kurz gedrückt zu halten. Wenn er gedrückt wurde, soll das EEprom gelöscht werden (die EEprom-Lösch-Funktion ist bereits im vorhandenen Code enthalten) Sorry, das ist mein erstes AVR-Projekt und ich bin schon stolz es überhaupt zum Laufen bekommen zu haben und sogar die Ursache gefunden zu haben, warum der erste Sensor nicht erkannt wird. Warum ich das will: Die Sensoren müssen nacheinander angelernt werden. Dabei werden die Seriennummern ins EEprom geschrieben. Damit sich der Sketch hochladen lässt muss ich aber den Pullupwiderstand entfernen. Dann funktionieren aber die Sensoren nicht und da der Sketch nach dem Hochladen automatisch gestart wird, wird irgendein Müll ins EEprom geschrieben und der erste Sensor dann nicht mehr erkannt (siehe Foto, das "X"). Um das EEprom wieder zu löschen kommentiert man im Code eine Zeile aus und startet den Sketch einmal. Danach muss man den wieder zurück geänderten Sketch abermals hochladen. Total umständlich und ich drehe mich wegen des ersten Sensors im Kreis. Deshalb wäre es sinnvoll das EEprom einfach über einen Taster löschen zu können, um den Anlernprozess für die Sensoren erneut in Gang zu setzen.
Ich würde mit dem Taste P4 gegen Masse schalten. Einzig beim Betätigen des Tasters funktioniert das Pollen der Temperatursensoren nicht. Ich denke das kann man verschmerzen. Das Display wird in seiner Funktion nicht beeinträchtigt und man kann dieses während des Tastendruckes verwenden.
:
Bearbeitet durch User
> keine freien Ports mehr
'NRES P5' scheint doch frei zu sein, oder? Das ist ADC0, wenn der Taster
diesen auf, sagen wir, 0.9 Vcc zieht, sollte sich das abfragen lassen.
Irgendwie.
S. Landolt schrieb: > 'NRES P5' scheint doch frei zu sein, oder? Das ist ADC0, wenn der Taster > diesen auf, sagen wir, 0.9 Vcc zieht, sollte sich das abfragen lassen. > Irgendwie. Wenn man Serial-HV programmieren kann, dann einfach den nRES als PB5 dafür verwenden. Mit dem ADC0 kann es auch gehen, aber nicht beim Ziehen auf 0.9V, dann macht er doch Reset? Du meintest sicherlich auf 0.9×VCC!
an HildeK: Ich benutzte die Schreibweise aus dem Datenblatt - aber okay, wenn Sie so wollen, ein '*' dazwischen kann nicht schaden.
Gerald K. schrieb: > Ich würde mit dem Taste P4 gegen Masse schalten. Einzig beim Betätigen > des Tasters funktioniert das Pollen der Temperatursensoren nicht. Ich > denke das kann man verschmerzen. gefällt mir, ich würde CS mit D/C verknüpfen UND/!UND, wenn kein CS aktiv ist kann die D/C Leitung genutzt werden! Ich weiss gerade nicht ob CS high oder low aktiv ist! Ohne CS sind die OLED Leitungen ja nutzbar.
Da das ein Digispark/Digistump Klon ist, hat er einen Bootloader. Üblicherweise ist bei den originalen Digistump der Reset disabled. Also auch hier machbar, PB5 ist dann als IO nutzbar.
HildeK schrieb: > S. Landolt schrieb: >> 'NRES P5' scheint doch frei zu sein, oder? Das ist ADC0, wenn der Taster >> diesen auf, sagen wir, 0.9 Vcc zieht, sollte sich das abfragen lassen. >> Irgendwie. > > Wenn man Serial-HV programmieren kann, dann einfach den nRES als PB5 > dafür verwenden. > Mit dem ADC0 kann es auch gehen, aber nicht beim Ziehen auf 0.9V, dann > macht er doch Reset? Du meintest sicherlich auf 0.9×VCC! Zum Programmieren soll ja die USB Schnittstelle nutzbar sein, so habe ich das verstanden. Also kein ISP. Ich würde auch P5 nehmen, und mit Spannungsteiler auf z.B. 4 Volt legen. Der Taster überbrückt den oberen Widerstand und zieht den Pin auf 5 Volt. Damit ist es egal ob der Reset enabled oder disabled ist. Die Spannung an P5 kann man während Init messen und als Entscheidung für das Löschen des EEPROMs nehmen.
Hallo, falls wirklich kein Pin mehr frei ist, könnte man P0 und/oder P1 verwenden. Das ist nur die Clock und Mosi Leitung vom Display. Daran klemmst du deinen Taster mit Pullup/Down ran. Im Programm machst du folgendes. Du legst zuerst die CS Leitung auf High. Damit ist das Display "abgeklemmt". Danach konfigurierst du P0/P1 als Eingang für deinen Taster, fragst den ab und machst dein Ding damit. Danach initialisierst du deine SPI Schnittstelle und damit das Display. Der Taster darf ab jetzt nicht mehr betätigt werden. Im schlimmsten Fall zeigt das Display Müll an und müßte neu initialisiert werden. Könnte man theoretisch mit dem Taster einbauen. Bei "späterer" Betätigung Displayinit. Dann bleibt eine Berührung ohne Folgen.
Veit D. schrieb: > Im Programm machst du folgendes. Du legst zuerst die CS Leitung auf > High. mein Vorschlag und das kann sogar mit Gatter verknüpft werden und mein "hater" hat wieder zugeschlagen.
Joachim B. schrieb: > gefällt mir, ich würde CS mit D/C verknüpfen UND/!UND, wenn kein CS > aktiv ist kann die D/C Leitung genutzt werden! > > Ich weiss gerade nicht ob CS high oder low aktiv ist! > > Ohne CS sind die OLED Leitungen ja nutzbar. Würde ich nicht so kompliziert lösen, den die Anschalten sollte "Open Collector" oder ein Kontakt sein. Der Schalter beeinflusst die Funktion nicht negativ. Selbst wenn er zwischendurch nur kurz gedrückt wird gehen eine Polls verloren. Was soll's. Ich hoffe bei der Übertragung von den Sensoren werden Telegramme mit einen CRC gesichert. Dann sollte man ich zerstörte Telegramme erkennen. Wenn nicht macht man eine Mehrfachabtastung.
Arduino Fanboy D. schrieb: > Üblicherweise ist bei den originalen Digistump der Reset disabled. Und bei den 2-3 €/$ Angeboten ist der Reset typischerweise enabled - meiner Meinung nach der sinnvollere Zustand, denn bei Bedarf kann man (einmalig) per SPI den Reset disablen; zurück dann nur per HV.
Gerald K. schrieb: > Würde ich nicht so kompliziert lösen und ich würde die logisch verknüpfen um sie zu entprellen, oder eben im IRQ auszulagern. Man muss ja nicht immer Daten ans OLED senden, mehr als 4-10 Aktualisierungen kann eh keiner LESEN und in der OLED Print Ausgabe kann ich hinterher auch den Taster einlesen.
S. Landolt schrieb: > Ich benutzte die Schreibweise aus dem Datenblatt - aber okay, wenn Sie > so wollen, ein '*' dazwischen kann nicht schaden. Entschuldigung, da hatte ich nicht genau genug gelesen. 0.9V ≠ 0.9VCC. Mein Fehler.
So, muß ich auch mal meinen Senf dazugeben: Ein grundsätzlich lasst ihr Euch über den PB5 aus, der eben auch als /Reset fungiert. Prinzipiell - egal ob der Chip nun einen Bootloader hat oder nicht - ist es nicht unbedingt eine gute Idee, den Pin, der eine ISP ermöglicht, zu deaktivieren. Hiermit ist man - im Falle eines Bootloaders - auf Gedeih und Verderb diesem ausgeliefert (oder einem "High-Voltage" Programmer). Sieht man sich die Schaltung an, gibt es doch noch eine andere, aus meiner Sicht der Dinge viel bessere; Lösung: - Das Display (wieso hat der TO hier ein SPI Display und kein I2C Display gewählt ?) hängt am SPI Bus gänzlich alleine, weitere SPI Einheiten gibt es auch nicht. Sollte jetzt nicht zwingend Strom gespart werden, kann man den CS des Displays dauerhaft auf GND legen, somit ist das Display IMMER aktiv und der Pin PB3 / ADC3 ist damit komplett frei für anderes, eben auch für einen Taster abfragen. Da dieser PIN auch grundsätzlich noch als analoger Eingang fungieren kann, kann man über diesen Pin gleich mehrere Taster abfragen, in dem man "einfach" dort die Spannung mißt:
1 | +5V |
2 | ^ |
3 | | |
4 | +-------+-------+ |
5 | | | | |
6 | .-. .-. .-. |
7 | 10k | | 22k | | 33k | | |
8 | | | | | | | |
9 | '-' '-' '-' |
10 | | | | |
11 | | | | |
12 | S1 \ S2 \ S3 \ |
13 | \ \ \ |
14 | | | | |
15 | +-------+-------+------o PB3 |
16 | | |
17 | .-. |
18 | | | |
19 | 10k | | |
20 | '-' |
21 | | |
22 | | |
23 | --- |
Zu messende Spannungen sollten hier UNGEFÄR sein: 1/2 Ub, 1/3 Ub, 1/4 Ub. Kann von einer einfachen Tastenabfrage ausgegangen werden und man bestimmt, dass mehrere Tasten nicht gleichzeitig betätigt sein dürfen (ich möchte das hier nur als Anregung aufführen) kann man den schaltbaren Spannungsteiler annehmen mit:
1 | Spannung bei Vdd= 5V |
2 | ---------------------------- |
3 | 1/3 .. 1/2 ==> 2.075V = S1 |
4 | 1/4 .. 1/3 ==> 1.45V = S2 |
5 | 0 .. 1/4 ==> 0.62V = S3 |
Um nun keine Integer - Floatumrechnung machen zu müssen sind für obige Spannungen anzunehmen, dass bei ADC-Werten (10 Bit Auflösung) folgende Zuordnung gilt:
1 | ADC-Wert > 424 ==> S1 gedrückt |
2 | 300 < ADC-Wert < 424 ==> S2 gedrückt |
3 | 128 < ADC-Wert < 300 ==> S3 gedrückt |
4 | ADC-Wert < 128 ==> nichts gedrückt |
MaWin schrieb: > Warum nimmt man dann einen Tiny85 ? Genau das frage ich mich auch :-) muss wohl etwas mit erhöhter Leidensfähigkeit (positiv ausgedrückt) zu tun haben.
: - ) ... und ja ich weiß: es wird richtig geschrieben: UNGEFÄHR ..
Hallo, man darf /CS nicht dauerhaft auf Low legen. SPI benötigt immer die CS Signalflanken.
MaWin schrieb: > Warum nimmt man dann einen Tiny85 ? Weil der TO das Programm für einen Tiny85 "gefunden" hat, Links sehe Eröffnungsbeitrag. Diese Tatsache allein garantiert nicht, dass der TO das auf einen anderen µC umschreiben kann.
Veit D. schrieb: > Hallo, > > man darf /CS nicht dauerhaft auf Low legen. wer will das? Habe ich nirgendwo gelesen. Man darf doch CS nutzen wenn er frei und unbelegt ist. Im Gegensatz zum /Reset Pin, dort würde ich keinen Taster anschliessen, obwohl der Reset auch als Port gebraucht werden kann, mit dem Verlust der Programmierfunktion.
Hallo, schau dir mal die Arbeitsweise von SPI vorallendingen Daisy Chain an. Das verdeutlicht es. Mit CS low werden die Bits (Daten und Kommandos) nur durchgeschoben. Erst mit CS low>high weiß das SPI Device das es die vorliegenden Daten im eigenen Schieberegister übernehmen und verarbeiten kann/darf. Vorher liegen die Bits nur rum ohne das sie angefasst werden. Vergleich. Der Postbote rennt wild durch deine Straße. Erst wenn er bei dir klingelt, merkst du, du hast neue Post.
:
Bearbeitet durch User
Uih, danke für die vielen tollen Lösungsansätze. Wenn sich der Resetpin als Port nutzen lässt, wäre das ja die einfachste Lösung. Aber ich will mir erst mal alle Beiträge durchlesen.
Dietmar S. schrieb: > Wenn sich der Resetpin als Port nutzen lässt, wäre das ja die einfachste Lösung. Alles andere aber das genau eben nicht machen!
Dietmar S. schrieb: > Uih, danke für die vielen tollen Lösungsansätze. Wenn sich der Resetpin > als Port nutzen lässt, wäre das ja die einfachste Lösung. Aber ich will > mir erst mal alle Beiträge durchlesen. Geht nicht als normaler Port mit High/Low Eingang oder Ausgang. Du kannst den Pin aber als Analog Eingang verwenden, musst aber dafür sorgen, daß die Spannung nie in den Bereich von logisch Low geht. Da das einen Reset auslösen würde. Schau einfach mal in diesen Thread rein: https://www.avrfreaks.net/forum/attiny85-pin-1-reset-and-pb5-functionality
Veit D. schrieb: > Alles andere aber das genau eben nicht machen! So krass muss man das nicht sehen. Erstens ist da ja ein Bootloader drauf. Lässt sich also weiterhin problemlos programmieren. Zweitens kommt man da per HVSP immer noch ran, um die Fuses zurückzusetzen. Auf dem Board ist der Tiny gesteckt.
Noch als Anmerkung, warum ich das so aufgebaut habe. Ich habe eine Anleitung zu einem erprobten Projekt genommen. Wie schon erwähnt, wollte ich erste Erfahrungen sammeln und da ich gerade Bedarf an solch einem Thermometer hab, dachte ich das ist ein gutes Projekt für den Anfang und das hat sich auch als gute Idee herausgestellt. Hätte ich selbst was programmiert, hätte ich bis jetzt sicher noch kein einzelnes Zeichen auf das Display bekommen. Gut, die LED hab ich natürlich zum blinken bekommen, aber das ist ja auch keine große Kunst. Mit diesem fertigen Projekt kann ich jedoch prima im funktionierenden Code rumbasteln und ausprobieren.
Das 0.96“ Display gibt es doch auch als I2C Variante, oder? Wäre nur ein Austausch/Konfiguration der Lib. Bitte ignorieren, sollte sich diesbezüglich etwas überlesen haben.
Mal ne blöde Frage. Das Problem ist doch, dass die Sensoren angelernt werden und dass das so schnell nach dem Programmieren geht, dass man man keine Zeit hat, das Teil stromlos zu machen und den Widerstand wieder anzulöten. Wie wäre es denn mit ein paar Gedenksekunden an Anfang des setups? so einfach mal delay(10000), und schon ist das Problem gelöst oder sehe ich da was falsch?
Sehe gerade, manche Displays lassen sich sogar per Jumper zwischen I2C und SPI umstellen. Schon wären sogar zwei Pins frei.
Gruss zum Abend und Advent Veit D. schrieb: > Dietmar S. schrieb: >> Wenn sich der Resetpin als Port nutzen lässt, wäre das ja die einfachste >> Lösung. > > Alles andere aber das genau eben nicht machen! Dem schließe ich mich an. Das beinhaltet eine Verkomplizierung im Anfänglichen bei Weiterem oder ohne wäre es egal. Selbst bei Profis ist der Umstand wie kommt man wieder an den AVR bz. Glatteis, hier im Forum schon reichlich dargestellt. Wie erwähnt HV Programmierung, und das was man da im Internet findet , es gibt auch statistische Aussagen zum relativen Abschuss der AVR s (Fuses u. ), ist nicht unbedingt richtig, da musste ich auch erst dazu lernen. Je nach Anforderung/en den Attiny /Atmega mit der Anzahl der Pins entspechend auswählen, ohne Klimmzüge oder man kanns. Als Anfänger wurde ich die übersichtliche Einfachheit bevorzugen. Wenn man es gelernt hat kann man auch die Programme , insbesondere einfache, zu den verschiedenen Typen, umschreiben. Schönen Abend Dirk St
Hummel schrieb: > Geht nicht als normaler Port mit High/Low Eingang oder Ausgang. Du > kannst den Pin aber als Analog Eingang verwenden, musst aber dafür > sorgen, daß die Spannung nie in den Bereich von logisch Low geht. Da das > einen Reset auslösen würde. > > Schau einfach mal in diesen Thread rein: > https://www.avrfreaks.net/forum/attiny85-pin-1-reset-and-pb5-functionality O.k. der Reset ist bei meinem Board enabled. Ich finde den Lösungsansatz trotzdem nicht schlecht. P4 scheint aber einfacher, das werde ich versuchen. Dass die Sensoren dabei unterbrochen werden, spielt keine Rolle, da ich den Taster nur einmalig drücke. Ich halte den Taster gedrückt und schalte das Thermometer ein. Den Zustand frage ich nur einmal bei Programmstart ab, das EEprom wird gleich zu Beginn gelöscht und ich kann ich die Sensoren wieder anlernen. Da ich die Sensoren ja nur einmalig bei der Inbetriebnahme und bei einem eventuellen Sensortausch anlernen muss, reicht da so ein vertieft sitzender Microtaster, den ich mit dem Kugelschreiber betätige. Armin J. schrieb: > Wie wäre es denn mit ein paar Gedenksekunden an Anfang des setups? > so einfach mal delay(10000), und schon ist das Problem gelöst oder sehe > ich da was falsch? Würde funktionieren, ich hatte mir auch bereits mit einem Trick beholfen. Bliebe aber trotzdem das umständliche/mehrfache Hochladen des Programms bei einem späteren Sensortausch. Und ich bräuchte den ganzen Kram wieder zur Hand. Harald schrieb: > Sehe gerade, manche Displays lassen sich sogar per Jumper zwischen I2C > und SPI umstellen. Schon wären sogar zwei Pins frei. Das geht bei meinem auch. Hab bzw. hatte nur als Anfänger eben keine Ahnung was ich in der Software dann ändern muss. Inzwischen würde es vielleicht hinbekommen. Nur wie erkenne ich wo der Fehler ist, wenn das Display dunkel bleibt. Es blieb übrigens auch dunkel, als ich den Pullup an P4 nicht dran hatte. Da hab ich mich erst blöd gesucht, bis ich drauf kam.
Veit D. schrieb: > Alles andere aber das genau eben nicht machen! da sind wir einig, zum Andern denke ich wir reden aneinander vorbei Ich meine /CS vom OLED, das wird nach dem LCD Update nicht benötigt! Am ISP wird CS nicht benötigt, also darf man den /CS nutzen wenn er anderweitig nicht genutzt wird. Man könnte sogar den CS Pin (und MOSI, MISO) hinter einem 74HC4052 umschalten, wenn Reset low ist (also über ISP programmiert werden soll, sonst ist Reset ja high und die Pins sind relativ frei nutzbar.
Gerald K. schrieb: > Ich würde mit dem Taster P4 gegen Masse schalten. Beste Lösung ohne Nebenwirkung und Trickserei. Einfach beim Programm-Start abfragen. Danach hat der Taster keine Funktion mehr, ausser das Lesen der Sensoren zu stören ;-)
@ Joachim: Ohne CS kannst du das Display bspw. nicht aktualisieren geschweige denn ansprechen. Ich kann dir gedanklich nicht folgen was du am CS nicht verstehst. Tut mir leid. @ Arduino Fanboy: Benötigt der µC nicht dennoch das Resetsignal trotz Bootloader? Ich meine ja. Machen die Arduinos genauso. Reset hängt am DTR Signal vom USB-Serial Umsetzer. Ich bin der Meinung ohne Reset ist keine Programmierung möglich. Irgendwie muss er vor und nach dem flashen resetet werden.
Hi >Ohne CS kannst du das Display bspw. nicht aktualisieren geschweige denn >ansprechen. Och , Es gibt Displays, bei denen während der ganzen Übertragung CS Low sein darf( Z.B. Dog Displays). CS Low startet eigentlich nur einen Bitzähler. MfG Spess
Veit D. schrieb: > Benötigt der µC nicht dennoch das Resetsignal trotz Bootloader? Ich > meine ja. Der "Reset" ist dann aber kein Reset, sondern ein simpler Eingangsport. Veit D. schrieb: > Irgendwie muss er vor und nach dem flashen > resetet werden. Das macht er dann ohne äußere Beschaltung.
Veit D. schrieb: > @ Arduino Fanboy: > Benötigt der µC nicht dennoch das Resetsignal trotz Bootloader? Ja und Nein! Natürlich benötigt er einen Reset um den Bootloader zu starten. Im Falle des Digistump wird dafür der der "Power On Reset" genutzt. Egal, ob man den Resetpin zum IO macht, oder auch nicht. Der Resetpin ist für den ISP Vorgang nötig. Aber der ist ja schon durch, wenn der Bootloader aufgespielt ist.
Den P4 nicht direkt mit Taster nach GND, sondern noch einen 18k-Widerstand dazwischen. Dann wird bei Tastendruck der High-Pegel von 5V auf 4V gesenkt. Sollte für die Kommunikation mit den Sensoren egal sein, kann aber per ADC gemessen werden.
Spess53 schrieb: >>Ohne CS kannst du das Display bspw. nicht aktualisieren geschweige denn >>ansprechen. > > Och , Es gibt Displays, bei denen während der ganzen Übertragung CS Low > sein darf( Z.B. Dog Displays). CS Low startet eigentlich nur einen > Bitzähler. Ich habe 4 Stück SSD1306 (OLED Display) und 3 Stück PCD8544 (N5110 Display) getestet, alle mit CS auf "Dauer-Low" und alle funktionieren, allerdings jedoch NICHT mit einer Arduino Lib getestet sondern mit einer selbst geschriebenen die von vornherein KEINEN Anschlusspin für CS vorsieht (und diesen von daher auch nicht initialisiert). Das Ganze aus einer C-Umgebung heraus OHNE das Arduino-Framework. Rein aus Interesse werde ich die Tage mal Arduino installieren und sehen, ob das mit der Arduino Bibliothek auch geht.
Nur mal so zur Vollständigkeit: Für den 1wire Bus gibts auch IO-Port Bausteine, z.B. https://www.maximintegrated.com/en/products/interface/controllers-expanders/DS2413.html?intcid=para https://www.maximintegrated.com/en/products/ibutton-one-wire/memory-products/DS2408.html?intcid=para Sowas ist z.B. in den Apple Magsafe Netzteilen drin: Über die beiden IO-Pins wird die Rot-Grün LED gesteuert, und über die Seriennummer im ROM weiß der Mac, was für ein Netzteil er hat und wieviel Watt das hat. fchk
Veit D. schrieb: > @ Joachim: > Ohne CS kannst du das Display bspw. nicht aktualisieren geschweige denn > ansprechen. Ich kann dir gedanklich nicht folgen was du am CS nicht > verstehst. Tut mir leid. das ist mir doch klar, nur will man ja nicht zu jeder µs das Display ansteuern! Was verstehst du daran nicht? Ist der aktuelle Text auf dem Display, kann man für mindestens 100ms den CS vom Display anderweitig nutzen, z.B. um einen Taster abzufragen! Mehr als 10 Aktualisierungen/s vom Display braucht doch kein Mensch, weil es unleserlich wird. Das Display darf denn den Taster CS Status nicht mitgeteilt bekommen. Das erreicht man mit mit dem analog mutliplexer oder mit logik IC welche das CS zum Display sperren. Es bietet sich Reset high an, wenn der µC nicht im Programmiermodus ist oder der DS-Port wenn gerade keine DS18b20 Abfrage läuft! Das liegt doch alles in Programmiererhand!
Arduino Fanboy D. schrieb: > Veit D. schrieb: >> @ Arduino Fanboy: >> Benötigt der µC nicht dennoch das Resetsignal trotz Bootloader? > > Ja und Nein! > Natürlich benötigt er einen Reset um den Bootloader zu starten. > Im Falle des Digistump wird dafür der der "Power On Reset" genutzt. > Egal, ob man den Resetpin zum IO macht, oder auch nicht. > Der Resetpin ist für den ISP Vorgang nötig. > Aber der ist ja schon durch, wenn der Bootloader aufgespielt ist. Ich verstehe das noch nicht. Soll man den Digistump jedesmal am USB aus- und einstöpseln um den zu flashen? Wieviel Sekunden wartet der Bootloader bis er der µC sein Programm startet? Spess53 schrieb: > Hi > >>Ohne CS kannst du das Display bspw. nicht aktualisieren geschweige denn >>ansprechen. > > Och , Es gibt Displays, bei denen während der ganzen Übertragung CS Low > sein darf( Z.B. Dog Displays). CS Low startet eigentlich nur einen > Bitzähler. Darum gehts nicht. Es geht nicht um "während der Übertragung". Das ist logisch. Es geht um dauerhaften Low Pegel am CS des Display ohne Änderungsmöglichkeit. Ralph S. schrieb: > Ich habe 4 Stück SSD1306 (OLED Display) und 3 Stück PCD8544 (N5110 > Display) getestet, alle mit CS auf "Dauer-Low" und alle funktionieren, > allerdings jedoch NICHT mit einer Arduino Lib getestet sondern mit einer > selbst geschriebenen die von vornherein KEINEN Anschlusspin für CS > vorsieht (und diesen von daher auch nicht initialisiert). Das Ganze aus > einer C-Umgebung heraus OHNE das Arduino-Framework. > > Rein aus Interesse werde ich die Tage mal Arduino installieren und > sehen, ob das mit der Arduino Bibliothek auch geht. Das hat nichts mit Arduino zu tun. Ich habe das jetzt einmal mit meinem EA DOGM 128 probiert. Ich bin jetzt ehrlich gesagt überrascht das es mit Dauer Low Pegel funktioniert. Hab CS direkt auf Masse gelegt. Ich verstehe es nicht. Woher weiß das SPI Device das es jetzt angesprochen wird, das die Daten ihm gelten? Das kann doch nicht während die Bits noch reingeschoben werden diese schon verarbeiten. Spätestens mit Daisy Chain kommt doch Müll raus. Allerspätestens wenn man verschiedene SPI Devices mit Daisy Chain mischt. Dann schiebt man ja den sortierten Bitstrom hintereinander raus. Verstehe ich nicht. Wer kann das bitte erklären?
Veit D. schrieb: > Ich bin jetzt ehrlich gesagt überrascht das es mit Dauer Low Pegel > funktioniert. Warum denn nicht? CS enabled den Clock-Eingang, fertig. Dafür braucht man keine Flanke auf CS. EDIT: Auszug aus https://de.wikipedia.org/wiki/Serial_Peripheral_Interface "Mit jeder Taktperiode wird ein Bit übertragen. Beim üblichen Bytetransfer sind also acht Taktperioden für eine vollständige Übertragung nötig. Es können auch mehrere Worte hintereinander übertragen werden, wobei in der Spezifikation nicht festgelegt ist, ob zwischen jedem Wort das SS-Signal kurz wieder auf High gezogen werden muss. Eine Übertragung ist beendet, wenn das Slave-Select-Signal endgültig auf High gesetzt wird."
:
Bearbeitet durch Moderator
Frank M. schrieb: > Veit D. schrieb: >> Ich bin jetzt ehrlich gesagt überrascht das es mit Dauer Low Pegel >> funktioniert. > > Warum denn nicht? CS enabled den Clock-Eingang, fertig. Dafür braucht > man keine Flanke auf CS. > > EDIT: > > Auszug aus https://de.wikipedia.org/wiki/Serial_Peripheral_Interface > > "Mit jeder Taktperiode wird ein Bit übertragen. Beim üblichen > Bytetransfer sind also acht Taktperioden für eine vollständige > Übertragung nötig. Es können auch mehrere Worte hintereinander > übertragen werden, wobei in der Spezifikation nicht festgelegt ist, ob > zwischen jedem Wort das SS-Signal kurz wieder auf High gezogen werden > muss. Eine Übertragung ist beendet, wenn das Slave-Select-Signal > endgültig auf High gesetzt wird." Hallo, darf ich den letzten Satz hervorheben? "Eine Übertragung ist beendet, wenn das Slave-Select-Signal endgültig auf High gesetzt wird." Jetzt fehlt noch die Erklärung wie das ohne low>high funktioniert. Darum gehts ja in der ganzen Diskussion.
:
Bearbeitet durch User
Joachim B. schrieb: > Das Display darf denn den Taster CS Status nicht mitgeteilt bekommen. > Das erreicht man mit mit dem analog mutliplexer oder mit logik IC welche > das CS zum Display sperren. Viel zu kompliziert. Statt CS kann man auch die MOSI-Leitung benutzen in der Schaltung denn solange man dem Display nix schicken will und CS den entsprechenden Status hat ist es dem Display auch völlig egal was MOSI macht ;)
Hallo, :-) Beitrag "Re: ATtiny85 benötige Taster und kein freier Port" Du hast doch auch Ahnung. Warum funktioniert das SPI Display mit dauerhaften Low Pegel am CS?
Veit D. schrieb: > darf ich den letzten Satz hervorheben? > "Eine Übertragung ist beendet, wenn das Slave-Select-Signal endgültig > auf High gesetzt wird." > Jetzt fehlt noch die Erklärung wie das ohne low>high funktioniert. Bei Dauer-Low wird die Übertragung halt nie beendet. Wo ist denn das Problem? Das ist eine synchrone Schnittstelle. Solange kein Takt da ist, kannst Du auf der Datenleitung machen, was Du willst. Betrachte doch einfach CS als Enable für den Takt. Solange CS high ist, wird der Takt ignoriert. Ist es Low, wird auf den Takt geachtet. Das lässt sich mit einer einfachen Gatter-Schaltung realisieren. Und so werden es die meisten SPI-Slaves auch umgesetzt haben.
:
Bearbeitet durch Moderator
M. K. schrieb: > Viel zu kompliziert. Statt CS kann man auch die MOSI-Leitung benutzen in > der Schaltung denn solange man dem Display nix schicken will und CS den > entsprechenden Status hat ist es dem Display auch völlig egal was MOSI > macht ;) Ja genau. Da der Taster ja nur zu Beginn abgefragt werden soll, macht man dann eben die Initialisierung des Displays danach - wenn der Taster wieder losgelassen wurde. Selbiges geht auch mit der CS-Leitung. Ein kleiner Schutzwiderstand am Taster sollte nicht fehlen, falls mal einer während des Betriebs trotzdem drücken würde.
Veit D. schrieb: > Ich verstehe das noch nicht. Soll man den Digistump jedesmal am USB aus- > und einstöpseln um den zu flashen? Wieviel Sekunden wartet der > Bootloader bis er der µC sein Programm startet? Ja! Der PC wartet ca 30 Sek der Bootloader 6 oder so ähnlich... Also Zeit satt. Aber, wenn du mir schon nicht glaubst, dann vielleicht dem Anbieter der Originale, denn dessen Doku ist recht umfangreich. https://digistump.com/wiki/digispark/tutorials/connecting https://digistump.com/wiki/digispark/tutorials/programming
Hallo, Arduino Fanboy D. schrieb: > Veit D. schrieb: >> Ich verstehe das noch nicht. Soll man den Digistump jedesmal am USB aus- >> und einstöpseln um den zu flashen? Wieviel Sekunden wartet der >> Bootloader bis er der µC sein Programm startet? > > Ja! > Der PC wartet ca 30 Sek der Bootloader 6 oder so ähnlich... > Also Zeit satt. > > Aber, wenn du mir schon nicht glaubst, dann vielleicht dem Anbieter der > Originale, denn dessen Doku ist recht umfangreich. > https://digistump.com/wiki/digispark/tutorials/connecting > https://digistump.com/wiki/digispark/tutorials/programming Das hat nichts mit glauben zu tun. Warum diese Unterstellung? Mir war nur nicht bekannt das man das Ding umständlich jedesmal aus- und einstöpseln muss. Das hätte als Antwort alles erschlagen. Aber nun ist das ja endlich geklärt mit dem Reset. Frank M. schrieb: > Betrachte doch einfach CS als Enable für den Takt. Solange CS high ist, > wird der Takt ignoriert. Ist es Low, wird auf den Takt geachtet. Das > lässt sich mit einer einfachen Gatter-Schaltung realisieren. Und so > werden es die meisten SPI-Slaves auch umgesetzt haben. Das beantwortet nicht meine Frage. Ist denn das verstehen der Frage wirklich so kompliziert? Kann ich mir nicht vorstellen. Also nochmal. CS ist DAUERHAFT! low, Bits werden reingeschoben. Woher weiß das SPI Device das die Bits jetzt ordnungsgemäß an der Bahnsteigkante stehen und übernommen werden sollen? Also woher weiß das SPI Device das Bit 0 vom Bitstrom wirklich an Position 0 steht ohne mittels CS gesagt zubekommen der Bit-Zug steht jetzt vorn am Haltesignal. Alle Bits können ein- und aussteigen. Beim Daisy Chain noch anders verdeutlicht. Soll das erste SPI Device alle Bits verarbeiten die vorbeikommen? Obwohl die Bits gar nicht für ihn bestimmt sind. Wäre ja Unsinn.
:
Bearbeitet durch User
Ich habe mir jetzt mal die Mühe gemacht und geschaut, wie man bei einem SSD1306-SPI Display eine Leitung einsparen kann. Leider mangelt es mir hier an einem ATtiny85 (ich dachte ich hätte noch einen hier) und an einem Display wie es der TO verwendet hat (er hat die Variante mit 6 Anschlüssen am SPI: +Vdd, GND, data, sck, res, cs, dc). Ich habe nur einen Tiny44 und ein Display mit 7 Anschlüssen zur Verfügung (Display hat einen zusätzlichen RES Anschluß). Damit das ganze auch wirklich unter Arduino läuft habe ich mir an dem momentanen Rechner eben Arduino und einen ATtiny Core installiert. Das Ergebnis ist: Zum Controller werden die Anschlüsse sck (D0), data (D1) und dc verwendet. Damit das Display beim Anschließen der Betriebsspannung auch garantiert resetet habe ich an den RES - Anschluß ein RC-Glied angeschlossen:
1 | +Vdd o------+ |
2 | | |
3 | ,-, |
4 | | | |
5 | | | 2.2k |
6 | '-' |
7 | | |
8 | res (OLED) o------+ |
9 | | + |
10 | --- |
11 | --- 4.7uF |
12 | | |
13 | --- |
Diese Vorgehensweise bedingt eine Wartezeit vor dem eigentlichen Initialisieren des Displays:
1 | // warten bis das RC-Glied den Reset am Display garantiert durchgefuehrt hat |
2 | delay(100); |
3 | ssd1306_init(); |
Ein Video von der Funktionsfähigkeit findet sich hier: https://www.youtube.com/watch?v=pgJC6c4ZV0A Der Arduino-Code befindet sich im Anhang und aus den Funktionen wurde absichtlich keine "Library" abgeleitet, damit das auch garantiert nachvollzogen werden kann. SPI-Schnittstelle ist mittels Bitbanging realisiert (funktioniert bei meinem Testaufbau aber auch problemlos mittels USI), damit das auch garantiert auf jedem AVR mit genügend Flash ausprobiert werden kann ! Das Demoprogramm benötigt 2478 Bytes Flash
Veit D. schrieb: > Ich verstehe das noch nicht. Soll man den Digistump jedesmal am USB aus- > und einstöpseln um den zu flashen? Wieviel Sekunden wartet der > Bootloader bis er der µC sein Programm startet? Du kannst auch einen anderen Bootloader wählen, der nur bei bestimmten Bedingungen startet und ansonsten sofort ins Benutzerprogramm verzweigt, die Auswahl ist groß: https://github.com/ArminJo/micronucleus-firmware#legend
@ Martin: Danke für die Info. Obwohl mir diese Art des Resets weiterhin zu umständlich erscheint. :-)
Veit D. schrieb: > Obwohl mir diese Art des Resets weiterhin zu > umständlich erscheint. :-) Das eine sind die Fakten, die Quelle habe ich dir verlinkt. Und das andere sind deine Gefühle und Emotionen. Das eine liegt in der Verantwortung der (H)Ersteller, und das andere in deiner. Ich bin hier nur der Bote. Andererseits: Wie würdest du bei einer solchen Tiny85 USB Schaltung den Reset konstruieren? Gibt es eine Alternative? Welche? Zudem, hoffe ich mal, ..... Veit D. schrieb: > Dietmar S. schrieb: >> Wenn sich der Resetpin als Port nutzen lässt, wäre das ja die einfachste Lösung. > Alles andere aber das genau eben nicht machen! ...... dass sich dieses dann auch erledigt hat.
Arduino Fanboy D. schrieb: > Veit D. schrieb: >> Obwohl mir diese Art des Resets weiterhin zu >> umständlich erscheint. :-) > Das eine sind die Fakten, die Quelle habe ich dir verlinkt. > Und das andere sind deine Gefühle und Emotionen. > > Das eine liegt in der Verantwortung der (H)Ersteller, und das andere in > deiner. > Ich bin hier nur der Bote. > > Andererseits: > Wie würdest du bei einer solchen Tiny85 USB Schaltung den Reset > konstruieren? > Gibt es eine Alternative? > Welche? Ich sags dir ganz deutlich. Unterlasse deine sinnfreien Unterstellungen bzw. Anspielungen. Ich hatte eine klare Frage, darauf gabs sehr spät die erlösende Antwort. Ich habe dir dabei nie irgendwas unterstellt oder dergleichen. Also lass das gefälligst sein. Wegen der Frage. Ich würde solchen Mist erst gar nicht machen. Wenn ein Pin fehlt, dann fehlt eben ein Pin. Werden mehr gebraucht, nimmt man einen größeren Controller. Fertig. Manche Sparmaßnahmen sind nicht immer sinnvoll. Meine Meinung. Und ja ich weiß das es meine Meinung ist. Du musst mir nichts erneut unterstellen. Danke.
Veit D. schrieb: > Unterstellungen Unterstellungen? > Alles andere aber das genau eben nicht machen! Du teilst Empfehlungen aus, kritisierst/negierst damit meine Aussagen, ohne die Geräte/Umstände zu kennen. Vermutlich sogar auf falschen Annahmen beruhend. Das soll ich dann kommentarlos einstecken, mir gefallen lassen.... Ein interessantes Verhalten/Erwartungshaltung.
Ralph S. schrieb: > Damit das Display beim Anschließen der Betriebsspannung auch garantiert > resetet habe ich an den RES - Anschluß ein RC-Glied angeschlossen: Dieses Problem haben wir bei einem Serienprodukt auch so gelöst. Ein Port fehlte am uC, der CS-Anschluß zum LCD-ChipOnGlasGraphikDisplay (SPI) wurde dann durch ein RC-Glied ersetzt -> nur noch drei Leitungen zu bedienen anstatt vier (MOSI, A1, CLK). Das Display (über einen zusätlichen Port per p-Channel bepowert) lief dann 30 sec nach dem WakeUP und wurde in dieser Einschaltzeit teilweise häufig aktualisiert, ohne am CS zu wakeckeln zu müssen.
Veit D. schrieb: > Woher weiß das SPI Device das die Bits jetzt ordnungsgemäß an der > Bahnsteigkante stehen und übernommen werden sollen? Wenn CS auf Low geht, wird ein interner Bitzähler auf 0 gesetzt. Mehr braucht man nicht: Das SPI Device entscheided anhand des Bitzählers, dass die Bits nun vollständig angekommen sind. Wenn es ein Byte erwartet, dann zählt es bis 8. Hat der Zähler den Wert 8 erreicht, werden die 8 Bits als Byte übernommen. Der Bitzähler wird dann wieder auf 0 gesetzt. Fertig. CS (bzw. dessen Flanke) ist also kein Trigger für ein Latch oder ähnliches. CS bedeutet nur: Zähle den Takt mit oder ignoriere ihn. Mittels der Flanke High-> Low kann man den Bitzähler zurücksetzen(*). Das wars aber auch schon. (*) EDIT: Es könnte auch technisch so gelöst sein, dass bei der Flanke Low -> High - also nach der Übertragung bereits der Bitzähler auf 0 gesetzt wird. Das ist aber - von außen gesehen - schnuppe und ändert nichts.
:
Bearbeitet durch Moderator
Arduino Fanboy D. schrieb: > Veit D. schrieb: >> Unterstellungen > Unterstellungen? >> Alles andere aber das genau eben nicht machen! > Du teilst Empfehlungen aus, kritisierst/negierst damit meine Aussagen, > ohne die Geräte/Umstände zu kennen. Vermutlich sogar auf falschen > Annahmen beruhend. > Das soll ich dann kommentarlos einstecken, mir gefallen lassen.... > > Ein interessantes Verhalten/Erwartungshaltung. Du versuchst schon wieder meine Worte umzudrehen. Ich habe dich nämlich nie kritisiert - sondern das Produkt. Drauf legst du doch sonst immer viel wert. Diesmal klappt das irgendwie nicht. Dabei belasse ich das hier. Ist ja unmöglich solches Verhalten.
Bin zwar kein ATTiny-Experte, hab im Datasheet mal nachgeschaut: P5 ist doch für einen Taster prädestiniert, da im Schaltplan die Reset-Funktion eh nicht benutzt wird... PCIN5 kann dann im IRQ-Kontext sehr leicht einen Tastendruck erkennen (Markervariable setzen) und später diese in der Main-Loop auswerten, wenn das SPI-Diplay pennt und nichts zu tun hat und dann weiterverarbeiten ... Seite 60. P5 PCINT5: Pin Change Interrupt, Source 5 Mann muss nur sichergehen, das P5 richtig auf PCINT konfiguriert wird in der FW....
M. K. schrieb: > Statt CS kann man auch die MOSI-Leitung benutzen auch das ist mir klar, für hier wo MOSI nicht genutzt wird kann man das machen, allgemein MOSI nehmen zu können würde ich es nicht so verkürzt schreiben. Irgendwann liest einer man kann Mosi nehmen ohne den Zusammenhang und heult dann wieder das es eben nicht geht! Du glaubst doch nicht das JEDER immer den ganzen Thread liest und den Zusammenhang BENUTZT vs. NICHT BENUTZT versteht?
Frank M. schrieb: > Wenn CS auf Low geht, wird ein interner Bitzähler auf 0 gesetzt. Mehr > braucht man nicht: > > Das SPI Device entscheided anhand des Bitzählers, dass die Bits nun > vollständig angekommen sind. Wenn es ein Byte erwartet, dann zählt es > bis 8. Hat der Zähler den Wert 8 erreicht, werden die 8 Bits als Byte > übernommen. Der Bitzähler wird dann wieder auf 0 gesetzt. Fertig. > (zu lang, gekürzt) Hallo, soweit okay und verstanden. Für ein Device am Bus funktioniert das. Aber! Bei Daisy Chain würde das bedeuten, dass das erste Device welches alle Bytes sieht, auf alles reagieren würde. Kann und darf doch nicht sein?
Veit D. schrieb: > Ich habe dich nämlich nie kritisiert Habe ich das gesagt? Das habe ich gesagt: > kritisierst/negierst damit meine Aussagen, Veit D. schrieb: > Du versuchst schon wieder meine Worte umzudrehen. Wer verdreht Worte? Na, wer? Merke: Meine Aussagen kann ich ändern/korrigieren. Mich kann ich nicht auswechseln. Aber wie auch immer: Bei dem Digistump Klon kann man die Reset disable Fuse setzen, ohne Furcht zu haben, dass man ihn nicht mehr programmieren kann. Das wurde vom ursprünglichen Hersteller so vorgesehen, und wenn damit einer emotional nicht klar kommt, ist das eben dessen Problem. Mir scheint, der Digistump ist nichts für dich....
Hier ist aber nur "EIN" Device am SPI-Bus, ein Display. kein Daisy-Chain ... Hängt aber auch vom SPI-Device ab, bei auch nur "einem" SPI-SerialFlash am Bus ohne anderere Teilnehmer z.B. geht das mit dem CS (über RC-Kombination) nicht, der benötigt auch (öfters) CS-Flanken ...
Dietmar S. (didi2); der TO scheint eh schon raus zu sein, bei dem Gezanke hier kein Wunder ...
Veit D. schrieb: > Bei Daisy Chain würde das bedeuten, dass das erste Device welches alle > Bytes sieht, auf alles reagieren würde. Da hast Du allerdings recht. In https://www.mikrocontroller.net/articles/SPI_Daisychain#.C3.84nderungen_in_der_Steuerung ist das Daisychaining ganz gut erklärt. Hier ist es wohl tatsächlich so, dass mit steigender Flanke von SS jeder Slave die letzten 8 übermittelten Bits dann übernimmt. Hier "rotieren" die Bitzähler wohl durch: 0,1,2,3,...,7,0,1,2...7 Wenn ich es recht verstehe, ist aber nicht jeder Slave Daisy-Chain-fähig. Die Daisy-Chain-fähigen werden SS (bzw. CS) als Trigger für ein Latch nehmen, die anderen werden das wohl so machen, wie ich es beschrieb - einfach, weil es simpler umzusetzen ist. Fazit: Diejenigen Slaves, die Werte ohne CS-Flanke trotzdem übernehmen, können prinzipiell nicht Daisy-Chain-fähig sein. Im Artikel steht noch, dass alle Slaves dieselbe Anzahl von Bits erwarten müssen, man also 8-er und 16-er Slaves nicht mischen kann. Klar, das versteht sich von selbst.
:
Bearbeitet durch Moderator
Hallo, habe parallel auch nach einer Antwort gesucht und bin bei Analog Devices fündig gewurden. Unter Daisy-Chain Method findet man folgenden fast unscheinbaren Satz. "Daisy-chain mode is not necessarily supported by all SPI devices. Please refer to the product data sheet to confirm if daisy chain is available." https://www.analog.com/en/analog-dialogue/articles/introduction-to-spi-interface.html Wie ihr inzwischen schon geschrieben habt. Das erklärt nun alles. Schön das es nun geklärt ist. Ich danke allen Beteiligten.
AtzeM schrieb: > Dietmar S. (didi2); der TO > > scheint eh schon raus zu sein, bei dem Gezanke hier kein Wunder ... Ich lese noch mit :) Bin nur noch nicht dazugekommen, den Taster anzulöten.
>habe parallel auch nach einer Antwort gesucht und bin bei Analog Devices >fündig gewurden ..aber schon interessant, dass jetzt Analog Devices nach Atmel gefragt wird
MCUA schrieb: > dass jetzt Analog Devices nach Atmel gefragt wird Ach, das ist doch alles egal! Im Gegensatz zu z.B. I2C, ist SPI nirgendwo spezifiziert. Da kann jeder sein eigenes Süppchen kochen. So kommt/kam es halt zu so einem ungehinderten Wildwuchs und den daraus entstehenden Inkompatibilitäten. Also: Die konkrete zugehörige Doku lesen, dann wird alles gut. Und nicht versuchen, alles gelesene, auf alle Geräte zu übertragen, denn das wird in den Irrtum führen.
MCUA schrieb: >>habe parallel auch nach einer Antwort gesucht und bin bei Analog Devices >>fündig gewurden > ..aber schon interessant, dass jetzt Analog Devices nach Atmel gefragt > wird SPI hat nichts mit Atmel (Microchip) oder Analog Devices o.a. Herstellern zu tun. So eine SPI Beschreibung findet man sicherlich bei allen Herstellern. Im Endeffekt funktioniert das Display hier mit dauerhaften CS auf low. Würde aber nicht mit Daisy Chain funktionieren. Das ist das ganze Geheimnis um die "Verwirrung". Daraus folgt. Standard ist jedes SPI Device mit CS gezielt ansprechen. Das funktioniert immer. Daisy Chain ist möglich wenn es das IC zulässt. Die Erklärung von Frank ist schon perfekt.
>SPI hat nichts mit Atmel (Microchip) oder Analog Devices o.a. >Herstellern zu tun. .... >Da kann jeder sein eigenes Süppchen kochen. .... Eben. Die Suppe sollte man auch konkret lesen. (Oder es selber machen mit eigener Hardware, dann gehn u.a. auch FIFOs besser)
Auch wenn der (eher kleinere) Zank erstaunlich- und erfreulicherweise friedlich zu Ende gegangen ist, habe ich jetzt doch mal schlicht eine Frage zur Begrifflichkeit: Im Zusammenhang mit SPI habe ich bei den Devices schon anhand der Bezeichnung der Anschlusspins unterschieden gehabt. Ein SS war für mich immer ein SlaveSelect und von daher höchstwahrscheinlich Daisy-Chain-fähig. Ein CS war für mich (steinigt mich nicht, das ist wirklich eine Frage) von der Abkürzung her immer ein ChipSelect und hat mehr oder weniger den Baustein selektiert (nach welcher Methode auch immer) und war NICHT Daisy-Chain-fähig. Zum Test habe ich jetzt alle mir verfügbaren SPI-Displays (vor allem auch Color TFT mit S6D0A2, st7735, ili9341, ili9225 und ili9163 aber auch das n5110 s/w Display mit pcd8544) getestet, die mit CS beschriftet sind. Alle haben mit CS= Dauer-Low funktioniert. Liege ich mit meiner Interpretation von SS und CS daneben ?
PS: Vergessen hatte: Wenn ein Device KEIN miso hat, bin ich auch immer davon ausgegangen, dass es ein ChipSelect und kein SlaveSelect sein kann, weil dem Device ja schlicht das miso fehlt um sein empfangenes Datum weiter zu senden.
Ralph S. schrieb: > PS: Vergessen hatte: Wenn ein Device KEIN miso hat, bin ich auch > immer > davon ausgegangen, dass es ein ChipSelect und kein SlaveSelect sein > kann, weil dem Device ja schlicht das miso fehlt um sein empfangenes > Datum weiter zu senden. Wie schon gesagt: Da es keinen allgemein gültigen Standard gibt, sind alle diese Annahmen eher ein stochern im Nebel.
Hallo, wir kennen uns schon länger und wissen (davon gehe ich aus) wie weit wir es treiben können. Deswegen läuft das human ab. :-) SPI Standard ist wie ich schon geschrieben habe. Jedes Device wird konkret mit seinen CS angesprochen. Das funktioniert immer. Daran gibts nichts zu rütteln. Das ist der Standard ohne Nebel. :-) Daisy Chain ist nach aktuellen Erkenntnissen eine Option wenn die Devices das unterstützen. Die können ja trotzdem alle am gleichen Bus (Clock, Data) hängen. Aber die CS Leitungen sind getrennt. Für Daisy Chain unterstützende eine gemeinsame. Für nicht Daisy Chain fähige gibts standardmäßig jeweils eigene CS Leitungen. Übrigens ist Chip-Select und Slave Select immer gleich bedeutet. Nur die Hersteller beschriften das unterschiedlich. Warum auch immer. Man möchte ja standardmäßig immer eines gezielt ansprechen, egal ob man Daten schickt oder auslesen möchte. Unsere Displays sind demnach nicht Daisy Chain fähig. Funktionieren aber nach Standard mit CS einwandfrei. Wenn alleine am Bus eben auch mit Dauer Low an CS. Das alles ist die aktuelle Erkenntnis der Frage Antwort Runde. Und ich finde es gut das darüber gesprochen wurde.
Verdammte Sch... das funktioniert! Ich habe mich eben mal dran gesetzt und dank eurer Hilfe funktionierte es im Handumdrehen. Einfach einen Taster von Pin4 nach Masse löten. Der Pullup ist wegen den Sensoren ja schon da. Dann habe ich
1 | // EepromClear(); |
ersetzt durch:
1 | int stat = HIGH; |
2 | stat = digitalRead(4); |
3 | if (stat == LOW) { |
4 | EepromClear(); |
5 | } |
Allerdings hatte ich immer noch das Problem, dass der erste Sensor nicht erkannt wurde und gleich wieder Mist im EEprom stand, weil ja durch den gedrückten Taster der 1-Wire-Bus auf Masse lag. Also noch ein paar Zeilen weiter das:
1 | if (slot < 4) { |
ersetzen durch:
1 | if (slot < 4 and stat != LOW) { |
Beim Einschalten Taster gedrückt halten und schon kann ich die Sensoren nacheinander anlernen. Das Drücken des Tasters während des Betriebs stört übrigens nicht. Die Werte auf dem Display frieren lediglich ein und sobald ich loslasse, werden die Temperaturen wieder aktualisiert.
Hallo, vielleicht musst du die Funktionen bzw. die Abarbeitung noch sauberer trennen. Erst alles abarbeiten was mit dem Taster zu tun hat. Danach alle Busse initialiseren. Dann sollte es keine Probleme geben. Aber schön das es funktioniert bzw. du auf dem richtigen Weg bist. Entschuldigung das ich zwischendrin deinen Thread gekapert habe. Ich finde jedoch das war sehr wichtig. Danke.
:
Bearbeitet durch User
Veit D. schrieb: > vielleicht musst du die Funktionen bzw. die Abarbeitung noch sauberer > trennen. Erst alles abarbeiten was mit dem Taster zu tun hat. Danach > alle Busse initialiseren. Dann sollte es keine Probleme geben. > Aber schön das es funktioniert bzw. du auf dem richtigen Weg bist. Also das Programm stammt ja nicht von mir. Ich wollte meinen Teil auch zuerst ganz an den Anfang schreiben, doch alle benötigten Funktionen standen unterhalb. Also habe ich den Code da einfügt, wo auch der Entwickler den EEprom Löschbefehl hingeschrieben hatte (worüber ich mich auch gewundert hab). Das Programm komplett umzuschreiben, für einen Taster, der im gesamten Leben des Geräts keine 10x gedrückt wird, fände ich nicht so sinnvoll und dazu habe ich auch leider noch zu wenig Ahnung. Ich bin schon froh dass ich den Code überhaupt verstehe und das ich das vorhin so schnell hinbekommen habe :) > Entschuldigung das ich zwischendrin deinen Thread gekapert habe. Ich > finde jedoch das war sehr wichtig. Danke. Ist doch kein Problem, ich finde das jetzt nicht schlimm. Im Gegensatz zu meinem (nicht mehr bestehenden) Forum, kommen die Leute hier meist wieder zum Thema zurück. In meinem Forum sind die Threads durch so was regelmäßig eskaliert.
Hallo, du programmierst sicherlich in der Arduino IDE nehme ich an. Dann schreibst du deinen zusätzlichen Programmcode ins setup. bzw. ruft die zusätzlichen Funktionen im setup auf. setup wird einmalig abgearbeitet. loop wird ständig abgearbeitet. Man kann es auch in loop schreiben und sich mittels einem bool selbst aus dem Rennen nehmen lassen wenn alles fertig ist. Je nach Geschmack. Ersteres finde ich übersichtlicher. setup kannste meinetwegen mit einer while solange blockieren wie all das was mit dem Taster abgearbeitet werden soll fertig ist. Dann verlässt du while und die loop kann wie bisher auch sein Ding machen. Idee ist wie folgt. Taster in setup abfragen, wenn gedrückt ein bool auf true setzen. Nennen wir es tasterAktiv. dann folgt meinetwegen am Ende von setup ein while(tasterAktiv) { ... }. In diesem while machste das was du tun musst. Wenn alles fertig ist setzt du tasterAktiv auf false und die while wird verlassen und die loop ist dran. Ob die Funktionen im Sketch oben oder unten stehen in der Reihenfolge ist in der Arduino IDE egal. Die baut sich die Funktionsprototypen selbst zusammen. Entscheidend ist was in setup / loop steht bzw. aufgerufen wird.
Hi du programmierst sicherlich in der Arduino IDE nehme ich an. Warum sollte er so dumm sein? MfG Spess
Spess53 schrieb: > Warum sollte er so dumm sein? was ist daran dumm? Auch in der IDE kann man normal programmieren, auch ohne C++ nur in C, sogar ohne setup() und ohne loop(). Klingt komisch ist aber so.
Ach, lass ihm... Ihm kann nicht zitieren, bezeichnet aber andere als dumm. Daran merkste schon, dass ihm heute nicht alle Streusel auf dem Kuchen hat.
Keine Ahnung, was hier wieder abgeht. Zum Thema: Man kann an MOSI, MISO, SCK je einen Taster über 1k..4,7k gegen GND anschließen und abfragen (Input mit Pullup). Das Programmieren und die Displayausgabe wird dadurch nicht behindert.
Gerald K. schrieb: > Ich würde mit dem Taste P4 gegen Masse schalten. Einzig beim Betätigen > des Tasters funktioniert das Pollen der Temperatursensoren nicht. Ich > denke das kann man verschmerzen. > > Das Display wird in seiner Funktion nicht beeinträchtigt und man kann > dieses während des Tastendruckes verwenden. Meiner Meinung nach war bereits die erste Antwort optimal! Leicht auszuprobieren und dank wired-or auch für die Hardware ungefährlich.
Alex D. schrieb: > Meiner Meinung nach war bereits die erste Antwort optimal! Ich würde lieber einen Kurzschluß auf den Sensorleitungen erkennen wollen und daher noch einen Widerstand opfern, z.B. für die Taste an MISO.
Veit D. schrieb: > du programmierst sicherlich in der Arduino IDE nehme ich an. Ja, in der Arduino IDE. > Dann > schreibst du deinen zusätzlichen Programmcode ins setup. bzw. ruft die > zusätzlichen Funktionen im setup auf. setup wird einmalig abgearbeitet. > loop wird ständig abgearbeitet. Man kann es auch in loop schreiben und > sich mittels einem bool selbst aus dem Rennen nehmen lassen wenn alles > fertig ist. Je nach Geschmack. Ersteres finde ich übersichtlicher. > > setup kannste meinetwegen mit einer while solange blockieren wie all das > was mit dem Taster abgearbeitet werden soll fertig ist. Dann verlässt du > while und die loop kann wie bisher auch sein Ding machen. > > Idee ist wie folgt. > Taster in setup abfragen, wenn gedrückt ein bool auf true setzen. Nennen > wir es tasterAktiv. dann folgt meinetwegen am Ende von setup ein > while(tasterAktiv) { ... }. > In diesem while machste das was du tun musst. Wenn alles fertig ist > setzt du tasterAktiv auf false und die while wird verlassen und die loop > ist dran. > > Ob die Funktionen im Sketch oben oder unten stehen in der Reihenfolge > ist in der Arduino IDE egal. Die baut sich die Funktionsprototypen > selbst zusammen. Entscheidend ist was in setup / loop steht bzw. > aufgerufen wird. Danke, so genau wusste ich das noch nicht. Das Setup steht bei diesem Sketch fast am Ende. Dort habe ich meinen Teil reingeschrieben. Intuitiv habe ich es dann wohl richtig gemacht. Dass ich die Taste beim Einschalten gedrückt halten muss, ist von mir so gewünscht. Geht ja nur um den seltenen Fall, wenn ich mal einen Sensor tausche. Ich denke dass irgendwann ein Anschlussdraht abbricht. Wenn das Teil im Gehäuse ist, poste ich Foto. Auf jeden Fall habe ich Lust bekommen mich mit weiteren Projekten zu beschäftigen und mich auch mal an ein eigenes Programm ran zu trauen.
Peter D. schrieb: > Ich würde lieber einen Kurzschluß auf den Sensorleitungen erkennen > wollen und daher noch einen Widerstand opfern, z.B. für die Taste an > MISO. Dietmar S. schrieb: > P4 scheint aber einfacher, das werde ich versuchen. > > Dass die Sensoren dabei unterbrochen werden, spielt keine Rolle, da ich > den Taster nur einmalig drücke. Ich halte den Taster gedrückt und > schalte das Thermometer ein. Den Zustand frage ich nur einmal bei > Programmstart ab, das EEprom wird gleich zu Beginn gelöscht und ich kann > ich die Sensoren wieder anlernen. Einen dauerhaften Kurzschluß auf den Sensorleitungen bekommt er auch so mit, keine Ergebnisse mehr. Der Taster soll nur sehr selten während des Einschaltvorgangs gedrückt werden, noch bevor I2C gestartet wird. Gegen einen kleinen Schutzwiderstand von max. 220 Ohm in Reihe zu dem Taster spricht aber nichts. Außerdem, einen externen I2C-Bus oder andere längere Zuleitungen zu den Ports würde ich ohne Schutzbeschaltung niemals einsetzen. Hat sich tatsächlich einmal bewährt. Bei einem Blitzeinschlag in der Nähe hatte es bei uns seinerzeit zahlreiche Elektrogeräte zerlegt. Bei meiner Hausmeldeanlage mit 5 verteilten Mikrocontollern und der "längsten Antenne" überhaupt, hat es nur einen Portpin von einem Mikrocontroller erwischt. Bitte nur als Ratschlag verstehen, noch viel Spaß beim basteln ...
Alex D. schrieb: > Gegen > einen kleinen Schutzwiderstand von max. 220 Ohm in Reihe zu dem Taster > spricht aber nichts. > > Außerdem, einen externen I2C-Bus oder andere längere Zuleitungen zu den > Ports würde ich ohne Schutzbeschaltung niemals einsetzen. Macht Sinn. Ich habe zwar nur kurze Zuleitungen, hantiere aber damit und habe hier ziemliche Probleme durch elektrostatische Aufladung.
Folgende Schutzbeschaltung ist dem Mikrocontroller zur Überwachung unserer Heizung vorgeschaltet. Allerdings ist nur ein Sensor je Port angeschlossen bei 5V-Betriebsspannung. Sollte aber auch mit 4 Sensoren funktionieren, da die Dinger ohne Aufruf hochomig sind. R1= Schutz gegen Kurzschluss der 5V R2= Serienwiderstand zum Portpin, unterstützt von D1 und D7 R3= wired-or I2C C1= Stützkondensator für I2C Mit mehrenen Sensoren an einen Bus hatte ich beim Messen im Abstand von 30sec leicht erhöhte Temperaturwerte festgestellt. Da genügend Portpins vorhanden waren, ist hier nur ein Sensor pro Portpin und Aufgabe angeschlossen.
Allu schrieb: > R4= Schutz gegen Kurzschluss der 5V > R5= Serienwiderstand zum Portpin, unterstützt von D8 und D9 > R6= wired-or I2C > C3= Stützkondensator für I2C Sorry, war der falsche Schaltungsausschnitt.
Kann ich nicht einfach eine Supressordiode nehmen?
Dietmar S. schrieb: > Kann ich nicht einfach eine Supressordiode nehmen? Kann ich leider nicht beantworten, habe ich noch nie ausprobiert. Einen , weil auch I2C-Ausgang, kleinen Widerstand in Reihe würde ich dem Port-Pin schon spendieren.
Hallo, wo kommt denn jetzt plötzlich I2C her? Dietmar hat One Wire und SPI. Ohne Kenntnisse des Aufbaus wie weit alles voneinander weg ist, kann man keine guten Tipps geben.
Veit D. schrieb: > wo kommt denn jetzt plötzlich I2C her? Dietmar hat One Wire und SPI. > Ohne Kenntnisse des Aufbaus wie weit alles voneinander weg ist, kann man > keine guten Tipps geben. Sorry, war ein Schreibfehler. Bitte I2C im Kopf gegen one Wire tauschen. Die Anschaltung ist für One Wire DS-Temperatursensoren ausgelegt.
Allu schrieb: > Sorry, war ein Schreibfehler. Bitte I2C im Kopf gegen one Wire tauschen. Außerdem bitte den oben irrtümlich geposteten, falschen Schaltplanausschnitt im Kopf gegen den richtigen, leider unbekannten Schaltplan tauschen. ;)
mIstA schrieb: > Allu schrieb: >> Sorry, war ein Schreibfehler. Bitte I2C im Kopf gegen one Wire tauschen. > > Außerdem bitte den oben irrtümlich geposteten, falschen > Schaltplanausschnitt im Kopf gegen den richtigen, leider unbekannten > Schaltplan tauschen. ;) Der Schaltplan ist richtig, ich habe von den 6 gleichen One-Wire-Anschlüssen aus versehen den 3. statt dem 1. Ausschnitt erwischt und damit falsche Bauteilnummern eingetragen. Habe ich leider zu spät bemerktst aber direkt darunter korrigiert. Falls Du jetzt noch wissen willst warum 4 Anschlüsse, die Masse ist doppelt ausgeführt.
Alex D. schrieb: > Gegen > einen kleinen Schutzwiderstand von max. 220 Ohm in Reihe zu dem Taster > spricht aber nichts. Was oder wovor soll der 220 Ohm-Widerstand schützen?
Zugegeben, es sieht ein wenig aus, wie ein amerikanischer Anrufbeantworter aus den 1980ern... Auf jeden Fall funktioniert es jetzt wie gewünscht und ich kann mir 4 Temperaturen anzeigen lassen. Der "Anlerntaster" ist auf der Rückseite. Den Code habe ich auch noch etwas verändert (aber nicht weiter dokumentiert). Die DIN-Buchse ist für die Spannungsversorgung. Habe mir irgendwann für solchen Kleinkram ein Universalnetzteil gebaut mit 5/9/12V. An der DIN-Buchse sind alle Spannungen vorhanden. Egal welche Spannung benötigt wird, einfach reinstecken, passt immer.
Gute Idee und gute Umsetzung. Gibt es Erfahrung mit der Reichweite der Sensoren? Sind abgeschirmte Sensorleitungen notwendig? Tipp für für den "Anlerntaster". Ich habe in solchen Fällen einen Reedkontakt verwendet. Dieser kann am Print verbaut werden und mit einem Magnet durch's Gehäuse aktiviert werden. Vorteil : man spart sich die Bohrung im Gehäuse, der Reedkontakt ist billiger als der Taster, es kann kein Schmutz eindringen, weniger Probleme mit ESD und der Taster kann nicht unabsichtlich betätigt werden. https://www.mouser.at/ProductDetail/MEDER-electronic-Standex/GP560-10-15/?qs=%252B6g0mu59x7JtDJpQb1U9ag%3D%3D
:
Bearbeitet durch User
Sorry, eben erst gelesen. Benachrichtigungen kommen leider auch nicht an wenn man uC.net bei GMX auf die Whitelist setzt. Gerald K. schrieb: > Gute Idee und gute Umsetzung. Gibt es Erfahrung mit der Reichweite der > Sensoren? Sind abgeschirmte Sensorleitungen notwendig? Der Entwickler schreibt dazu: "You can connect to the temperature sensors using twisted-pair cables of several metres; with long cables a linear topology is recommended rather than a star configuration." Ich habe meine noch nicht angelötet. Nehme dafür ein dünnes abgeschirmtes Audiokabel, was bei 50cm sicher nicht nötig ist, aber es liegt gerade auf der Werkbank. > Tipp für für den "Anlerntaster". Ich habe in solchen Fällen einen > Reedkontakt verwendet. Dieser kann am Print verbaut werden und mit einem > Magnet durch's Gehäuse aktiviert werden. Oh man...Hand vor den Kopf schlag. Die Idee kam mir sogar, aber ich habs irgendwie wieder vergessen. Jetzt wo Du Reedkontakt erwähnst, fällt es mir auch spontan wieder ein. Das Drücken des Tasters hat ja zum Glück nur beim Start Auswirkung. Deshalb habe ich ihn auch nicht vertieft ins Gehäuse gesetzt.
Dietmar S. schrieb: > Das Drücken des Tasters hat ja zum Glück > nur beim Start Auswirkung. Deshalb habe ich ihn auch nicht vertieft ins > Gehäuse gesetzt. Wirklich? Was passiert wenn etwas unter BOX liegt, z.B. ein Bierdeckel, der dauerhaft auf den Kontakt drückt. Wenn ich die Funktion richtig verstanden habe, dann ist der BUS zu den Sensoren lahm gelegt, oder? So gesehen ist es besser den Taster zu versenken.
:
Bearbeitet durch User
Gerald K. schrieb: > Was passiert wenn etwas unter BOX liegt, z.B. ein Bierdeckel, der > dauerhaft auf den Kontakt drückt. Bei dem Fliegengewicht der Box und dem Druckpunkt des Tasters müsste aber schon noch ein Stein Bier auf der Box stehen ;) Gerald K. schrieb: > Wenn ich die Funktion richtig > verstanden habe, dann ist der BUS zu den Sensoren lahm gelegt, oder? Genau. Aber wen interessiert's, das ist ein Hobbyprojekt. Wenn die Anzeige einfriert, nehm ich das Bierglas halt wieder runter. Hab's probiert, die Anzeige aktualisiert sich dann wieder und alles ist wieder gut.
Saag des Mistding obe und saufsder mit der Maß schee!
Gerald K. schrieb: > Was passiert wenn etwas unter BOX liegt, z.B. ein Bierdeckel, der > dauerhaft auf den Kontakt drückt. Wenn ich die Funktion richtig > verstanden habe, dann ist der BUS zu den Sensoren lahm gelegt, oder? Wie schon gesagt, deshalb würde ich den Taster über einen Widerstand mit an einen LCD-Pin legen. Aber das kostet eben einen Widerstand 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.