Komórka 3F w EEPROM i nieszczęsny bajt kalibracji

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
seg
Użytkownik
Posty: 223
Rejestracja: 17 sie 2005, 1:08
Lokalizacja: PÓŁNOC - POŁUDNIE

Komórka 3F w EEPROM i nieszczęsny bajt kalibracji

Post autor: seg » 31 sie 2007, 17:23

..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??
Załączniki
cal.JPG

ZbeeGin

Post autor: ZbeeGin » 31 sie 2007, 19:37

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...

seg
Użytkownik
Posty: 223
Rejestracja: 17 sie 2005, 1:08
Lokalizacja: PÓŁNOC - POŁUDNIE

Post autor: seg » 31 sie 2007, 20:05

..a możesz napisać jak konkretnie wyglądałoby to w kodzie? Wiem, że masz wiedzę na temat bascom więc proszę o ile to możliwe o pomoc w moim poście nt kodu bascom i zależności czasowych - to wykrywacz metali, który chciałbym poddać tunningowi - przepraszam za offtopic. Dziękuję Ci.

ZbeeGin

Post autor: ZbeeGin » 31 sie 2007, 20:23

Odczytanie bajtu spod odpowiedniego adresu może się odbyć w taki sposób:

Kod: Zaznacz cały

Dim Cal As Eram Byte At $3f

Osccal = Cal
gdzie:
  • 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.
Potem następuje tylko przepisanie wartości zmiennej do rejestru odpowiedzialnego za kalibrację.
Ostatnio zmieniony 01 sty 1970, 1:00 przez ZbeeGin, łącznie zmieniany 1 raz.

seg
Użytkownik
Posty: 223
Rejestracja: 17 sie 2005, 1:08
Lokalizacja: PÓŁNOC - POŁUDNIE

Post autor: seg » 31 sie 2007, 20:37

..rozumiem, dziękuję. To tak na przyszłość, ponieważ udostępniony mam tylko hex, więc autor musiał w nim coś takiego zawrzeć, ponieważ informuje o konieczności zapisania bajtu kalibracji pod wspomniany adres w EEPROM.

ZbeeGin

Post autor: ZbeeGin » 31 sie 2007, 21:09

Tak to wygląda w kodzie maszynowym (adresy mogą być inne):

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. odczytania
Sam proces odczytu zawartości EEPROM i przepisanie do IRAM jest już nieco zawiły:

Kod: 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

ODPOWIEDZ