..w pewnym urządzeniu użyłem ATTINY15L. Oprócz wgrania wsadu muszę odczytać z procka i zapisać w pamięci EEPROM w komórce 3F(HEX) bajt kalibracji. Odczytałem go PonyProg'iem i znam jego wartość 8D(HEX) ale nie wiem która komórka jest tą o nr 3F. Pomieszało mi się już wszystko - jak mam ją znaleźć? Wiem, że to banalne zapewne ale proszę o pilną pomoc.
Która to komórka??
Komórka 3F w EEPROM i nieszczęsny bajt kalibracji
-
ZbeeGin
Adres jaki wybrałeś jest to dokładnie ta komórka o której piszesz. Tu nie ma zawiłości jak w przypadku pamięci FLASH (kodu).
Odczytany bajt kalibracji możesz sobie umieścić do woli czy w pamięci FLASH czy EEPROM. Ważne byś wiedział gdzie go zapisałeś i odczytasz go na początku programu, i wpiszesz w OSCCAL. Zatem nie jest regułą, że bajt kalibracji jest zawsze w tym samym miejscu a procesor go sobie sam czyta...
Odczytany bajt kalibracji możesz sobie umieścić do woli czy w pamięci FLASH czy EEPROM. Ważne byś wiedział gdzie go zapisałeś i odczytasz go na początku programu, i wpiszesz w OSCCAL. Zatem nie jest regułą, że bajt kalibracji jest zawsze w tym samym miejscu a procesor go sobie sam czyta...
-
ZbeeGin
Odczytanie bajtu spod odpowiedniego adresu może się odbyć w taki sposób:
gdzie:
Kod: Zaznacz cały
Dim Cal As Eram Byte At $3f
Osccal = Cal- Dim Cal - definicja nazwy zmiennej "Cal"
As ERAM Byte - że jest to zmienna bajtowa umieszczona w EEPROM
At $3F - że jest ona umieszczona pod koknkretnym adresem.
Ostatnio zmieniony 01 sty 1970, 1:00 przez ZbeeGin, łącznie zmieniany 1 raz.
-
ZbeeGin
Tak to wygląda w kodzie maszynowym (adresy mogą być inne):
Wywołanie:
Sam proces odczytu zawartości EEPROM i przepisanie do IRAM jest już nieco zawiły:
Wywołanie:
Kod: Zaznacz cały
; OSCCAL = Cal
+00000015: E3EF LDI R30,0x3F adres w EEPROM
+00000016: E0F0 LDI R31,0x00
+00000017: E5A1 LDI R26,0x51 adres rejestru w pamięci
+00000018: E0B0 LDI R27,0x00
+00000019: D022 RCALL PC+0x0023 skok do proc. odczytaniaKod: Zaznacz cały
+00000026: 99E1 SBIC 0x1C,1 EEPROM gotów?
+00000027: CFFE RJMP PC-0x0001 nie, czekaj dalej
+00000028: BBEE OUT 0x1E,R30 ustal adres odczytu
+00000029: 9631 ADIW R30,0x01 i zwiększ go automatycznie (dla odczytów wielobajtowych)
+0000002A: 9508 RET wracamy
; --------------------------------------------------------------------------
; Tu wskoczy: +00000019: RCALL PC+0x0023 z bloku wywołania
; --------------------------------------------------------------------------
+0000003C: E091 LDI R25,0x01 znacznik że tylko bajt
+0000003D: C001 RJMP PC+0x0002 przeskocz dalej
+0000003E: E092 LDI R25,0x02 znacznik że słowo (tu nie używany)
+0000003F: DFE6 RCALL PC-0x0019 Skoczy pod adres +00000026
+00000040: 9AE0 SBI 0x1C,0 adres ustalony - odczytaj do rejestru bufora EEDR
+00000041: B38D IN R24,0x1D i przepisz go do rejestru R24
+00000042: 938D ST X+,R24 zapisz pod adres (tutaj I/O - rej. OSCCAL)
+00000043: 959A DEC R25 zmniejsz licznik bajtów
+00000044: F7D1 BRNE PC-0x05 jeśli nie zero to następny bajt
+00000045: 9508 RET i wracamy finalnie