Elo mordziaki, jak ludzie potrzebują pomocy z #elektryka to zgłaszają się do #konstruktorelektrykamator

No to teraz sprawa się odwraca. Ja potrzebuję pomocy, pośrednio związanej z #elektronika. A dokładniej to #programowanie #arduino

Do rzeczy. Mam pestkę DS1971+F5 (PDF), komunikacja po 1Wire. Wewnątrz siedzi między innymi pamięć DS2430A (PDF).

Udało mi się odczytać adres tej pestki oraz zawartość pamięci.

Data: B9 39 0 1 1 70 3 9B 10 77 0 0 0 0 39 7

R=2 79 2 79 0 C1 0 0 0 0 3E F4 80 FF [... dużo znaków ...] F 10 1 41 56 52 20 49


Użyłem do tego kodu znalezionego gdzieś w czeluściach internetu.

#include <OneWire.h>

OneWire ds(2);                   // OneWire bus on digital pin 2

void setup() {

 Serial.begin (115200);

}


void loop() {

 byte i;                        // This is for the for loops

 boolean present;               // device present var

 byte data[16];                 // container for the data from device

 byte addr[64];                  // adress


 present = ds.reset();          // OneWire bus reset, always needed to start operation on the bus, returns a 1/TRUE if there's a device present.

 ds.skip();                     // Skip ROM search


 if (present != 0){          // We only try to read the data if there's a device present

   //Serial.println("DS1971 device present");

   ds.write(0xF0,1);       // Read data command, leave ghost power on

   ds.write(0x00,1);       // LSB starting address, leave ghost power on

   ds.write(0x00,1);       // MSB starting address, leave ghost power on


   Serial.print("Data: ");  // For the printout of the data

   for ( i = 0; i < 16; i++) {   // Now it's time to read the EEPROM data itself, each page is 32 bytes so we need 32 read commands

     data[i] = ds.read();        // we store each read byte to a different position in the data array

     Serial.print(data[i], HEX);      // printout in ASCII

     Serial.print(" ");          // blank space

   }

   Serial.println();

   Serial.print("R=");

    for( i = 0; i < 64; i++) {

   Serial.print(addr[i], HEX);

   Serial.print(" ");

 }

   Serial.println();

   delay(1000);                   // Delay so we don't saturate the serial output

 }

 else {                          // Nothing is connected in the bus

   //Serial.println("Non connesso");

   delay(1000);

 }

}

I teraz jest sprawa do ludzi bardziej obcykanych w programowaniu. Co zrobić by zmienić zawartość poszczególnych komórek pamięci?

Niby biblioteka OneWire.h ma komendę ds.write_bytes ale jak bym nie kombinował to albo błąd kompilacji albo nic się nie dzieje.

Ktoś ma pomysł jak to zrobić?

Komentarze (8)

wombatDaiquiri

@myoniwy nie mam pojęcia, grzmot dla zasięgu, ale;


> Użyłem do tego kodu znalezionego gdzieś w czeluściach internetu.


musiałeś wpisać w google jakąś frazę. Próbowałeś wpisać tę frazę w ChatGPT z prośbą o napisanie kodu takiego jak potrzebujesz? Nie spodziewam się za bardzo że się uda, ale też nie mam lepszej propozycji.

myoniwy

@wombatDaiquiri wcześniej nie używałem gpt. A teraz o dziwo napisał dosyć szybko kod który nawet działa, ale z małym zastrzeżeniem.

NooT

@myoniwy szybkie googlowanie doprowadziło mnie do tego przykładu https://www.pjrc.com/teensy/td_libs_OneWire.html. Widzę, że jest w nim zawarte również zapisywanie poprzez ds.write().

myoniwy

@NooT też widziałem ta stronę. Ale jako totalny grzyb jeśli chodzi o programowanie niewiele mi to mówi.

cec

Wszystko masz napisane w https://www.analog.com/media/en/technical-documentation/data-sheets/DS2430A.pdf

Najpierw piszesz do scratchpada 0x0F, podajesz adres zapisu, a potem lecisz z kolejnymi bajtami danych. Układ sam sobie inkrementuje wskaźnik swojej pamięci. Jak zapiszesz za dużo danych to się zapętli i będzie pisał od początku. Potem master, czyli Ty wysyła reset (czyli pewnie sygnał końca transmisji). A potem przepisujesz dane ze scratchpada do pamięci - copy scratchpad 0x55.

myoniwy

@cec Jak już ma się przykład który można skonfrontować z danymi z pdfa to znacznie łatwiej idzie przyjmowanie tel wiedzy. A czytałem tego pdfa ze 3 razy, o nie kumałem co to za adres 0Fh lub AAh. Teraz już jest łatwiej.

myoniwy

Tylko wciąż mam problem. Bo dane niby się zapisują. Ale w czasie odczytu zmieniaja się tylko dwa przedostatnie bajty. Może to jest suma kontrolna?


Mimo że wgram np 0x34, 0x65, 0x65, 0x60, 0x30 to nigdzie później w ciągu odczytanych danych nie ma takich wartości.

Zaloguj się aby komentować