Filip Stevanovic
/
19E042PIM_T2_2020_0039
Filip Stevanovic 2020/0039
main.cpp
- Committer:
- filip_ste
- Date:
- 2021-11-13
- Revision:
- 1:f62564cb5261
- Parent:
- 0:569d2e559397
- Child:
- 2:67f18997ff0d
File content as of revision 1:f62564cb5261:
/* Zasto ljudi cudno cuju? -Filip Stevanovic Da bi smo bili bolji predatori, evolucija je coveku razvila veoma osetljiva cula. Da bi se to ostvarilo, mozak signale sa cula logaritmuje, i tako se promene na veoma malim nivoima jasno uocavaju dok se promene na velikim nivoima skoro uopste ne primecuju. Hvala na paznji */ #include "mbed.h" //Constants #define DebouncePeriod 100 //Period that a button needs to stabilise in miliseconds. 100 should be okay #define ArbitraryWaitPeriod 1 //Aritrary pooling waiting periods, its should be the in the scale of tens of miliseconds to max 100 //Constants for frequency spectrum function const int n = 5000; const int k = -4950; //Pins #define A PA_10 #define B PA_9 #define C PA_8 #define D PB_10 #define E PB_5 #define F PB_4 #define G PB_3 #define SEL1 PB_6 #define SEL2 PC_7 #define SW1 PC_9 #define POT1 PA_0 #define POT2 PA_1 #define BUZZ PA_11 #define LD2 PB_15 //Pin/Object declaration PwmOut buzzer (BUZZ); DigitalOut led2 (LD2); InterruptIn sw1 (SW1); AnalogIn pot1 (POT1); AnalogIn pot2 (POT2); BusOut display (A,B,C,D,E,F,G); BusOut select (SEL2,SEL1); //Timer declaration Timer t; //Global variable for updating the display when SW1 is pressed int value = 0; //ISR for Switch1 (Fall) void ISR_sw1(){ //If the button recently fell, dont do the ISR again (Debounce) //If it didnt, do it and save the new time when you did it if(t.read_ms()> DebouncePeriod){ value = pot1 * 100; led2 = !led2; t.reset(); } } //////////////////////////////////////////////////////// //Made on last test thus minimal commenting //Show digit on display void SegDisp (int num){ switch(num){ case 0:display = 0b1000000;break; case 1:display = 0b1111001;break; case 2:display = 0b0100100;break; case 3:display = 0b0110000;break; case 4:display = 0b0011001;break; case 5:display = 0b0010010;break; case 6:display = 0b0000010;break; case 7:display = 0b1111000;break; case 8:display = 0b0000000;break; case 9:display = 0b0010000;break; default:display = 0x7f; break; } } //Convert number to digits and show on display void PrintDisp(int num){ int j = num%10,d = num/10; if(d==0) SegDisp(-1); else SegDisp(d); select = 0b01; wait_ms(ArbitraryWaitPeriod); SegDisp(j); select = 0b10; wait_ms(ArbitraryWaitPeriod); } //////////////////////////////////////////////////////// //Main int main(){ //Starting timer t.start(); //Binding ISR to fall for Switch1 sw1.fall(&ISR_sw1); //Main Loop while(1){ //Pooling Pot1 i Pot2 buzzer=pot1*0.5f; //Arbitrary division by 2 as it is apsolutely same if duty is .25 or .75 buzzer.period_us(k*pot2+n); //Linearise frequency from 20Hz to 20kHz //Print Pot1 to Display PrintDisp(value); //It never gets to 1 so it wont get to 100 thus its limited to 99 //Pooling time is integrated in PrintDisp function } }