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.
> 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!
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:
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.
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.
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:> 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?
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.
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."
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.
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 ;)
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.
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.
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.
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
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.
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 ...
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.
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.
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.
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.
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.
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
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.
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.
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.