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 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.
@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.
@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().
@mpower też widziałem ta stronę. Ale jako totalny grzyb jeśli chodzi o programowanie niewiele mi to mówi.
piorun dla zasiegu
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.
@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.
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ć