Wpis użytkownika myoniwy w Programowanie
myoniwyFanatyk
23piorunówElo 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)
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.
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.
piorun dla zasiegu
@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().
OneWire Arduino Library, connecting 1-wire devices (DS18S20, etc) to TeensyPjrc@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.