AVR Attiny44A als 1Wire Slave konfiguierbar DS2423/DS18BS20/DS2408/DS2413/DS2450

Begonnen von ritchie, 11 April 2014, 17:34:27

Vorheriges Thema - Nächstes Thema

ritchie

Hallo Zusammen,

ich habe den Quellcode von Tobias Mueller als Basis für eine erweiterte Version des 1wire Slave verwendet.
Hierbei habe ich den Quellcode überarbeitet und die beiden Version von Tobias DS2423/DS18BS20 in einen Quellcode eingepflegt.

Zusätzlich habe ich eine Emulation eine DS2408 und DS2413 eingebaut. Hierbei habe ich auch die EEPROM Routinen
zum Speichern der Daten im EEPORM bei Powerfail eingefügt. Jedoch habe ich in meinem Quellcode derzeit nur einen ATTINY44A unterstützt,
da mein Ziel ein DS2408 war und hier der Speicher bei den anderen Chips mir zu klein war. Und wegen ein paar Cent
mir die "Birne" nicht verbiegen wollte.

Zudem habe ich noch eine Optimierung des Stromverbrauchs durchgeführt. Derzeit unterstützt der Code jedoch nur den
Idle Mode der CPU, was aber immerhin 2-3mA Strom einspart, wenn der CHIP nicht arbeitet.

Der Quellcode wurde ausführlicher dokumentiert, damit andere die ganze Sache besser verstehen können

Die DS2408 Software und die DS2413 Software habe ich mit Signalspeicherung bis zur nächsten Abfrage ausgestattet, was ich noch genau testen muss. Auf dem Schreibtisch arbeitet es recht gut. Hierbei werden kurze Impulse, welche zwischen dem Abtasten der Chips von der CPU erzeugt wurden, zwischengespeichert.

Der Code steht unter GNU (wie auch im Quellcode erklärt) und ich bitte darum alle Autoren im Code stehen zu lassen, selbst wenn man den Code aus diesem Modul rauskopiert. Hier sollte immer ein Hinweis auf die ursprunglichen Autoren vorhanden sein.

Bitte auch die Wiki Betrag lesen: http://www.fhemwiki.de/wiki/1-Wire_Emulation_per_ATTiny

Viele Grüße

R.

P.S.: Anbei der Quellcode und der verwendete Schaltplan.
Edit: Schaltplan angepasst. Hier arbeite ich jetzt mit einem Fotowiderstand, welcher besser LED's erkennt (verschiedene Farben)
Der Quellcode wurde leicht überarbeitet. Fehler beseitigt. Stromverbrauch gesenkt (ca. 7mA, Neue Werte, wie im Schaltplan noch nicht gemessen)

Edit 10.10.2015
- Schaltplan aktualisiert (Fehler für Gold-Cap Ladung, Powerfailerkennung)
- Software Version 2.01 überarbeitet, Fehler EEPROM Sichern bei Powerfail behoben (Spannungsteiler entscheidend)
  (Dauerbetrieb folgt noch, da hier Spannungseinbrüche zum Stop des Slaves führen können)
- Fusebits als Bild beigefügt.
- Interrupt-Handling für Powerfail geändert.
Edit: 04.12.2015
- Erweiterung des DS2423 um den Memorypage Support 14 & 15
- Kleine Fehler im DS2408 (siehe Thread)
- Powerfail Tests  stehen noch aus, diese sollten aber nur eine Hardware oder Fusebits sein (BODLEVEL)
- Counter für Schreibbefehlen in Memorypage und Powerfail eingeführt.
Die Portierung der Memoryfunktion in benötigt viel Programmspeicher und kann nur noch in größere Version des ATTINY portiert werden
Edit:22.10.2017
- Erweiterung um einen DS2450, läuft seit Monaten bei mir fehlerfrei
  neue Version separat mit der Version "owslave_2_03.c" abgelegt,
- Schaltplan für AnalogMessung beigefügt. 0-10V Schaltung.



define DS2408_A20000000001 OWDevice 29.A20000000001 2
attr DS2408_A20000000001 model DS2408
attr DS2408_A20000000001 room OWDevice

IPU662  Ipfire & Fhem (Homematic + MAX) - Produktiv
Cubietruck (1Wire - USB) - Produktiv

locutus

Hallo ritchie,
ich habe versucht das C-File zu kompilieren:

