Part Number:MSP430FR5969
Tool/software: Code Composer Studio
#include "driverlib.h"
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
void dht22_trigger();
void dht22_input();
void dht22_read();
void clockinit();
void timerinit();
uint32_t clock,count=0,timer_count=0,count_1,count_0;
uint32_t pulseWidth;
uint16_t k=0;
bool high;
#define DHT22PORT GPIO_PORT_P1
#define DHT22PIN GPIO_PIN4
#define DHT22_OUTPUT P1DIR |= BIT4//OUTPUT DIRECTION.
#define DHT22_INPUT P1DIR &= ~BIT4//INPUT DIRECTION
#define DHT22_HIGHOUTPUT P1OUT |= BIT4//OUTPUT HIGH
#define DHT22_LOWOUTPUT P1OUT &= ~BIT4//OUTPUT LOW
#define INDHT ((P1IN&BIT4)==BIT4) //INPUT =BIT4
unsigned int temperature, humidity;
uint16_t arr[50]={0};
static uint16_t i=0;
uint32_t lowtohightransition=0,count_1;
uint32_t hightolowtransition=0;
#define TIMER_PERIOD 80
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
PM5CTL0 &= ~LOCKLPM5;
clockinit();
clock=CS_getSMCLK();
timerinit();
_bis_SR_register(GIE);
while(1)
{
dht22_trigger();
dht22_input();
__delay_cycles(80000);
}
}
void clockinit()
{
// Clock System Setup
CSCTL0_H = CSKEY >> 8; // Unlock CS registers
CSCTL1 = DCOFSEL_6; // Set DCO to 8MHz
CSCTL2 = SELA__VLOCLK | SELS__DCOCLK | SELM__DCOCLK; // Set SMCLK = MCLK = DCO
// ACLK = VLOCLK
CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1; // Set all dividers to 1
CSCTL0_H = 0; // Lock CS registers
}
void timerinit()
{
//Start timer in continuous mode sourced by SMCLK
Timer_B_clearTimerInterrupt(TIMER_B0_BASE);
Timer_B_initUpModeParam param = {0};
param.clockSource = TIMER_B_CLOCKSOURCE_SMCLK;
param.clockSourceDivider = TIMER_B_CLOCKSOURCE_DIVIDER_1;
param.timerPeriod = TIMER_PERIOD;
param.timerInterruptEnable_TBIE = TIMER_B_TBIE_INTERRUPT_DISABLE;
param.captureCompareInterruptEnable_CCR0_CCIE =
TIMER_B_CAPTURECOMPARE_INTERRUPT_ENABLE;
param.timerClear = TIMER_B_DO_CLEAR;
param.startTimer = false;
Timer_B_initUpMode(TIMER_B0_BASE, ¶m);
}
void dht22_trigger(void)
{
memset(arr , 0 , sizeof(arr));
i = 0;
k = 0;
high = false;
DHT22_OUTPUT;
DHT22_HIGHOUTPUT;
DHT22_LOWOUTPUT;
__delay_cycles(8000);//1 ms
DHT22_HIGHOUTPUT;
__delay_cycles(240);//30 us
DHT22_INPUT;
if(!GPIO_getInputPinValue( GPIO_PORT_P1,GPIO_PIN4 ))
{
_delay_cycles(640);//80us
}
else
{
clock=CS_getSMCLK();
}
if(GPIO_getInputPinValue( GPIO_PORT_P1,GPIO_PIN4 ))
{
_delay_cycles(640);//80us
}
else
{
clock=CS_getSMCLK();
}
}
void dht22_input()
{
//GPIO_setAsInputPinWithPullDownResistor(DHT22PORT, DHT22PIN);
GPIO_enableInterrupt(DHT22PORT, DHT22PIN);
GPIO_clearInterrupt(DHT22PORT, DHT22PIN);
GPIO_selectInterruptEdge(DHT22PORT, DHT22PIN, GPIO_LOW_TO_HIGH_TRANSITION);
}
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=TIMERB0_VECTOR
__interrupt
#elif defined(__GNUC__)
__attribute__((interrupt(TIMERB0_VECTOR)))
#endif
void TIMERB0_ISR(void)
{
timer_count++;
pulseWidth++;
}
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=PORT1_VECTOR
__interrupt
#elif defined(__GNUC__)
__attribute__((interrupt(PORT1_VECTOR)))
#endif
void Port_1(void)
{
if(GPIO_getInputPinValue( GPIO_PORT_P1,GPIO_PIN4 ))
{
if(high == false)
{
high = true;
k++;
count_1++;
GPIO_clearInterrupt( GPIO_PORT_P1,GPIO_PIN4 );
GPIO_selectInterruptEdge(GPIO_PORT_P1, GPIO_PIN4,GPIO_HIGH_TO_LOW_TRANSITION);
timer_count = 0;
pulseWidth = 0;
Timer_B_startCounter(TIMER_B0_BASE,TIMER_B_UP_MODE);
}
}
else
{
if(high == true)
{
high = false;
Timer_B_stop(TIMER_B0_BASE);
Timer_B_clear(TIMER_B0_BASE);
if(pulseWidth<=3)
{
arr[i++]=0;
}
else
{
arr[i++]=1;
}
pulseWidth=0;
//P1.4 IFG cleared
GPIO_clearInterrupt( GPIO_PORT_P1,GPIO_PIN4 );
GPIO_selectInterruptEdge(GPIO_PORT_P1, GPIO_PIN4,GPIO_LOW_TO_HIGH_TRANSITION);
}
}
if(k == 43)
{
k = 0;
}
}