logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.
  • #1 6098784
    sinuh3
    Poziom 17  
    Witajcie.

    Mam takie pytanie, bo nie do końca rozumiem czemu coś działa chociaż w kodzie jest zaznaczone jako TODO.

    Atmega406 ma pewien 32bitowy rejestr przetwornika A/C - CADAC, na który składają się rejestry CADAC0,1,2,3.

    w pliku iom406.h WinAvr20081205 znajduje się taki fragment:

    
    /* CC-ADC Accumulate Current */
    /* TODO: Add _SFR_MEM32 */
    /*#define CADAC   _SFR_MEM32(0xE0) */
    
    #define CADAC0  _SFR_MEM8(0xE0)
    #define CADAC1  _SFR_MEM8(0xE1)
    #define CADAC2  _SFR_MEM8(0xE2)
    #define CADAC3  _SFR_MEM8(0xE3)


    Jak widać, "do zrobienia" jest dodanie SFR_MEM32, by móc wykorzystać ten rejestr jako jedną 32 bitową zmienną.


    ale za to w sfr_defs.h jest to już zdefiniowane:
    #define _SFR_MEM32(mem_addr) _MMIO_DWORD(mem_addr)
    
    #define _MMIO_DWORD(mem_addr)   (*(volatile uint32_t *)(mem_addr))
    
    


    no i rzeczywiście po odremowaniu #define CADAC _SFR_MEM32(0xE0) - kompilator nic nie krzyczy.

    Czy dobrze się domyślam, że autorzy winavr zapomnieli odremować tego wiersza?

    Pytanie drugie: Rejestr CADAC powinien być odczytywany z pewnymi rygorami czasowymi. Jeżeli trwa odczyt rejestru, a wystąpi przerwanie aktualizujące wartość CADAC - to aktualizacja nie następuje. Zczytana kolejna dana jest błędna.

    Czy to być może powodem zaremowania SFR32? Jakaś nie właściwa obługa tych rygorów czasowych powodująca błędy w odczycie?
REKLAMA