avr-gcc -g -Os -mmcu=attiny44a -c owslave.c
owslave.c: In function â__vector_2â:
owslave.c:1310:1: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
owslave.c: In function âmainâ:
owslave.c:1358:39: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]


wie man sieht, ohne Erfolg. Compiler Version 4.7.2. Irgendeine Idee?

Ach übrigens, der C101 kann nicht aufgeladen werden. Durch die D100 kann der Gold-Cap nur entladen werden.

ritchie

Hi,

ich habe den Quellcode mit dem AVR Studio in einer Windows VM übersetzt.

Heute morgen nochmals extra für Dich, um diese Ausgabe zu bekommen.

------ Build started: Project: owslave, Configuration: Debug AVR ------
Build started.
Project "owslave.cproj" (default targets):
Target "PreBuildEvent" skipped, due to false condition; ('$(PreBuildEvent)'!='') was evaluated as (''!='').
Target "CoreBuild" in file "E:\Atmel Studio 6.0\Vs\Compiler.targets" from project "S:\owslave\owslave.cproj" (target "Build" depends on it):
Task "RunCompilerTask"
E:\Atmel Studio 6.0\make\make.exe all
Building file: .././owslave.c
Invoking: AVR/GNU C Compiler : (AVR_8_bit_GNU_Toolchain_3.4.0_663) 4.6.2
"E:\Atmel Studio 6.0\extensions\Atmel\AVRGCC\3.4.0.65\AVRToolchain\bin\avr-gcc.exe" -funsigned-char -funsigned-bitfields -I"S:\owslave-master\DS2423A\DS2423A"  -O1 -fpack-struct -fshort-enums -g2 -Wall -c -std=gnu99 -MD -MP -MF "owslave.d" -MT"owslave.d" -MT"owslave.o"  -mmcu=attiny44a   -o"owslave.o" ".././owslave.c"
In file included from .././owslave.c:37:0:
e:\atmel studio 6.0\extensions\atmel\avrgcc\3.4.0.65\avrtoolchain\bin\../lib/gcc/avr/4.6.2/../../../../avr/include/avr/crc16.h(36,2): #warning "This file has been moved to <util/crc16.h>." [-Wcpp]
S:\owslave\owslave.c(108,9): backslash and newline separated by space [enabled by default]
S:\owslave\owslave.c(134,1): multi-line comment [-Wcomment]
S:\owslave\owslave.c(140,54): backslash and newline separated by space [enabled by default]
S:\owslave\owslave.c(141,40): backslash and newline separated by space [enabled by default]
S:\owslave\owslave.c(279,5): backslash and newline separated by space [enabled by default]
S:\owslave\owslave.c(322,5): backslash and newline separated by space [enabled by default]
.././owslave.c: In function '__vector_2':
S:\owslave\owslave.c(1311,1): cast to pointer from integer of different size [-Wint-to-pointer-cast]
.././owslave.c: In function 'main':
S:\owslave\owslave.c(1359,39): cast to pointer from integer of different size [-Wint-to-pointer-cast]
Finished building: .././owslave.c
Building target: owslave.elf
Invoking: AVR/GNU Linker : (AVR_8_bit_GNU_Toolchain_3.4.0_663) 4.6.2
"E:\Atmel Studio 6.0\extensions\Atmel\AVRGCC\3.4.0.65\AVRToolchain\bin\avr-gcc.exe" -o owslave.elf  owslave.o   -Wl,-Map="owslave.map" -Wl,--start-group -Wl,-lm  -Wl,--end-group  -mmcu=attiny44a 
Finished building target: owslave.elf
"E:\Atmel Studio 6.0\extensions\Atmel\AVRGCC\3.4.0.65\AVRToolchain\bin\avr-objcopy.exe" -O ihex -R .eeprom -R .fuse -R .lock -R .signature  "owslave.elf" "owslave.hex"
"E:\Atmel Studio 6.0\extensions\Atmel\AVRGCC\3.4.0.65\AVRToolchain\bin\avr-objcopy.exe" -j .eeprom  --set-section-flags=.eeprom=alloc,load --change-section-lma .eeprom=0  --no-change-warnings -O ihex "owslave.elf" "owslave.eep" || exit 0
"E:\Atmel Studio 6.0\extensions\Atmel\AVRGCC\3.4.0.65\AVRToolchain\bin\avr-objdump.exe" -h -S "owslave.elf" > "owslave.lss"
"E:\Atmel Studio 6.0\extensions\Atmel\AVRGCC\3.4.0.65\AVRToolchain\bin\avr-size.exe" "owslave.elf"
   text    data     bss     dec     hex filename
   2650       8      24    2682     a7a owslave.elf
