Перейти к содержанию
    

Xmega RTC.CNT

Добрый день)

 

Возникла проблема с принудительной установкой RTC.CNT

При выполнении данного кода:

RTC.PER = 34200;
CLK.RTCCTRL = CLK_RTCEN_bm + CLK_RTCSRC_RCOSC_gc;
RTC.INTCTRL = RTC_OVFINTLVL0_bm;
RTC.CTRL = RTC_PRESCALER_gm;                    // 1024 = 1s.
            
while( !(RTC_STATUS & RTC_SYNCBUSY_bm) );
RTC.CNTL = 0x11;    
RTC.CNTH = 0x22;
            
TCC0.PER = 10000;                                // Delay ~1s.
TCC0.CTRLA = TC_CLKSEL_DIV1024_gc;
while(TCC0.CTRLA)
{
    asm("NOP");
}

sendCharE0(RTC.CNTH);                            // UART
sendCharE0(RTC.CNTL);

Если запрашиваю значение RTC.CNT через некоторый промежуток времени, то вижу что RTC считает все с 0x0000(0x0001, 0x0002 и.т.д.)

 

 

Если приведенный выше код, выполняю два раза:

// 1
RTC.PER = 34200;
CLK.RTCCTRL = CLK_RTCEN_bm + CLK_RTCSRC_RCOSC_gc;
RTC.INTCTRL = RTC_OVFINTLVL0_bm;
RTC.CTRL = RTC_PRESCALER_gm;                    // 1024 = 1s.
            
while( !(RTC_STATUS & RTC_SYNCBUSY_bm) );
RTC.CNTL = 0x11;    
RTC.CNTH = 0x22;
            
TCC0.PER = 10000;                                // Delay ~1s.
TCC0.CTRLA = TC_CLKSEL_DIV1024_gc;
while(TCC0.CTRLA)
{
    asm("NOP");
}

// 2
RTC.PER = 34200;
CLK.RTCCTRL = CLK_RTCEN_bm + CLK_RTCSRC_RCOSC_gc;
RTC.INTCTRL = RTC_OVFINTLVL0_bm;
RTC.CTRL = RTC_PRESCALER_gm;                    // 1024 = 1s.
            
while( !(RTC_STATUS & RTC_SYNCBUSY_bm) );
RTC.CNTL = 0x11;    
RTC.CNTH = 0x22;
            
TCC0.PER = 10000;                                // Delay ~1s.
TCC0.CTRLA = TC_CLKSEL_DIV1024_gc;
while(TCC0.CTRLA)
{
    asm("NOP");
}

sendCharE0(RTC.CNTH);                            // UART
sendCharE0(RTC.CNTL);

То уже все выставляется как я и планировал 0x2211, 0x2212 и.т.д.

Почему так? %)

Изменено пользователем Nosaer

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

sendCharE0(RTC.CNTH); // UART

sendCharE0(RTC.CNTL);

 

Почему так? %)

Чтение 16-битных значений является атомарной операцией и производиться в последовательности:

1. Запретить прерывания (если не запрещены)

2. Чтение младшего байта RTC.CNTL, при котором значение реального старшего байта счетчика заносится во временный TEMP-регистр, общий для таких операций.

3. Чтение значения из TEMP-регистр, а не из счетчика RTC старшего байта.

4. Разрешение прерываний, если они были запрещены на первом шаге.

 

как-то так:
uchar high;
uchar low;
_disable();
low=RTC.CNTL;
high=RTC.CNTH;
_enable();
sendCharE0(high);                            // UART
sendCharE0(low);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чтение 16-битных значений является атомарной операцией

Дык, тут проблема не в атомарности, а в лишнем "!" в строке :

 

while( !(RTC_STATUS & RTC_SYNCBUSY_bm) );

 

на AVR Freaks уже ответили

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дык, тут проблема не в атомарности, а в лишнем "!" в строке :

 

Замылился "!", не заметил.

Значит имеются две проблемы.

Причем, вторая не столько в атомарности, сколько в порядке чтения регистров.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...