123
Dependencies: TM1638 mbed HCSR04
main.cpp
- Committer:
- lucem1n
- Date:
- 2019-03-02
- Revision:
- 0:6f4090a07409
- Child:
- 1:63541cb7c9d0
File content as of revision 0:6f4090a07409:
#include "mbed.h" #include "IR_Def.h" #include "hcsr04.h" #define CAT0_PIN PC_1 // 11 PC_3 переставили с катодом 7 #define CAT1_PIN PC_3 // 7 PC_2 переставили с катодом 6 #define CAT2_PIN PB_0 // 4 PF_5 переставили с катодом 5 #define CAT3_PIN PC_2 // 2 PA_0 переставили с катодом 4 #define CAT4_PIN PA_4 // 1 PF_10 #define CAT5_PIN PA_1 // 10 PF_2 #define CAT6_PIN PC_0 // 5 PD_5 #define CAT7_PIN PF_1 // 3 PH_0 #define ANO0_PIN PB_4 // 12 PC_0 #define ANO1_PIN PB_5 // 9 PF_3 #define ANO2_PIN PB_3 // 8 PB_0 #define ANO3_PIN PB_10 // 6 PA_3 //------------------------------------ // Hyperterminal configuration // 9600 bauds, 8-bit data, no parity //------------------------------------ Serial pc(SERIAL_TX, SERIAL_RX); InterruptIn IR(PC_12); DigitalOut myled(LED1); Timer T; Ticker system_clock; Ticker pult; //This will be used to increment a counter every msec inside it's ISR Ticker display; Ticker distancee; Ticker muzika; AnalogOut Da(PA_5); //DigitalOut myled(LED2); DigitalOut cathodes[8] = { DigitalOut(CAT0_PIN), DigitalOut(CAT1_PIN), DigitalOut(CAT2_PIN), DigitalOut(CAT3_PIN), DigitalOut(CAT4_PIN), DigitalOut(CAT5_PIN), DigitalOut(CAT6_PIN), DigitalOut(CAT7_PIN), }; DigitalOut anodes[4] = { DigitalOut(ANO0_PIN), DigitalOut(ANO1_PIN), DigitalOut(ANO2_PIN), DigitalOut(ANO3_PIN), }; int p = 0; int o=0; void IR_ISR(); //ISR for decoding the IR signal void dummy_ISR(); //Required so that 'IR_ISR' is not called on both rising and falling edges of IR signal at the same time void sys_tick(); int v=0; uint8_t state = 0; //State variable for IR state machine uint8_t Rx_count = 0; //Counter to count no. of bits received uint32_t Rx_buf = 0; //To store recevied IR data char Rx_flag = 0; //Flag which indicates that a valid IR command was received uint32_t Rx_rep_count = 0; //To keep track of how many repeat pulses are received uint32_t Rx_rep_timeout_count = 0; //Timer which clears the previously received IR command, once it reaches the set limit uint32_t T_buf = 0; //Buffer to hold value of timer T char Rx_ignore_rep_flag = 0; //0 => Do not ignore repeat pulses uint8_t digits[] = {0x03, 0x9F, 0x25, 0x0D, 0x99, 0x49, 0x41, 0x1F, 0x01, 0x09, 0xFD, 0x91,0x89, 0x83}; //DigitalOut trig(PA_3); //DigitalIn echo(PD_7); HCSR04 usensor(PB_13,PB_14); unsigned int dist=0; int flag1, flag2, flag3 = 0; int i,j,k,m,size=0; void fireUpSign(int signNum){ anodes[signNum] = 1; } void shutDownSign(int signNum){ anodes[signNum] = 0; } void setDigit(int digit){ for(int isd=0; isd < 8; isd++){ ((digits[digit] & (1<<(7-isd))) > 0) ? cathodes[isd] =1 : cathodes[isd] =0; } } void fireUpAllSigns(){ fireUpSign(0); fireUpSign(1); fireUpSign(2); fireUpSign(3); } void shutDownAllSigns(){ shutDownSign(0); shutDownSign(1); shutDownSign(2); shutDownSign(3); } void ddisplay () { setDigit(p); fireUpSign(3); wait_us(3000); shutDownAllSigns(); setDigit(i); fireUpSign(2); wait_us(3000); shutDownAllSigns(); setDigit(j); fireUpSign(1); wait_us(3000); shutDownAllSigns(); setDigit(k); fireUpSign(0); wait_us(3000); shutDownAllSigns(); //IR.fall(&IR_ISR); //IR.rise(&dummy_ISR); if(i>9) { j++; i=0; } if(j>9) { k++; j=0; i=0; } /*if(i == 1) { myled = !myled; wait_ms(300); i = 0; }*/ } void ddistance () { usensor.start(); dist=usensor.get_dist_cm(); //IR.fall(&IR_ISR); //IR.rise(&dummy_ISR); } void sys_tick() { if(Rx_rep_timeout_count < 0xFFFF) { //Do not increment counter beyond 0xFFFF to prevent roll-over ++Rx_rep_timeout_count; //Increment this counter every 1msec. } } void ppult () { // if(o==0) // { //IR.mode(PullNone); //wait_ms(20); // IR.fall(&IR_ISR); // IR.rise(&dummy_ISR); // } } int main() { int verh; int nij; while(1) { //if (o==0) // { // display.attach(&ddisplay, 0.02); // distancee.attach(&ddistance, 0.02); // pult.attach(&ppult, 2); ddisplay (); ddistance(); // } verh = 80; nij = 10; if(dist >verh) { flag1=1; } if(flag1==1 && dist < nij) { flag2=1; } if (flag1==1 && flag2==1 && dist>verh) { flag3=1; } if( flag1==1 && flag2==1 && flag3==1) { flag1=0; flag2=0; flag3=0; i++; } if (v==1) { // pc.printf(" RX= %x " , Rx_buf); if(Rx_buf == 0xbf40ff00) { //pc.printf("5"); p=0; j=0; i=0; k=0; } if(Rx_buf == 0xf609ff00) { i++; if(i>9) { j++; i=0; } if(j>9) { k++; j=0; i=0; } { } // pc.printf("9"); } if(Rx_buf == 0xf807ff00) { //pc.printf("7"); if (p>9) { p=0; } else { p++; } } if(Rx_buf == 0xe619ff00) { if(i==0 && j==0 && k==0 && (i+j+k)-p<0 && i-p<0) { i=0; j=0; k=0; p=0; } if(i>=p) { i=i-p; } else if(i<p) { if(j==0) { k=k-1; j=j+10-(p-i); i=i+10; i=i-p; } else if(j!=0) { i=i+10; i=i-p; j=j-1; } } //pc.printf("0"); } v=0; } // if(o==0) // { //IR.mode(PullNone); wait_ms(10); IR.fall(&IR_ISR); IR.rise(&dummy_ISR); //} } } void dummy_ISR() { //Do nothing } void IR_ISR() { o=1; display.detach(); distancee.detach(); //pult.detach(); if(state == 0) { T.stop(); //Stop timer T.reset(); //Reset timer T.start(); //Start timer IR.rise(&IR_ISR); //Set IR interrupt to occur on rising edge IR.fall(&dummy_ISR); state = 1; //Go to next state Rx_count = 0; //Clear the received bits counter } else if(state == 1) { T.stop(); //Stop timer T_buf = (uint32_t)T.read_us(); //Read timer T.reset(); //Reset timer T.start(); //Start timer IR.fall(&IR_ISR); //Set IR interrupt to occur on falling edge IR.rise(&dummy_ISR); if(T_buf <= IR_9000us_UL && T_buf >= IR_9000us_LL) { //Check for preamble start pulse(9ms) state = 2; //Go to next state } else { state = 0; //Reset the state machine } } else if(state == 2) { T.stop(); //Stop timer T_buf = (uint32_t)T.read_us(); //Read the value in timer T.reset(); //Reset timer T.start(); //Start timer IR.fall(&IR_ISR); //Set IR interrupt to occur on falling edge IR.rise(&dummy_ISR); if(T_buf <= IR_4500us_UL && T_buf >= IR_4500us_LL) { //Check for preamble space(4.5ms) state = 3; //Go to next state Rx_rep_timeout_count = 0; //Reset counter Rx_rep_count = 0; //Reset the repeat pulse counter } else if(T_buf <= IR_2250us_UL && T_buf >= IR_2250us_LL) { //Check for repeat pulse(2.25ms) state = 0; //Reset the state machine if(Rx_rep_count < 0xFFFF) { if(Rx_rep_timeout_count < IR_rep_timeout_ms) { //Only increment the repeat pulse counter if the delay between two successive repeat pulses is less than 135msec. Rx_rep_timeout_count = 0; //Reset the counter everytime a valid repeat pulse is received ++Rx_rep_count; } else { //Invald repeat pulse received Rx_rep_count = 0; //Reset counter Rx_flag = 0; //Clear the flag to indicate that an IR command was not received Rx_buf = 0; //Clear the previously received command } } goto ahead; //Repeat the previous command } else { //Wrong pulse Rx_rep_count = 0; //Reset counter state = 0; //Reset the state machine } } else if(state == 3) { T.stop(); //Stop timer T_buf = T.read_us(); //Read the value in timer T.reset(); //Reset timer T.start(); //Start timer IR.fall(&IR_ISR); //Set IR interrupt to occur on falling edge IR.rise(&dummy_ISR); v=1 ; if(T_buf <= IR_1_UL_us && T_buf >= IR_1_LL_us) { //Check if bit is '1'(2.25ms) ++Rx_count; //Increment the bit counter Rx_buf >>= 1; Rx_buf |= 0x80000000; //Shift in a '1' from the left side state = 3; //Remain in current state } else if(T_buf <= IR_0_UL_us && T_buf >= IR_0_LL_us) { //Check if bit is '0'(1.12ms) ++Rx_count; //Increment the bit counter Rx_buf >>= 1; //Shift in a '0' from the left side state = 3; //Remain in current state } else { //Invalid data received Rx_count = 0;//Reset the bit counter state = 0; //Reset state m/c } if(Rx_count == 32) { //Check if all 32 bits have been received state = 0; //Reset state m/c ahead: if(!((Rx_rep_count > 0) && (Rx_ignore_rep_flag == 1))) { Rx_flag = 1; //Set this flag for repeat pulses only if repeat pulses are to be considered } Rx_rep_timeout_count = 0; //Reset the counter everytime a valid command is received } } o=0; }