Done executing task "RunCompilerTask".
Using "RunOutputFileVerifyTask" task from assembly "E:\Atmel Studio 6.0\Vs\Compiler.Task.dll".
Task "RunOutputFileVerifyTask"
Program Memory Usage : 2658 bytes   64,9 % Full
Data Memory Usage : 32 bytes   12,5 % Full
Done executing task "RunOutputFileVerifyTask".
Done building target "CoreBuild" in project "owslave.cproj".
Target "PostBuildEvent" skipped, due to false condition; ('$(PostBuildEvent)' != '') was evaluated as ('' != '').
Target "Build" in file "E:\Atmel Studio 6.0\Vs\Avr.common.targets" from project "S:\owslave\owslave.cproj" (entry point):
Done building target "Build" in project "owslave.cproj".
Done building project "owslave.cproj".

Build succeeded.
========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ==========


Generell sehe ich hier nur "warnings" von Casting Problemen. Hatte ich wohl übersehen.

Da musst Du dann wohl Hand anlegen, um diese Warnung zu beseitigen.

Generell wird aber ein Hex-File angelegt, wenn man es mit diesem Befehl verwendet.

avr-gcc -std=c99 -Wall -Os -mmcu=attiny44a -o owslave.hex owslave.c



Viele Grüße

Gruss R.
IPU662  Ipfire & Fhem (Homematic + MAX) - Produktiv
Cubietruck (1Wire - USB) - Produktiv

Tobias

Ich versuch den Schaltplan gerade zu verstehen...
1. Wozu ist der Taster da?
2. Bei 4 Eingängen, welche 2 sind belegt für einen DS2423/DS2413?
3. Ist für den DS2406 auch die Speicherbefehle implementiert? OWSWITCH speichert Kum-Werte um 0Uhr direkt im Chip
4. Was genau kann man mit dem 100k Potis an den Eingängen regeln? Eine Eingangsschwelle? Ich sehe auch keine Kondensatoren zum Entprellen
5. Warum nur 4 Eingänge für einen DS2408?
6. Die LED´s blinken auf wenn Kontakt am jeweiligen Eingang anliegt? Im Ruhezustand sind sie aus?

Ich habe zwischenzeitlich Dougies Layout des DS2423 auf 1TE Hutschiene layoutet (incl Punkt6 und eeprom Speicherung), aber noch keine Zeit gehabt länger zu testen...

Grüsse
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

ritchie

Hallo Tobias,

hier meine Antworten ...

Zitat
1. Wozu ist der Taster da?
Ich verwende Ihn um den Status der Eingänge an den LED's anzeigen zu lassen.
Zitat
2. Bei 4 Eingängen, welche 2 sind belegt für einen DS2423/DS2413?
PIN A1 / A2 Siehe auch Source Code
Zitat
3. Ist für den DS2406 auch die Speicherbefehle implementiert? OWSWITCH speichert Kum-Werte um 0Uhr direkt im Chip
Derzeit nicht. Feel free to add
Zitat
4. Was genau kann man mit dem 100k Potis an den Eingängen regeln? Eine Eingangsschwelle? Ich sehe auch keine Kondensatoren zum Entprellen
Da ich hier mit der Abfrage von LED's arbeite und keine Schalter verwende, Sah ich keinen Grund hierfür.
Zitat
5. Warum nur 4 Eingänge für einen DS2408?
Da ich Status der Eingänge direkt am zu überwachenden Geräte auch ohne FHEM sehen will und hier verwende ich
die Ausgänge für die LED's.
Zitat
6. Die LED´s blinken auf wenn Kontakt am jeweiligen Eingang anliegt? Im Ruhezustand sind sie aus?
Nein, Sie zeigen nur den Status der Eingänge an, wenn man den Taster drückt. (Um Strom zu sparen.)
Man kann natürlich auch einen Jumper setzen und sieht den Status immer direkt an den LED's.

Wie gesagt, dies ist eine Schaltung, welche ich für mich erstellt habe und daher sollte diese Schaltung auch meine
Bedürfnisse erfüllen. Dies kann ja jeder ändern wie er will, da ich ja beides bereitgestellt habe.

Viele Grüße

R.
IPU662  Ipfire & Fhem (Homematic + MAX) - Produktiv
Cubietruck (1Wire - USB) - Produktiv

Fux

Hallo ritchie,

