Forum: Projekte & Code 1-Wire OW-wire slave device <=4MHz low current AVR assembler ATmega8


von Bernhard S. (bernhard)



Lesenswert?

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
von Klaus D. (kolisson)


Angehängte Dateien:

Lesenswert?

Das finde ich doch schön.

Der Vollständigkeit halber ergänze ich mal mit meiner Bascom Version.


Gruss Klaus

von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

@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

von Klaus D. (kolisson)


Angehängte Dateien:

Lesenswert?

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

von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

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

von RoBue (Gast)


Lesenswert?

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

von Klaus D. (kolisson)


Lesenswert?

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

von RoBue (Gast)


Angehängte Dateien:

Lesenswert?

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

von Klaus D. (kolisson)


Lesenswert?

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.

von RoBue (Gast)


Angehängte Dateien:

Lesenswert?

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

von Klaus D. (kolisson)


Lesenswert?

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.

von RoBue (Gast)


Angehängte Dateien:

Lesenswert?

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

von Klaus D. (kolisson)


Lesenswert?

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

von RoBue (Gast)


Angehängte Dateien:

Lesenswert?

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)

von Klaus D. (kolisson)


Lesenswert?

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

von RoBue (Gast)


Lesenswert?

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

von RoBue (Gast)


Angehängte Dateien:

Lesenswert?

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

von Klaus D. (kolisson)


Lesenswert?

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

von Bernhard S. (bernhard)


Lesenswert?


von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

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
von Bernhard S. (bernhard)


Lesenswert?

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
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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
von Bernhard S. (bernhard)


Lesenswert?

@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

von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

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
von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

... 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
von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

... die 2MHz Version

von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

... der Programmablauf des Interrupts

von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

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