Forum: Projekte & Code 1wire BUS Sniffer Tester AVR ATmega8 Assembler


von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

Geschätztes Forum,

dieser passive 1wire Sniffer liest den 1wire Bus mit und zeigt u.a. die 
Temperaturen der Slaves an (z.B. DS18s22,DS1822,DS18B20).

Die Hanhabung ist ganz einfach.

Schaltung am OW BUS anschließen und warten, bis ein beliebiger Master 
die Temperaturen seiner Slaves abfragt.

Automatisch werden die mitgelesenen ROM-IDs in einer Liste eingetragen.

Nun kann man aus einer Liste (max 60 Slaves) seinen gewünschten Slave 
ausählen, im Hauptmenue wird dann die ROM-ID, das Scratchpad und die 
Temperatur angezeigt (s. Bild4).


Prinzip:

Nach einem Reset-Presence werden die einzelnen Datenbytes 
mitgeschrieben.
ROM-SEARCH (0xF0) ignoriert das System.

Wurden mindestens 19 Bytes empfangen:

1x ROM-Command
8x ROM-ID
1x Function-Command
9x Scratchpad

dann erfolgt ein CRC-Check der ROM-ID und des Scratchpads. Die 
Temperaturen werde berechnet und angezeigt.

Die Menueführung erfolgt über die 4 Tasten.

Im Menue "Wartung" wird u.a. der Reset-Presence-Counter (ca. 400) 
angezeigt.

Die Error-Meldungen können deaktiviert werden, es leuchtet dann nur die 
rote LED.

Ein Quarz ist nicht zwingend erforderlich.

Auch auf den Transistor kann verzichtet werden, er dient nur zum 
Hardware RESET des OLED-Displays.

Die Anzeige "Historie ROM-Commands" könnte nützlich sein, so erkennt 
man, wie der Master mit den SLaves arbeitet.

Bei Gelegenheit möchte ich noch andere Versionen vorstellen.

Bernhard

: Bearbeitet durch User
von Jörn P. (jonnyp)


Lesenswert?

Toll was du wieder für Einfälle hast ;-)
Hoffentlich komme ich mal dazu es nachzubauen.

von Bernhard S. (bernhard)


Lesenswert?

Danke :-)

Eine "kleine" Version mit einem 2x16 Display ist auch schon in Arbeit...

von Jörn P. (jonnyp)


Lesenswert?

Hast du dich schon mal an der "find alle" Routine versucht? Ich habe mir 
nicht die Zeit genommen, weil es mir nüscht genützt hätte zu wissen wer 
da alles am Bus hängt, ohne zu wissen WO er hängt. Hab die Dinger vorher 
alle einzein identifiziert und nummeriert, bevor ich sie verbaut hab.

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Snipped, läuft auf einem ATtiny45 mit 1MHz

Routinen werden per rcall aufgerufen, die ID ab 'Z' gespeichert

Mehr oder minder aus den AppNotes abgeleitet

1
ow_Search_ROM_new:  ;0xF0
2
ldi DATA,0xF0
3
rjmp ow_Search_new
4
5
ow_Search_ROM_next:  ;0xF0
6
ldi Data,0xF0
7
rjmp ow_Search_Next
8
9
ow_Search_Alarm_next:  ;0xEC
10
ldi Data,0xEC
11
rjmp ow_Search_next
12
13
ow_Search_Alarm_new:    ;0xEC
14
ldi Data,0xEC
15
16
17
;** Funktion speichert die ID des gefundenen Slave ab Z **
18
ow_Search_New:      ;ersten Slave suchen
19
  clr Anzahl      ;neue Suche, wir beginnen mit 0 beim Zählen
20
  ldi Kollision,0x00  ;auch das erste Bit kann verschieden sein, da nur bis 0x40 geprüft wird, sind wir mit 0xFF 'außen vor'
21
ow_Search_Next:      ;weiteren/nächsten Slave suchen
22
sbrc  rFlag,fLastSlave  ;wurde beim letzten Mal der letzte Sensor gefunden?
23
clr Anzahl          ;Ja, dann Anzahl auf 0, da wir wieder vorne anfangen mit Suchen, Kollision müsste eh auf 00 stehen
24
  clr LastZero
25
  ldi Bitposition,1    ;1...64
26
  ldi ZL,LOW(ow_ID)  ;Z auf ID-Speicher
27
  ldi ZH,HIGH(ow_ID)
28
  LD BitMaske,Z      ;Erstes Byte vom alten Ergebnis einlesen
29
  rcall ow_Send_Byte    ;Data senden
30
ow_Search_next_Bit:  ;** hier Bit
31
  rcall ow_Read_Bit    ;lese IN-Bit
