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
Toll was du wieder für Einfälle hast ;-) Hoffentlich komme ich mal dazu es nachzubauen.
Danke :-) Eine "kleine" Version mit einem 2x16 Display ist auch schon in Arbeit...
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.
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 |
>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
Bernhard S. schrieb: > Beitrag "1wire Slave Tester ATmega8 Assembler" Donnerlitchen, da ist mir was entgangen ;-)
...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
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
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
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
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
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
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.