Índice:

Contador MSP430 segundos: 10 etapas
Contador MSP430 segundos: 10 etapas

Vídeo: Contador MSP430 segundos: 10 etapas

Vídeo: Contador MSP430 segundos: 10 etapas
Vídeo: 21.- MSP430 MSP430G2553 Como PROGRAMAR un CONTADOR con Interrupciones GPIO 2024, Novembro
Anonim
Contador MSP430 segundos
Contador MSP430 segundos

Receber! Making of Seconds Counter: Usando CCStudio 8 e MSP430F5529 para o projeto.

Linguagem C para codificar o microcontrolador. Aplicando modos de baixa potência, temporizadores e interrupções. A saída é exibida por meio de 7 segmentos.

Etapa 1: Insight

Discernimento
Discernimento

Vamos começar!

Inicialize o watchdog timer para o estado OFF usando a senha necessária para o watchdog timer (ajuda a manter a verificação de loops infinitos, mantendo o processador seguro).

#incluir

/ ** * main.c * /

int main (vazio)

{

WDTCTL = WDTPW | WDTHOLD; // parar o cronômetro de watchdog

return 0;

}

Etapa 2: inicialização da porta

{

P3DIR = 0xFF; // P3DIR = 0x00;

P6DIR = 0xFF;

P4DIR | = 0x00;

P4REN | = 0xFF;

P4OUT | = 0xFF;

}

P3DIR | = 0x00 nos diz que toda a PORT-3 é inicializada para receber entradas.

P3DIR | = 0xFF nos diz que toda a PORT-3 é inicializada para fornecer saídas.

P3DIR | = 0x01 apenas o pino P3.0 é inicializado para saída em PORT-3. Isso segue um mapeamento de porta hexadecimal.

P4REN | = 0xFF, indica que os pinos da PORT-4 têm seus resistores pull up / down habilitados.

Para selecioná-los entre Pull UP ou Pull DOWN, a instrução P $ OUT | = 0xFF é usada.

Se 0xFF for usado, eles configuram como resistores Pull UP e se 0x00 eles configuram como Pull DOWN.

Etapa 3: Ultra Low Power

MSP430F5529 nos permite reduzir a perda de energia do processador. Isso é útil em aplicativos independentes.

Isso exige a declaração de todos os pinos ou portas para a saída.

{

P7DIR | = 0xFF;

P6DIR | = 0xFF;

P5DIR | = 0xFF;

P4DIR | = 0xFF;

P3DIR | = 0xFF;

P2DIR | = 0xFF;

P1DIR | = 0xFF;

}

Etapa 4: TEMPORIZADOR

Uso de temporizador para geração de atraso de um segundo. Este utiliza o SMCLK de 1MHz, também o temporizador roda no modo Low power (na próxima etapa, após sua contagem é interrompido a partir do LPM). Este processo economiza energia e carga no processador

TA0CCTL0 = CCIE;

TA0CCR0 = 999;

TA0CTL = TASSEL_2 + MC_1;

O valor é 999, pois leva mais uma contagem para voltar a zero no registro do cronômetro.

Etapa 5: Modo de baixo consumo

_BIS_SR (LPM0_bits + GIE);

Isso habilita a Habilitação de interrupção geral (GIE) e coloca a CPU em LPM0, onde o MCLK que oferece suporte à CPU está desligado e o SMCLK e o ACLK são executados, o que mantém o cronômetro em execução. então podemos ver que a CPU está desligada, economizando energia.

Etapa 6: ISR-Timer

ISR-Timer
ISR-Timer

#pragma vector = TIMER0_A0_VECTOR

_interrupt void Timer_A (void)

{

z ++;

if (z> atraso)

{

P3OUT = código [x];

P6OUT = código1 [y];

x ++;

if (x == 10)

{

x = 0;

y ++;

}

if (y == 6)

y = 0;

z = 0;

}

}

O vetor pragma é para representação ISR em C embd.

code [x] e code1 [y] são as matrizes que contêm valores de saída para os dois sete segmentos, para exibir o contador de 60 segundos.

Etapa 7: interrupção de hardware

P2DIR = 0x00;

P2REN = 0x02;

P2OUT = 0x02;

P2IE | = BIT1;

P2IES | = BIT1;

P2IFG & = ~ BIT1;

Aqui P2.1 é declarado como uma interrupção de hardware, se o botão for pressionado, o contador zera para o valor.

o programa restante é escrito dentro do ISR desta interrupção.

Etapa 8: ISR- Botão Reset / Push

#pragma vector = PORT2_VECTOR

_interrupt void port_2 (void)

{

P2IFG & = ~ BIT1;

x = 0; y = 0;

P3OUT = código [x];

P6OUT = código1 [y];

v ++;

para (i = 0; i

{

P1OUT | = BIT0; //P1.0 = alternar

_delay_cycles (1048576);

P1OUT & = ~ BIT0; // P1.0 = alternar

_delay_cycles (1048576);

}

Este ISR zera o contador e mantém uma contagem de quantas vezes o resto foi pressionado.

(Aqui a exibição é feita via alternador de led, também pode usar outro array e temporizador, para mostrar esses valores como saída em 7 segmentos).

Etapa 9: CODE

CÓDIGO
CÓDIGO

#incluir

#define delay 1000

código char = {0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE0, 0xFE, 0xE6};

char code1 = {0x7E, 0x30, 0x6D, 0x79, 0x33, 0x5B};

volátil sem sinal int x = 0, y = 0, z = 0;

volátil sem sinal int v = 0, i = 0;

void main ()

{

WDTCTL = WDTPW | WDTHOLD; // parar o cronômetro de watchdog

P7DIR | = 0xFF;

P7OUT | = 0x00;

P8DIR | = 0xFF;

P8OUT | = 0x00;

P4DIR | = 0xFF;

P4OUT | = 0x00;

P5DIR | = 0xFF;

P5OUT | = 0x00;

P1DIR = 0xFF;

P3DIR = 0xFF;

P6DIR = 0xFF;

P2DIR = 0x00;

P2REN = 0x02;

P2OUT = 0x02;

P2IE | = BIT1;

P2IES | = BIT1;

P2IFG & = ~ BIT1;

TA0CCTL0 = CCIE;

TA0CCR0 = 999;

TA0CTL = TASSEL_2 + MC_1;

_BIS_SR (LPM0_bits + GIE);

}

// Rotina de serviço de interrupção do temporizador A0

#pragma vector = TIMER0_A0_VECTOR

_interrupt void Timer_A (void)

{

z ++;

if (z> atraso)

{

P3OUT = código [x];

P6OUT = code1 [y];

x ++;

if (x == 10)

{

x = 0;

y ++;

}

if (y == 6)

y = 0;

z = 0;

}

}

// Rotina de serviço de interrupção de hardware

#pragma vector = PORT2_VECTOR

_interrupt void port_2 (void)

{

P2IFG & = ~ BIT1;

x = 0;

y = 0;

P3OUT = código [x];

P6OUT = code1 [y];

v ++;

para (i = 0; i

{P1OUT | = BIT0; // P1.0 = alternar

_delay_cycles (1048576);

P1OUT & = ~ BIT0; // P1.0 = alternar

_delay_cycles (1048576);

}

}

Etapa 10: Código de Referência

Código de referência
Código de referência

Repositório GitHub

Recomendado: