Hallo Liste,
an der Software von Tobias Müller
http://www.tobynet.de/index.php/1-wire-device-mit-avr
hatte mich gestört, dass sie zwar den Zähler DS2423 selbst, nicht aber den Speicher emuliert. Das führte nämlich dazu, dass die "Mitternachtswerte" immer separat abgespeichert werden mussten.
Ich habe darum dieses Programm erweitert, und den Speicher mit eingebaut. Ist noch nicht die allerletzte Version, weil:
a.) bisher nur die beiden Memory Pages 14 und 15 (= zu den beiden Zählern gehörig) realisiert sind
b.) bisher nur eine Mogelversion des internen Statusbytes verwendet wird
c.) bei einem "Read Scratchpad" Kommando noch kein CRC Code berechnet wird.
Dabei habe ich den Code auch noch etwas aufgeräumt und die "denglischen" in englische Kommentare umgewandelt - mit dem erfreulichen Nebeneffekt, dass ich den Code jetzt ganz gut verstehe. Hat zur Folge, dass man jetzt durchaus noch Erweiterungen in das Ding einbauen könnte - so z.B. ein echtes "Setzen" des Zählers, oder einen Modus mit hochzählendem und herunterzählendem Eingang.
Nachteil ist natürlich, dass der Code insgesamt dennoch angewachsen ist. Zur Sicherheit habe ich das auf einen ATTiny45 gebrannt. Auf einem ATTiny2313 sollte es ebenfalls gehen, das habe ich aber nicht getestet.
Nachstehend stelle ich Quellcode und ein fertiges Hex-file zur Verfügung für diejenigen, die sich das probeweise selber flashen wollen.
LG
pah
Ups: Im letzten Edit natürlich noch einen Fehler eingebaut. Die nachfolgenden Anhänge arbeiten korrekt => Versionsnummer ist 2.01
Danke für die Veröffentlichung dieser Version, Ich habe den Code von T.Müller nun schon eine Weile auf einem ATtiny2313 im Einsatz.
Wenn man sich die externen Pull-Ups der Zählereingänge PB3 & 4 sparen und lieber die interen benutzen möchte sind hier noch zwei Zeilen für den main Abschnitt :
PORTB |= (1<<PINB3); /* internen Pull-Up an PB3 aktivieren */ \
PORTB |= (1<<PINB4); /* internen Pull-Up an PB4 aktivieren */ \
Hi pah,
welche Version hast du als Grundlage genomen? Ich verwende durchgängig die eeprom-Version.
Falls du also due "normale" als Grundlage genutzt hast, könntest du bitte deinen Patch af die Eeprom-Version anpassen?
http://forum.fhem.de/index.php/topic,10962.msg69085.html#msg69085
Das ist sicher kein "Patch", sondern 30% komplett neuer Code.
"Könntest Du bitte..." - sicher gerne, das kommt aber ans Ende meiner Prioritäten.
LG
pah
Hallo Pah,
derzeit bin ich auch an diesem Quellcode am Arbeiten. Ich würde gerne den Teil für den DS2423 in meine Routinen übernehmen. Spricht was dagegen ? Ich will einen konfiguierbaren Code erstellen für verschiedene Chips.
Willst Du den Speicher memory14[] & memory15[] noch im EEprom sicheren ? Hatte ich auch mal für den Counter angedacht, leider dauert das Schreiben ins EEPROM sehr lange und arbeitet nur ohne Interrups.
Ich bin derzeit auch an der CRC16 für den DS2408 dran, leider wird diese noch nicht korrekt berechnet (WebInterface meldet CRC Fehler), ich konnte jedoch im Netz kein entsprechendes Testprogramm finden, um meine Berechnung zu prüfen. Das Antwortprotokoll stimmt jedenfalls lauf Logicanalyser.
Gruss R.
Zitat von: Prof. Dr. Peter Henning am 10 März 2014, 11:45:09
"Könntest Du bitte..." - sicher gerne, das kommt aber ans Ende meiner Prioritäten.
Leider ist die eeprom Version aber Grundvoraussetzung für die meisten. Nichts ist schlimmer als die counterwerte zu verlieren, unabhängig von fhem
..
Soll heißen, das deine Version für viele nicht nutzbar ist :(
Gesendet von meinem ALCATEL ONE TOUCH 997D mit Tapatalk
Mag sein - aber ich habe eine Allergie dagegen, nach Anweisung zu arbeiten. Nenn es Berufskrankheit...
LG
pah
Zudem ist die ganze Sache auch nicht so einfach,
den ins EEprom schreiben dauert schon ein paar ms. In dieser Zeit wäre keine Kommunikation via 1wire möglich, da hierfür die Interrupts gesperrt werden müssten. Ansonsten wäre das wohl schon von Thomas (dem Ursprungsauthor) eingebaut worden.
Gruss R.
Darüber hinaus macht es keinen Sinn, nur den Zähler abzuspeichern - sondern die Memory-Bank muss ebenfalls in EEPROM geschrieben werden. Und das sind dann nicht nur 8 Byte, sondern 72 Byte.
Es macht mir gar nichts aus, wenn mein Code irgendwo übernommen wird - allerdings bitte ich um Beachtung der GPL, d.h. Namen der Mitautoren bitte immer übernehmen.
"Konfigurierbarer Code" ist gut. Das könnte blockweise zusammenstellbar sein - so etwa A/D-Wandler zusammen mit Zähler und Schalter auf ein und demselben Chip, eventuell müsste man dann einem Chip gleichzeitig verschiedene 1-Wire Adressen geben, um nicht jedesmal die Ansteuerung neu erfinden zu müssen.
LG
pah
Das mit dem GPL versteht sich von selber. Will ich den fertigen Code doch hier als Wiki einstellen.
Bei mir sieht die Konfiguration derzeit so aus:
//#define DS2423 1
//#define DS18BS20 1
#define DS2408 1
//#define DS2413 1
Entsprechend wird dann im Code der jeweilige CHIP eingesetzt, wenn es zu den Chip spezifischen Teilen kommt.
Hier z.b. die Adressvergabe:
// -------------------------------------------------------------------------------------
//set your own ID http://www.tm3d.de/index.php/tools/14-crc8-berechnung
#ifdef DS2423
const uint8_t owid[8]={0x1D, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x01, 0xAF};
#endif
#ifdef DS18BS20
const uint8_t owid[8]={0x28, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x01, 0x72};
#endif
#ifdef DS2413
const uint8_t owid[8]={0x3A, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF3};
#endif
#ifdef DS2408
const uint8_t owid[8]={0x29, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x01, 0x4F};
#endif
Das der CHIP derzeit auf verschiedene Adressen reagiert, habe ich derzeit noch nicht vorgesehen, wäre aber eine interessante Variante. Nur muss ich erstmal die einzelnen Chips am rennen habe. Wie gesagt. Derzeit hänge ich bei der CRC16 fest. In der Ruhe liegt die Kraft und die Lösung.
Gruss R.
http://www.lammertbies.nl/comm/info/crc-calculation.html
http://webnet77.com/cgi-bin/helpers/crc.pl
LG
pah
Danke für die Infos,
jedoch bekomme ich auf den verschiedenen Seiten unterschiedliche CRCs, was wohl auch in der Art der Eingabe liegt.
Daher habe ich das folgende Program jetzt mal installiert und hier im Chip die Checksumme wie folgt berechnen lassen.
CRC 16 Routine
uint16_t get_crc( uint8_t d, uint16_t crc )
{
uint8_t i;
for(i=0;i<8;i++)
{
if((crc ^ d) & 1)
{
crc=(crc>>1)^0xA001;
}
else
crc>>=1;
d>>=1;
}
return (crc);
}
Mit diesem kleinem Program innerhalb von Main :
scrc = 0; // Clear the check sum
scrc = get_crc(0xf0,scrc); // Init the check sum with Address & Target address
scrc += get_crc(0x88,scrc);
scrc += get_crc(0x00,scrc);
scrc += get_crc(0x00,scrc);
scrc += get_crc(0x00,scrc);
scrc += get_crc(0x00,scrc);
scrc += get_crc(0x00,scrc);
scrc += get_crc(0x00,scrc);
scrc += get_crc(0x00,scrc);
scrc += get_crc(0xff,scrc);
scrc += get_crc(0xff,scrc);
scrc = ~scrc;
Habe ich die CRC von 0xA000 bekommen. Diese habe ich dann mal hardcodiert in die Antwort für den CHIP eingetragen und bekomme trotz allem
einen CRC Fehler. Kann mir jemand die Bytefolge eine DS2408 mit dem OWhttp Oberfläche zukommen lassen.
Mit einem Logikanalyser kann ich auch genau sehen, das die Antwort entsprechend ist. Scheinbar wird aber das 0xFF nach der Checksume laut Datenblatt bereits nicht mehr abgefragt.
Wahrscheinlich sehe ich den Wald vor lauter Bäume nicht mehr.
Bytefolge laut LA
Zitat
0xF0 0x88 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xFF 0xFF 0x00 0xA0
0xF0 0x88 0x00 -> Anfrage Registerwerte des Chips mit der entsprechenden Target Adresse.
0x00 0x00 0x00 0x00 0x00 0x00 0x00 -> Antwort der Register 0x88 bis 0x8D hier mit dem Wert 0
0xFF 0xFF -> Registerwerte 0x8E & 0x8F, welche mit dem Wert 0xFF zurückgegeben werden soll laut Datenblatt
0x00 0xA0 -> Checksumme <LowByte> <Highbyte>
Edit:
habe mir heute die Bauteile bestellt, damit ich mir eine vernünftige Simulation aufbauen kann.
Gruss R.
Hi Zusammen,
das war ein dummer Fehler. Die CRC Berechnung war immer o.k.
Die Addition der CRC Summe erfolgt über den Parameter.
Und meine Funktionsaufruf hatte das noch ein "+=" verwendet, daher die falsche Checksumme.
scrc = 0; // Clear the check sum
scrc = _crc16_update(scrc,0xf0); // Init the check sum with Address & Target address
scrc = _crc16_update(scrc,0x88);
scrc = _crc16_update(scrc,0x00);
scrc = _crc16_update(scrc,0x00);
scrc = _crc16_update(scrc,0xFF);
scrc = _crc16_update(scrc,0x00);
scrc = _crc16_update(scrc,0x00);
scrc = _crc16_update(scrc,0x00);
scrc = _crc16_update(scrc,0x88);
scrc = _crc16_update(scrc,0xff);
scrc = _crc16_update(scrc,0xff);
scrc = ~scrc;
Zudem verwende ich jetzt die Lib "#include <avr/crc16.h> " und den Aufruf "_crc16_update".
Da diese Routine in "inline ASM" geschrieben ist, gibt das der Sache nochmals ein bischen mehr Speed.
Der Status wird jetzt jedenfalls korrekt dargestellt.
Auch werde ich mir die Sache mit dem EEProm auch ansehen, da ich gesehen habe, das der vorgeschlagene Code
ja nur bei einem Spannungsausfall in Aktion kommt. Hier müsste man nur sehen, wie lange die Spannung des Chip
durch den Gold Cap am Leben gehalten wird.
Gruss R.
Mit einem 100uF habe ich gute Erfahrung gemacht. Das reicht um beim Spannungsabfall die werte ins eeprom zu sichern. Ich verbaue deshalb zur Sicherheit durch gängig 220uF Elkos.
Gesendet von meinem ALCATEL ONE TOUCH 997D mit Tapatalk
Hallo Tobias,
ich habe jetzt auch meine Schaltung entsprechend angepasst, um diese Funktion später zu unterstützen.
Jedoch setze ich auf einen Gold Cap 1F / 5V. Der ist zwar was gross, aber der sollte das sicher packen.
Dies werde ich später dann aber auch vorher noch prüfen, ob die Daten sicher weg geschrieben werden konnten.
Zuerst muss aber der DS2408 komplett fertig sein.
Da ich aber eine andere Schaltung verfolge, wäre später nur die Software für Euch von Interesse. Auch stört mich derzeit
der Stromverbrauch meiner Schaltung. 5V/20mA. Das ist mir noch zuviel. Da ich aber selber 4 von "dougies" Platinen (1.7) im Einsatz habe,
bin ich natürlich auch an dieser Funktion in der Schaltung interessiert.
Gruss R.
Hallo,
ich weiß das Thema hier ist schon etwas älter.
Dennoch würde ich gerne aus aktuellem Anlass gerne eine Frage hierzu stellen.
Wie ist denn der Stromverbrauch mit einem ATTiny25 mit der aktuellen Software?
Wird der ATTiny in den Sleep Modus geschickt um über Interrupt aufgeweckt zu werden?
Ich wäre für Erleuchtung dankbar. :)
Viele Grüße und Dank im Voraus,
Florian
Hi,
ja, die Version, welche ich unter diesem Thread (http://forum.fhem.de/index.php/topic,22431.0.html) abgelegt hat unterstützt auch den Sleep-Mode, wenn der ATTiny keine Kommunikation fährt.
Jedoch geht er hierbei nicht "voll" schlafen.
Schau Dir einfach den Quellcode mal an. In der letzten Version vom 04.12.2015 werden auch zwei MemoryPage unterstützt.
Dort gibt es auch einen Link in die Wiki, welcher Dich evtl. erleuchten könnte, was zur Weihnachtszeit ja nicht ungewöhnlich sein soll.
Gruss R.