32
  nop            ;wird für Simulator gebraucht, um ggf. CY umzudrehen
33
  nop            ;wird für Simulator gebraucht, um ggf. CY umzudrehen
34
  brcc ow_INBIT_NULL
35
  SBR rFlag,(1<<fIN_BIT)  ;setze gefundenes IN-Bit in Flag-Register
36
ow_INBIT_NULL:
37
  rcall ow_Read_Bit  ;** hier NICHT-Bit
38
  nop            ;wird für Simulator gebraucht, um ggf. CY umzudrehen
39
  nop            ;wird für Simulator gebraucht, um ggf. CY umzudrehen
40
  brcc ow_NOTINBIT_NULL
41
  SBR rFlag,(1<<fNOT_IN_BIT)  ;setze gefundenes NOT-IN-Bit in Flag-Register
42
;Hier sind 1 oder 2 Bit gesetzt
43
  SBRC rFlag,fIN_BIT
44
  rjmp ow_Search_noSlave  ;hier sind beide Flags gesetzt, somit kein Slave gefunden, Error
45
ow_NOTINBIT_NULL:
46
;Hier ist maximal 1 Bit gesetzt
47
  SBRC rFlag,fIN_BIT
48
  rjmp ow_Verzweige_1    ;wenn IN-BIT gesetzt ist, verzweigen wir nach 1
49
  SBRC rFlag,fNOT_IN_BIT
50
  rjmp ow_Verzweige_0    ;wenn NOT-IN-BIT gesetzt ist, verzweigen wir nach 0
51
;Hier sind beide Bits nicht gesetzt, in bede Richtungen ist mindestens ein SLave vorhanden
52
  ;Last Zero setzen, wenn bei letzter 'Wahl' der 0-Weg eingeschlagen wurde
53
  CP BitPosition,Kollision  ;sind wir an der letzten Kollision des letzten Durchgang?
54
  BREQ ow_Verzweige_1    ;ja, dieses Mal gehen wir den 1-Weg
55
  BRLO ow_letzteWahlbeibehalten    ;bei = 1-Weg, bei > 0-Weg, bei < Bit aus alter ID nehmen
56
;Hier >, also 0-Weg wählen UND LastZero setzen
57
  MOV LastZero,BitPosition    ;merken, daß wir bei Verzweigung einen 0-Weg gegangen sind
58
  rjmp ow_Verzweige_0              
59
ow_letzteWahlbeibehalten:
60
  ;Hier das Bit aus der vorhandenen ID auslesen
61
  sbrc BitMaske,0      ;steht im rechten Bit von Bitmaske
62
  rjmp ow_Verzweige_1    ;und wird letzendlich vom neu einzuschiebendem Bit ersetzt (bzw. bleibt)
63
  MOV LastZero,BitPosition    ;merken, daß wir bei Verzweigung einen 0-Weg gegangen sind
64
ow_Verzweige_0:
65
  rcall ow_Write_Bit_0
66
  CLC
67
  rjmp ow_Bitschieben
68
ow_Verzweige_1:
69
  rcall ow_Write_Bit_1
70
  SEC
71
ow_Bitschieben:
72
  ror BitMaske  ;Carry (das Bit) von links in die Bitmaske schieben
73
ow_After_Wahl:
74
  CBR rFlag,(1<<fNOT_IN_BIT)|(1<<fIN_BIT)  ;Flags wieder löschen
75
  mov temp,BitPosition
76
  dec temp      ;BitPosition von 1-64, bei -1 kann durch Prüfen der unteren 3 Bit auf =7 jedes 8.te Bit erkannt werden
77
  andi temp,0x07    ;untere 3 Bit maskieren
78
  cpi temp,7      ;sind 8 Bits eingelesen?
79
  BRNE ow_keine_7_bits
80
  ST Z+,BitMaske    ;BitMaske spechern
81
  LD BitMaske,Z    ;alte BitMaske einlesen
82
ow_keine_7_bits:
83
  inc BitPosition
84
  cpi BitPosition,65
85
  BRNE ow_Search_Next_Bit
86
;Hier sind die 64 Bit ausgelesen und der Slave ausgewählt
87
  CLC ;kein Fehler
88
  rjmp ow_Search_Ende
89
ow_Search_noSlave:    ;Fehler: während Search antwortet der Slave nicht mehr
90
  SBRC rFlag,fSearch_noSlave
91
  SEC          ;Carry setzen für 'Fehler gefunden'
92
  rjmp owSearch_fertig
93
ow_Search_Ende:
94
  inc Anzahl
95
  MOV Kollision,LastZero    ;letzte Verzweigung merken
96
;rcall tastout
97
  cpi Kollision,0        ;sind wir auf Null?
98
  brne  clFlag
