Части кода для MSP430, которые позволяют этому индикатору работать.
Data Logger screen Al-Carbon battery.
  Noritake Itron VFD Vacuum Fluorescent Display, LCD Compatible Design (HD44780), parallel interface, 20x2.

Немного повозившись с кодом, получаем следующее, которое имеет некоторые ограничения. Задержку меньше 50 микроСекунд получить не удается. Почему это происходит я еще не разобрался, но не так сильно это мне нужно.
Микроконтроллер работает на частоте 1 МГц. 1000 в переменной i соответствует 1 миллиСекунде задержки. Контроллер, в это время выключен.
Код следующий:

#include <msp430.h>
unsigned int i=65535;
void DELAY_us (unsigned int);

int main(void)
{
WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
DCOCTL = 0;                                                   // Select lowest DCOx and MODx settings
BCSCTL1 = CALBC1_1MHZ;                          // Set range
DCOCTL = CALDCO_1MHZ;                           // Set DCO step + modulation */
P1DIR |= 0x01;                                               // P1.0 output, for v. test
  while (1)
  {
      P1OUT ^= 0x01;

      DELAY_us (i);
  }
}

#pragma vector=TIMERA0_VECTOR                // Timer A0 interrupt service routine
__interrupt void Timer_A (void)  {
    __bic_SR_register_on_exit(LPM0_bits);        // Clear LPM0 bits (CPU run)
}

void DELAY_us (unsigned int k) {
    CCTL0 = CCIE;                                              // CCR0 interrupt enabled
    TACTL = TASSEL_2 + MC_1;                        // SMCLK, upmode
    CCR0 = k;                                                       // Load counter, 1 uS per tick if k> 50
    __bis_SR_register(LPM0_bits + GIE);           // Enter LPM0 w/ interrupt
}

То, что действительно работает, выделено зеленым.

Суть простая. Функция запускает таймер, на время, которое определено в переменной i а потом k. Процессор отключается и ждет пока таймер закончит счет. Когда это произошло, срабатывает прерывание (включается процессор) и программа продолжает рабтать дальше.

Недостаток в том, что больше 65 мСек задержку получить нельзя, тк максимальное 16-ти битное число, которое может быть загружено в таймер = 65535. Поэтому, для более длительной задержки, эту процедуру (DELAY_us (i);) необходимо вызывать несклько раз.

P.S. Сделано как "закладка", для "себя, любимого" : )



13.08.2023  SKootS

_

Make a free website with Yola