Ein Beispiel eines universell einsetzbaren 1-WIRE Slaves /Devices. Folgende ROM Commands werden unterstützt: - READ ROM - SEARCH ROM - MATCH ROM - SKIP ROM Functions Commands: - READ SCRATCHPAD - WRITE SCRATCHPAD - KONVERT / MESSUNG Die ROM-ID kann beliebig geändert werden, stimmt die Prüfsumme nicht, nicht schlimm, im Display erfolgt eine Fehlermeldung mit Darstellung der korrekten Prüfsumme. Das 256 Byte große SCRATCHPAD kann beliebig genutzt werden um z.B.: - DATEN abzulegen (SRAM/EEPROM) - PORTS anzusteuern / abzufragen - ADC auszulesen - Display anzusteuern - Uhr auszulesen Die Version1 simuliert einen DS19s20, es wird permanent "23GRD" DATEN im SCRATCHPAD zur Verfügung gestellt. Getestet habe ich diese Version mit einem 1-WIRE USB-Adapter und Beitrag "DS1820 DS18s20 Digital Thermometer 1-wire Beispiele ATmega8 Assembler" Große Probleme traten beim senden eines 0-SLOT auf. Aus diesem Grund wird bei einem Interrupt-Aufruf zuerst der PIN gegen GND gezogen, und dann erst entschieden, ob ein READ oder WRITE erfolgen soll. Gegenwärtig wird der µC noch mit 16 MHz getaktet, ich denke, 2 MHz wären theoretisch möglich (Stromverbrauch). Sollen weitere Interupts benötigt werden, z.B. für eine DCF-Uhr, dann sollten verschachtelte Interrupts verwendet werden. Vorsicht, die meisten Berechnungen werden in der 1-WIRE Interrupt-Routine durchgeführt, teilweise dauert eine Berechnung in dieser Version ca. 8µs. Für Anregungen und Hinweise bin ich sehr dankbar. Bernhard PS: Die Version ist nicht hochgradig optimiert, ich bitte um Verzeihung.
:
Bearbeitet durch Moderator
Das finde ich doch schön. Der Vollständigkeit halber ergänze ich mal mit meiner Bascom Version. Gruss Klaus
@alle im Bild "Display.jpg" hatte sich ein kleiner Fehler eingeschlichen, hier die Korrektur. Die Zeiten für einen 0Slot, 1Slot und Reset-Presence-Impuls sind in der oberen Zeile dargestellt. Hiermit könnte man relativ einfach einen Master überprüfen, ob die Impulslängen akzeptabel sind. Die untere Zeile zeigt die zuletzt empfangenen ROM und Functions Commands. @Klaus über die Kürze Deines Programms staune ich immer noch :-) Hättest Du noch ein HEX-File für uns? Nicht alle, ich gehöre leider mit dazu, besitzen BASECOM o.ä. Bernhard
Bernhard S. schrieb: > @Klaus > > über die Kürze Deines Programms staune ich immer noch :-) > > Hättest Du noch ein HEX-File für uns? > > Nicht alle, ich gehöre leider mit dazu, besitzen BASECOM o.ä. Naja okay. Dann hier nochmal den Source und das Hex damit es in einem Beitrag beisammen steht. Es sollte übrigens auch auf nem Tiny 25 laufen. Den hatte nur seinerzeit gerade nicht parat. Klaus
Die Version2 mit einem 8MHz Takt. Im Readmodus erfolgt ein Sample nach ca. 10µs und anschließend sofort die nötigen Berechnungen. Ein 0-Slot wird für nur 25µs gesendet, scheint auszureichen. Die Berechnungen dauern ca. 10µs. Bernhard
Hallo Bernhard und Klaus (und alle Interessierte), für BASCOM habe ich eine Art "Rohform" für 1-Wire-Slaves entwickelt, für die ich vor allem den Code von Klaus genutzt habe. Danke für die Vorlage. -> http://bascom-forum.de/showthread.php?4481-Emulation-von-1-Wire-Slaves Liebe Grüße, RoBue
Hallo Autor: RoBue (Gast) , ich habe jetzt noch nicht in dein ZIP hereingeschaut aber ich habe es mal heruntergeladen. Trotzdem möchte ich gern sagen , wie toll ich das finde, dass gewisse Dinge immer weiter gehen und dass das Stöckchen des Einen als Bauteil für die Leiter des Anderen wird. Das ist echt eine prima Zusammenarbeit hier. Gruss Klaus de Lisson
Hallo Klaus, ja ich war sehr dankbar für Deinen Code. Ich stelle ihn nun auch hier ein. Im BASCOM-Forum scheint das Interesse nicht (mehr) so groß. Dazu habe ich den Code gleich als Vorlage für eine SHT11-1-Wire-Device "missbraucht" - ID: 0xFE 0x53 0x48 0x54 0x00 0x00 0x01 0x13 - Kommando zur Messung: 0x12 (ca. 300ms warten!) - Kommando zum Auslesen: 0x11 - dann kann man 4 Bytes auslesen (Temperatur x 10, Luftfeuchte x10) Viel Spaß RoBue
Hi Autor: RoBue (Gast) , wie gesagt, ich finde es gut dass du postest damit es später in der Suchfunktion sitzt. Dann wünsche ich weiterhin viel Spass mit dem Proggen. k.
Hallo Leute, hier ein kleines Bild von der Anzeige des 1-Wire-Slaves. Achtung: Beim Download (s.o.) habe ich aus Versehen 2x das gleiche Zip-File angehängt. Sorry. Vielleicht kann das ein Webmaster entfernen. Hallo Klaus, wenn ich das Programm für ATtiny umschreibe, wie muss ich dann die Fuses setzen und den Takt in BASCOM angeben? Muss ich den Teiler durch 8 aktivieren oder nicht? Gruß RoBue
RoBue schrieb: > Hallo Klaus, > wenn ich das Programm für ATtiny umschreibe, wie muss ich dann die Fuses > setzen und den Takt in BASCOM angeben? Muss ich den Teiler durch 8 > aktivieren oder nicht? Die Frage macht mich stutzig, da du eben den selben Takt benötigst wie in deinem Programm angegeben. Es sind also 8Mhz . Bei den Tinys geht das doch auch. Ich habe mit Tiny 45 und Tiny13 gearbeitet. Bei einem der beiden gab es keine 8Mhz sonder 9,6Mhz und es klappte trotzdem. Gruss klaus p.s. schön auch , dass du dir dein eigenes Frontend proggen konntest.
Hallo Klaus, nun noch ein Bild meines Versuchsaufbaus: Mit 2x ATmega32 natürlich etwas "oversized", aber es funktioniert bisher fehlerfrei. Die Portierung auf ATmega8 will mir nicht gelingen. Ich erlebe das immer wieder, dass der ATmega8 nach dem 2. Flashen irgendwie den internen Takt ändert (halbiert?) und sich nicht wieder auf 8MHz einstellen lässt (BASCOM als Compiler, Ponyprog als Programmer). Mit den ATtinys habe ich kaum Erfahrung. Darum meine etwas einfältige Frage. Wennich recht verstanden habe, muss ich den internen Takt auf 9,2MHz ohne Teiler-Fuse einstellen und im Code 9600000 (oder 8000000?) MHz einstellen. Liebe Grüße, Roland
Hallo Roland, wegen deiner Probleme beim Proggen eines Mega8 kann ich nicht viel sagen, da ich als Programieradapter bisher immer über den Weg mit dem Printerport gegangen bin. sozusagen STK200 kompatibel mit dem HC244. siehe: http://aquaticus.info/AVR Dadurch habe bisher niemals Ponyprog verwenden müssen und kann direkt aus Bascom heraus proggen. Ich kenne mich mit Ponyprog nicht aus. Als mein laptop mal kaputt war und ich keinen Zugriff auf einen nativen Printerport hatte habe ich mir bei ullihome.de den Usb-lab gekauft. Der hat eine avr-isk mk2 eumulation drauf, die auch direkt aus bascom heraus funktioniert. Da ich derzeit in einer Art Umzug bin kann icht wirklich etwas nachschauen da ich nicht weis in welchem Karton ich suchen sollte. rein aus dem Gedächtnis würde ich dir empfehlen mal einen Mega 88 zu verwenden. Dieser ist ziemlich registerkompatibel mit dem Tiny 25/45/85. da kannst du das Programm auf dem 88er entwickeln und dann leicht modifiziert in den Tiny schiessen. Meiner Meinung nach lohnt es aber nicht wirklich die Tinys zu verwenden, da wir ja nicht in Stückzahlen rechnen müssen. Ich verwende daher ausschliesslich die 88er und bin happy. Eines aber sollte dir klar sein: Die M32 sind absolut nicht registerkompatibel zu den 88ern. Alles was Inlineassembler betrifft muss neu adressiert werden. Du kannst auch einen Mega644 kaufen, der einigermassen pinkompatibel zum M32 ist aber schon die Register des M88 hat. Wenn also deine Software auf dem 644 läuft ist es nicht mehr weit zum M88 oder Tiny25/45/85. Gruss Klaus p.s. weitere Fragen ? feel free ! Wenn du dich mal real anmeldest können wir dazu gern mal Skypen
Hallo Klaus, inzwischen läuft die ATmega8-Version problemlos - bisher. Hab jetzt einen externen Oszi mit 8MHz dran. Warum es diese Probleme bei mir gibt, weiß ich immer noch nicht. Näheres (Skype ...) nach dem Urlaub. Danke für alle Unterstützung und Hilfe. Was meinst Du, sollten wir 1-Wire-Slave als BASCOM-Variante nicht einen eigenen Thread widmen? Wir schrieben hier ja eigentlich in einem mit dem Namen: 1-WIRE SLAVE DEVICE BEISPIELE AVR ASSEMBLER(!!!). Liebe Grüße, RoBue (Roland)
RoBue schrieb: > Was meinst Du, sollten wir 1-Wire-Slave als BASCOM-Variante nicht einen > eigenen Thread widmen? Wir schrieben hier ja eigentlich in einem mit dem > Namen: 1-WIRE SLAVE DEVICE BEISPIELE AVR ASSEMBLER(!!!). Hallo Roland, ich meine nicht, dass man mehr machen sollte als schon ist. Dieser Thread ist ja auch nicht so überladen wie z.B. "zeigt her eure Kunstwerke". ich finde du hast soweit alles gut dokumentiert und wir sprechen uns nach den Urlauben. Die Tatsache, dass du nun einen externen Osci verwendet hast und es geht dann spricht allerdings sehr dafür, das ein Fuses-Problem ist. Soweit ich mich erinnere hat der M32 die Fuses für: 1.1Mhz 2.2Mhz 3.4Mhz 4.8Mhz Der M88 , wie auch die zuvor genannten Tinys haben hingegen den internen Grundoscillator mit 8Mhz und die Fuse für "divide by 8" ab Werk eingeschaltet. Du müsstest also ggf. diese Fuse einfach umschalten um von Standard = 1Mhz auf die 8 Mhz zu kommen. Anbei mal ein Bespiel zur veränderung des Taktes bei dem M88 kern. '******************* Taktoption ******************** 'teile Grundtakt durch 4 als option zum Stromsparen- Dazu aber auch Crystal anpassen, sonst geht Baud nicht mehr 'bei Bedarf also aktivieren. Wenn Gruntakt 8Mhz ergibt sich dann alo 2 Mhz ldi r25,$80 ldi r24 ,$02 !out clkpr,r25 'CLKPR Clock Prescale Register !out clkpr,r24 '******************* ende Taktoption / Bitte nur atomar ausführen wie hier abgebildet******** Näheres entnehme bitte dem Datenblatt. Wenn die Urlaubs dann vorbei sind reden wir weiter. Ich kämpfe im Moment nach 10 Jahren Frankreich mit den Behörden im Main-taunus-kreis um mal wieder gültige Papiere zu erhalten. Das ist auch nicht so easy weil mir keiner trauen mag wenn ich nach einer der Option frage mir eine Meldeadresse zu überlassen. Bis bald dann Klaus de Lisson
Hallo Klaus, eine kurze Zwischeninfo (aus dem Urlaub): Leider gibt es jetzt nach längeren Testläufen doch Probleme mit meinem "SHT11-ATmega8-1-Wire-Slave". Spätestens nach ein paar Stunden bleibt der hängen (andere, "echte" Slaves funktionieren weiter, d.h. lassen sich noch auslesen). Meine Frage: Gibt es eine Möglichkeit, deine Routine so aufzubauen, dass der 1-Wire-Reset IMMER wirkt, also auch irgendwelche Unterroutinen, die nicht vollständig ausgeführt wurden und evtl. auf weitere Befehle oder Impulse warten, abgebrochen werden? (Ich vermute das Problem nämlich beim Datenaustausch!) Liebe Grüße, RoBue
Hallo Klaus, hi Leute, nach eingen Versuchen und manchen Fehlschlägen liegt nun die 2. Version der Firmware für den 1-Wire-Slave vor. Aus Ermangelung eines ATmega8 bin ich auf ATmega168 umgestiegen. Aber das dürfte für die Profis kein Problem sein. Eine wichtige Änderung muss man einfügen, da hat Klaus wohl einen Fehler gemacht, der leider erst nach einger Zeit Abstürze hervorrief:
1 | ' RoBue: |
2 | ' Der Stackpointer liegt an der Obergrenze des SRAM |
3 | ' - SRAM bei ATmega168: &H5F + &H40 = &H045F |
4 | Const Stackpointer_high = &H04 |
5 | Const Stackpointer_low = &H5F |
6 | |
7 | ... |
8 | |
9 | ' *********************** isr |
10 | Isr: |
11 | ' Das ist Strange mit den Goto aus der Isr rauszugehen. |
12 | ' aber es läuft ... |
13 | |
14 | ' RoBue: ... doch nicht wirklich! |
15 | ' Der Stackpointer muss zurueckgesetzt werden !!! |
16 | Spl = Stackpointer_low |
17 | Sph = Stackpointer_high |
18 | |
19 | If Dq = 0 Then |
20 | Timer_t0 = T1reset |
21 | Goto Rwaitrise |
22 | Else |
23 | Goto Waitreset |
24 | End If |
25 | |
26 | Return |
27 | |
28 | '****************************** |
Anbei das Bild eines Versuchsaufbaufs (Gewölbekeller, ca. 15m Kabel) und die Firmaware für Slaves mit SHT11 und LCD im BASCOM- und HEX-Format. Außerdem gibt es einen Schaltplan. Liebe Grüße und viel Erfolg beim Experimentieren, RoBue
RoBue schrieb: > Eine wichtige Änderung muss man einfügen, > da hat Klaus wohl einen Fehler gemacht, > der leider erst nach einger Zeit Abstürze hervorrief: Ja, danke mein Lieber. Da hast du das ja herausgefunden. Für mich war das Project zu lange her um mich da konkret zu erinnern. Jetzt, wo du es sagst ist aber alles klar. Bei meinem Project ging es ja nur darum dem Dell-Laptop ein anderes Netzteil vorzugaukeln. Dieser Vorgang trat aber nur 1mal beim einschalten auf. Daher hatte ich diesen Fehler nicht zu verzeichnen. Gruss Klaus
Ein kleiner DCF77-1WIRE-SLAVE: Beitrag "DCF DCF77 UHR 1-WIRE 1WIRE SLAVES / DEVICES ATmega8 ASSEMBLER" Bernhard
Dieser 4MHz getaktete 1-WIRE-SLAVE simuliert in dieser Version den DS18S20. Bei ca. 5mA Stromaufnahme kann er vom OW-BUS mit dem nötigen Strom versorgt werden, wenn der Master entsprechend ausgelegt ist. Beispiel: Beitrag "TWI I2C USART RS232 - 1WIRE INTERFACE bridge device ATmega8 Assembler" Weitere Versionen mit z.B. HYT939, HH10D und DCF77 sind in Vorbereitung. Mehrere Kommandos versteht der SLAVE u.a: 0x33=READ-ROM 0x55=MATCH-ROM 0xF0=SEARCH-ROM 0xCC=SKIP-ROM 0XBE=SCRATCHPAD-read Die ROM-ID kann beliebig geändert werden, stimmt die Prüfsumme nicht, wird sie automatisch durch das Programm korrigiert. Problem: - Der SLAVE muss innerhalb von 6µs mit einem 0-SLOT antworten können, d.h. der LOW-Impuls vom MASTER wird vom SLAVE "übernommen" indem er seinen PIN sofort für einige µs gegen LOW zieht. Eine 2MHz Version ist theoretisch möglich, wird aber nicht von allen 1-WIRE-Mastern akzeptiert (Ursache unklar). - Der Slave muss innerhalb von ca. 45µs (60-9-6) alle nötigen Berechnungen durchführen und antworten können (z.B. ROM-SERCH). Wer möchte, kann ein TWI/I2C-LCD mit dem PCF8574 nutzen, um sich interne Werte anzeigen zu lassen. Der Assembler-Programm-CODE ist nicht hochgradig optimal, für Verbesserungsvorschläge bin ich sehr dankbar. Diese Beiträge sind u.a. sehr hilfreich: Beitrag "CARRY schnell invertieren Assembler ATmega8 ?" https://www.mikrocontroller.net/topic/241934#new Beitrag "DCF DCF77 UHR 1-WIRE 1WIRE SLAVES / DEVICES ATmega8 ASSEMBLER" Bernhard
:
Bearbeitet durch Moderator
Nach nächtelanger Arbeit ist dieser 4MHz LOW CURRENT SLAVE entstanden: Beitrag "1-Wire OW-wire slave device <=4MHz low current AVR assembler ATmega8"
:
Bearbeitet durch User
Kannst Du bitte zukünftig darauf verzichten, in Deinem eigenen Interesse den Betreff komplett in Großbuchstaben zu wählen? Das wirkt ziemlich aufdringlich in der Thread-Liste, besonders wenn da mehrere Zeilen (weil ähnliche Projekte) von Dir direkt untereinander stehen. Diese Aufdringlichkeit schreckt viele Leser direkt ab und daher erzielst Du genau das Gegenteil von dem, was Du wünschst: nämlich Aufmerksamkeit. Schade.
:
Bearbeitet durch Moderator
@Frank > Kannst Du bitte zukünftig darauf verzichten, in Deinem eigenen Interesse > den Betreff komplett in Großbuchstaben zu wählen? > Das wirkt ziemlich aufdringlich in der Thread-Liste.... Ja, gern, Kritik kam an. Bernhard
Dieser ATmega8 (4MHz) arbeitet mit einem HH10D oder HYT939. Stromaufbahme ca. 5mA, kann bei Bedarf über den Bus versorgt werden. Befinden sich beide Sensoren am TWI-Bus, dann wird der HYT939 bevorzugt. Die Sensorauswahl erfolgt bei Programmstart. Das Scratchpad (9 Bytes) stellt im HYT-Betrieb folgendes bereit: - RF in % - Temperatur des Sensors - CRC Im HH10D-Betreib: - RF in % - Offset - Sens - Frequenz des Oszillators - CRC Bei einem Fehler sendet der 1wire Slave statt RF den Fehler-Code (z.B. 0xFF = kein Sensor) Bei der Frequenzmessung (HH10D) wird immer ein Mittelwert zur vorhergehenden Messung gebildet, Problematik HH10D und 5V Versorgungsspannung: Beitrag "HH10D an 5V betreiben" CRC der ROM-ID wird bei Programmstart berechnet. Zeit für Messung HH10D: 1s Zeit für Messung HYT939: 100ms LED grün: Messung beendet LED gelb: Sensor wird angesprochen LED rot : Error Bernhard
:
Bearbeitet durch User
... update 2017 1wire Routinen vereinfacht Dieser 4MHz Slave mit einem ATmega8 simuliert einen DS18B20. Auch ohne Quarz arbeitete er bei mir einwandfrei. 1-WIRE-ROM-COMMANDS OW_COMMAND_SKIP_ROM =0xCC OW_COMMAND_MATCH_ROM =0x55 OW_COMMAND_ROM_READ =0x33 OW_COMMAND_SEARCH_ROM =0xF0 1-WIRE-FUNCTION-COMMANDS OW_FUNCTION_CONVERT_T =0x44 ;CONVERT "T" OW_FUNCTION_TX_PRIVATE_DATA =0xF6 OW_FUNCTION_READ_SCRATCHPAD =0xBE OW_FUNCTION_RECALL_EE =0xB8 Dieses Tool war bei der Programmierung des Slaves sehr hilfreich: Beitrag "1wire Slave Tester ATmega8 Assembler" Bernhard
:
Bearbeitet durch User
... der Programmablauf des Interrupts
Dieser Sensor fragt eine kleine Solarzelle ab, im Scratchpad steht das ADC-Ergenbis der Beleuchtungsstärke. Ein Webserver nutzt diese Daten um die Bewölkung anzuzeigen. Bei 5mA Strombedarf des Sensors, könnte er direkt über den BUS versorgt werden.
:
Bearbeitet durch User
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.