Skip to content

2019_2020_deeltoets_2_2

baroy edited this page Apr 7, 2025 · 6 revisions

2019-2020 Deeltoets 2 versie 2

Opgaven

De opgaven kun je vinden op: https://bitbucket.org/HR_ELEKTRO/ems10/wiki/Toetsen/2019-2020_Deeltoets_2_2.pdf

Uitwerkingen

#include <msp430.h> 
#include <stdint.h>

void zendGetal(uint16_t getal)
{
    char tekst[7];
    tekst[0] = (getal / 10000) + '0';
    tekst[1] = ((getal / 1000) % 10) + '0';
    tekst[2] = ((getal / 100) % 10) + '0';
    tekst[3] = ((getal / 10) % 10) + '0';
    tekst[4] = (getal % 10) + '0';
    tekst[5] = '\r';
    tekst[6] = '\n';

    int i;
    for (i = 0; i < 7; i++)
    {
        while (!(IFG2 & UCA0TXIFG));
        UCA0TXBUF = tekst[i];
    }
}

//  1B
#pragma vector = PORT2_VECTOR
__interrupt void port2_isr(void)
{
    P2OUT ^= BIT1; // Toggle P2.1
    P2IFG &= ~BIT0; // Reset P2.0 interrupt flag
}

//  2
#pragma vector = TIMER0_A1_VECTOR
__interrupt void timer0_cc0__isr(void)
{
    P2OUT ^= BIT1; // Toggle P2.1
    TA0CTL &= ~TAIFG; // Reset interrupt flag
//  3
    ADC10CTL0 |= ADC10SC; // Start ADC
}

//  3
uint16_t spanning_in_mv;
#pragma vector = ADC10_VECTOR
__interrupt void adc_to_mv(void)
{
    spanning_in_mv = ADC10MEM * (3600 / 1023.0);
}

int main(void)
{
    WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
//  2
    BCSCTL1 = CALBC1_8MHZ;
    DCOCTL = CALDCO_8MHZ;

//  1A
    P2DIR |= BIT2; // P2.2 output
    P2DIR &= ~BIT0; // P2.0 input
    P2REN |= BIT0;
    P2OUT &= ~BIT0; // Pull down op P2.0

//  1B
    P2DIR |= BIT1; // P2.1 output
    P2IE |= BIT0; // Pin change interrupt op P2.0
    P2IES |= BIT0; // Neergaande flank (loslaten knop)

//  2
    TA0CTL = TASSEL_2 // SMCLK
           | ID_3 // /8
           | MC_1 // Up mode
           | TAIE // enabele interrupt
           ;
    TA0CCR0 = 59999;

//  3
    ADC10CTL1 = INCH_5 // pin P1.5
              | SHS_0 // ADC10SC bit = default
              | ADC10DIV_7 // /8
              | ADC10SSEL_3 // SMCLK
              | CONSEQ_0 // Single-channel-single-conversion = default
              ;
    ADC10CTL0 = SREF_0 // V_R+ = V_CC and V_R- = V_SS = default
              | ADC10ON // ADC10on
              | ADC10IE // Interrupt enabled
              | ENC // ADC10 enabled
              ;
// 4
    UCA0CTL1 |= UCSWRST; // USCI logic held in reset state
    UCA0CTL0 = 0;
    UCA0CTL1 = UCSSEL_2 // SMCLK of UCSSEL_3 idem
             | UCSWRST; // USCI logic held in reset state
    // Set baudrate 9600
    UCA0BR0 = 52;
    UCA0BR1 = 0;
    UCA0MCTL = UCBRS_0 | UCBRF_1 | UCOS16;
    // Configure ports.
    P1SEL |= BIT2 | BIT1;
    P1SEL2 |= BIT2 | BIT1;
    UCA0CTL1 &= ~UCSWRST;

//  1B
    __enable_interrupt();

    while (1) {
//  4
        if ((IFG2 & UCA0RXIFG) == UCA0RXIFG)
        {
            if (UCA0RXBUF == '!')
            {
                zendGetal(spanning_in_mv);
            }
        }
// 1A
        if ((P2IN & BIT0) == BIT0)
        {
            P2OUT |= BIT2;
        }
        else
        {
            P2OUT &= ~BIT2;
        }
    }
    return 0;
}

Clone this wiki locally