mit dem AVR als 1wire Slave ergeben sich ganz neue Möglichkeiten:
als sehr interessant finde ich es, etwas nicht nur über 1wire sondern parallel dazu auch manuell über Taster zu schalten.

Als Einsatzzweck denke ich hierbei z.B. an ein Licht im Aussenbereich/Garten:
- ein-/ausschalten zentral über 1wire
- aktuellen Status (ein/aus) über 1wire abfragen
- manuell ein-/ausschalten vor Ort über einen Taster

Perfekt wäre noch die Ergänzung für automatisches ein-/ausschalten durch einen angeschlossen Bewegungsmelder an einem AVR-Eingang.

Das ist natürlich nur ein Einsatzgebiet und es gibt hier sicher etliche andere. Interessant vor allem auch bei einem 1wire-Ausfall, dass man immer noch vor Ort manuell schalten kann.


Ich habe mir den Quellcode schon mal angeschaut und habe hierzu ein paar Fragen:
- statt 4 Eingänge -> 2 Ausgänge und 2 Taster-Eingänge. Ist es ausreichend für die Ausgänge nur die DDRx Maske neu zu setzen?
- wo sollten die Taster implementiert werden, in der Hauptschleife oder in der 1wire-Schleife?
- der durch den Taster neue gesetzte Ausgang soll gleich ins Eeprom geschreiben werden, wie könnte man das lösen?


Viele Grüße
Fux

ritchie

Hi,
ich bin gerade "offline", schaue mir aber Deine Sachen nach meiner Rückkehr an.
Generell kannst Du alle Ein-/Ausgänge nach Deinen Wünschen anpassen, nur die 1wire
Schnittstelle solltest Du so lassen. In der Interrupt Routine so wenig wie möglich machen,
da sonst das Timing des 1wire gefährtet ist.

Am besten ein Flag in der Interruptroutine setzen und in der Mainloop dann abarbeiten.

Gruss aus den Staaten
R.
IPU662  Ipfire & Fhem (Homematic + MAX) - Produktiv
Cubietruck (1Wire - USB) - Produktiv

ritchie

Hallo Fux,

Zitat
- statt 4 Eingänge -> 2 Ausgänge und 2 Taster-Eingänge. Ist es ausreichend für die Ausgänge nur die DDRx Maske neu zu setzen?
Hier muss Du für die Software nur die Zeile "DDRA &~" entsprechend anpassen. Natürlich muss die Hardware auch entsprechend sein.


#define INIT_COUNTER_PINS /* Counter Interrupt */ \
GIMSK|=  (1<<PCIE0);\
PCMSK0=  (1<<PCINT3)|(1<<PCINT4)|(1<<PCINT0); \
DDRA &=~ (1<<PINA1) | (1<<PINA2); \
istat=PINB;
#endif


Zitat
- wo sollten die Taster implementiert werden, in der Hauptschleife oder in der 1wire-Schleife?

Wie bereits gesagt, sollten diese Funktionen nicht in der 1wire Routine sein.

Je nach verwendete CPU kannst Du natürlich kleine Funktionen in der Interrupt Routine (Falls dieser PIN Change on Interrupt unterstützt, geht nicht bei jedem PIN) programmieren. Nur ist für diesen Zeitraum, eine evtl. 1wire Komunikation nicht möglich. Daher hier nur ein Flag setzen und die Bearbeitung in der Hauptloop durchführen.

Eine reine Abfrage des Schalters, sollte auch in der Hauptroutine möglich sein, je nach Impulslänge. (sehr kurze Signale -> Interruptroutine).
Das menschliche Betätigen eines Tasters -> Mainloop.
Drehzahlmessung -> Interrupt

Zitat
- der durch den Taster neue gesetzte Ausgang soll gleich ins Eeprom geschreiben werden, wie könnte man das lösen?

Diese Quellcodezeile sind für das Schreiben in das EEProm zuständig.


#include <avr/eeprom.h>
...

// für eine Schreiboperation...
eeprom_write_byte((uint8_t *)0,0x55);\
eeprom_write_byte((uint8_t *)1,latch_piostate);\

// für Leseoperationen
state=eeprom_read_byte((uint8_t *)0); // read the magic code, if the eeprom is valid
if( state == 0x55)
{
    Counter[0]=eeprom_read_dword((uint32_t *)1); // EEprom Values are valid
    Counter[1]=eeprom_read_dword((uint32_t *)5);
}


Aber vorsichtig, diese Funktionen laufen "Atomic", das heisst, sie werden nicht durch einen Interrupt unterbrochen.
Daher werden die entsprechenden Funktionen nur beim Ein-/Ausschalten des Controllers aufgerufen.

Der von mir erstellte Code ist für einen Atmel At Tiny 44A vorgesehen. Durch eine entsprechende Erweiterungen der entsprechenden
Macrodefinitionen kann jeder andere Controller verwendet werden. Also auch ein Atmega 32/64/...


Zitat
Als Einsatzzweck denke ich hierbei z.B. an ein Licht im Aussenbereich/Garten:
- ein-/ausschalten zentral über 1wire
- aktuellen Status (ein/aus) über 1wire abfragen
Dies kann man auch mit den Standardbausteinen des 1wire machen, dafür ist der Software-Slave nicht notwendig.

Seine Stärken sind hier evtl. Sicherheitsfunktionen zusätzlich einbinden. Motoren nur einschalten, wenn evtl. Rückmelden vorhanden sind oder
noch nicht. Diese eigenständig ausschalten (kein Wasser mehr da, Pumpe ausschalten, da Trockenlauf die Pumpe beschädigt...)
Da geht natürlich auch mit  zusätzlichen Standard 1wire Bausteinen, kostet aber mehr und die Verwaltung macht hierbei FHEM. Nicht wirklich sicher, da bei Ausfall des Systems die Pumpe immer noch läuft.

Und natürlich der "Manuelle Betrieb" ohne FHEM, meine Anwendung.

Viele Grüße

R.
IPU662  Ipfire & Fhem (Homematic + MAX) - Produktiv
Cubietruck (1Wire - USB) - Produktiv

Fux

Hallo ritchie,

Danke für Deine ausführliche Antwort! Hoffe ich habe demnächst mal Zeit um das Ganze anzuschauen.

Grüße
Fux

jaripetteri

Hi and sorry about English,

I manage to compile your code for Attiny84 but could you tell the fuse bits you are using? My understanding is that those should be same for tiny84 as on tiny44A.

Also would it be possible to add more counters than two?

jaripetteri

Prof. Dr. Peter Henning

In principle you may add as many counters as you like - but then would create a non-standard 1-Wire device that has no software support (so far).

Regards

pah

jaripetteri

That is true. Maybe make device look like two devices on same package for 1wire bus. Two address and two dual counter. Adding another MCU is sure more simple solution.

But anyway now I'm more concern about making just one to work. I have pretty simple hardware, basically just MCU connected to LinkUSB,  powered by USB. I'm able to communicate other devices (DS1820) on bus with OWFS on RPi but when I power MCU it blocks all communication on bus. I have compared my hardware with Ritchie's and it should be fine. Fuse settings I'm using are High = 0xDD, Low = 0XE2 & Extended = 0xFF and those i'm not sure are those right. Also tried to make DS2408 device but same result. I'm missing something here but can't figure it out what it is.

Is there tools to sniff 1wire bus somehow?

ritchie

Hi Jaripetteri,

I used a logic analyser to check, if the transmission work.
But my Analyser is a only for hobbyist and not that good.

But it shows the transmission very well for about 20 ms.
Google will tell you alot of choices, depending on the prize.

I just used the standard fuses for the chip. I can check this at the weekend,
if you still need the setting. How about your skills in atmega programming ?

The software is able to create almost every combination of information
for the 1-wire bus. But keep in mind, that such chips will run only  in your envirement.
If you have special requests, you can change this, but it is not supported by owserver or
OWSWITCH,.... . You have to modify such code as well, by your self.
I would not recomment to do this. Use better more that one of such chips to fullfil your requirement.

Hope this helps

R.
IPU662  Ipfire & Fhem (Homematic + MAX) - Produktiv
Cubietruck (1Wire - USB) - Produktiv

Tobias

Bekommt man das eigentlich leicht in die arduino IDE mit einem 328p übertragen?

Gesendet von meinem ALCATEL ONE TOUCH 997D mit Tapatalk

Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

ritchie

Hi Tobias,

ich vermute mal, das man sich schon etwas mit dem chip beschäftigen muss. Der größte Aufwand
ist immer bei der Anpassung der entsprechenden Register Definitionen (Header MACROS).

Leicht würde ich also nicht sagen, aber machbar.

Gruss R.
IPU662  Ipfire & Fhem (Homematic + MAX) - Produktiv
Cubietruck (1Wire - USB) - Produktiv