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ć?
myoniwy userbar
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.

mpower

@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

@mpower 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ć