99
  sbr  rFlag,(1<<fLastSlave)  ;ja, dann haben wir den letzten Slave gefunden
100
  rjmp owSearch_fertig    ;beim nächsten Aufruf von NEXT wird aber ebenfalls der erste Slave gefunden
101
clFlag:
102
  cbr  rFlag,(1<<fLastSlave)  ;sonst nicht
103
owSearch_fertig:
104
ret

von Bernhard S. (bernhard)


Lesenswert?

>Hast du dich schon mal an der "find alle" Routine versucht?


ROM-SEARCH (Rom Command=0xF0) ist eine typische Funktion eines Masters,
dieser Slave greift nicht in den Datenbus ein,
er ist passiv und "lauscht" nur.

Beispiel eines Masers (Tester)

Beitrag "1wire Slave Tester ATmega8 Assembler"


@Patrick J.

Danke für Dein Beispiel, werde es mal testen :-)

: Bearbeitet durch User
von Jörn P. (jonnyp)


Lesenswert?

Bernhard S. schrieb:
> Beitrag "1wire Slave Tester ATmega8 Assembler"

Donnerlitchen, da ist mir was entgangen ;-)

von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

...Update 03/2017

Das Menue "Historie ROM Function Command" könnte ev. interessant sein.

Es wird immer ein Pärchen angezeigt,
bestehend aus dem ROM-Command und dem Function-Command.

Beispiel "CC44" ---> Skip ROM + CONVERT_T

Es lässt sich sehr schön die Arbeitseise eines MASTERS abesen.

Die "Minus-Taste" löscht den Historienspeicher.


- SKIP ROM        0xCC
- MATCH ROM       0x55
- SEARCH ROM      0xF0
- SEARCH ALARM    0xEC

- Single ROM read 0x33
- Scratchpad read 0xBE
- CONVERT_T       0x44
- RECALL EE       0xB8

: Bearbeitet durch User
von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

... die LCD 2x16 4MHz Variante

von Oldpapa (Gast)


Lesenswert?

Fände es hilfreich, wenn wer auch selbst Master sein kann um einfach 
einen Bus selbst aktiv abzufragen.
Würde ein toller 1Wire " Universaltester" werden.

Ein nützliches Gerät zur Fehlersuche in größeren 1Wire Umgebungen, 
Hausautomatisierung etc...

Was meinst Du?

Danke

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Da muß aber zwingend darauf geachtet werden, daß der Sniffer und der 
eigentliche Master auf dem zu Testenden Bus sich nicht gegenseitig 
abschießen.

MfG

von Avrler (Gast)


Lesenswert?

Hallo,

ich habe leider nur einen kleinen arduino mit atmega328 und bootloader.

Könntest Du netterweise einmal ein Hexfile für den 328 assemblieren?

Vielen Dank im Voraus

von Avrler (Gast)


Lesenswert?

Ich meinte ein Hexfile für Deinen 1 Wire Tester:

Beitrag "1wire Slave Tester ATmega8 Assembler"

Es überfordert mich Deinen Source Code aus den ZIP Files zu 
assemblieren, wenngleich es mich interessieren würde.

Das Sammelsurium an Dateien überblicke ich nicht.


Danke nochmal

von Uwe (de0508)


Lesenswert?

Hallo,

Avrler schrieb:
> Ich meinte ein Hexfile für Deinen 1 Wire Tester:
>
> Beitrag "1wire Slave Tester ATmega8 Assembler"
>
> Es überfordert mich Deinen Source Code aus den ZIP Files zu
> assemblieren, wenngleich es mich interessieren würde.
>
> Das Sammelsurium an Dateien überblicke ich nicht.
>
>
> Danke nochmal

mit einem einfachen Übersetzen ist es leider nicht getan, die 
Sprungtabelle am Anfang des Programms und seine Größe unterscheidet sich 
u.a.
Der Stack im SRAM liegt dann auch wo anders.

Ein atmega8 ist kein atmega328p

Siehe "AVR094: Replacing ATmega8 by ATmega88"
http://www.atmel.com/images/doc2553.pdf

von Avrler (Gast)


Lesenswert?

Natürlich ist das Arbeit, automatisch wird sich das nicht selbst 
assemblieren.

Darum habe ich Bernhard auch nur gefragt.
Das scheint mir aber alles so gut strukturiert, das es wohl wenig 
Aufwand sein wird.

Was meinst Du, Bernhard?

von Bernhard S. (bernhard)


Lesenswert?

Beispiel eines Assembler ROM-Search-Algorithmus,

inwiefern er sich von Patricks Version unterscheidet,

kann ich nicht sagen.

Vielleicht findet Ihr Unterschiede ?


Beitrag "1wire Slave Tester ATmega8 Assembler"

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.