Τσιπάκι:https://os.mbed.com/platforms/FRDM-K64F/ Για να είμαστε σε θέση να χρησιμοποιήσουμε τον μικροεπεξεργαστή ακολουθήσαμε τα εξής βήματα : - Επισκεπτήκαμε την σελίδα του μικροεπεξεργαστή - Ακολουθήσαμε τις οδηγίες στην κατηγορία PC Configuration - Επιλέξαμε το Link Windows serial configuration - Κατεβάσαμε το Windows serial port driver και εκτελέσαμε το .exe αρχείο. Μετά τα παραπάνω βήματα είμαστε έτοιμοι να ξεκινήσουμε. ====== Δημιουργία Serial Port Επικοινωνίας σε Windows & Putty ====== - Συνδέουμε τον μικροεπεξεργαστή - Ανοίγουμε το - Επιλέγουμε την κατηγορία Port (COM & LPT) - Κρατάμε τον αριθμό του port - Ανοίγουμε το Putty - Συμπληρώνουμε στο πεδίο Serial line COM# όπου # είναι ο αριθμός του port που κρατήσαμε (π.χ COM14) - Στο πεδίο speed συμπληρώνουμε 9600 - Connection type: Serial - Open Για το α ερώτημα της άσκησης 1 - Επισκεφτήκαμε την διεύθυνση https://ide.mbed.com/compiler - Δημιουργήσαμε ένα έτοιμο από τις προεπιλογές project με το όνομα blinky - Πατήσαμε compile και η ιστοσελίδα μας κατέβασε ένα .bin αρχείο με το όνομα blinky - Το μεταφέραμε στον μικροεπεξεργαστή (DAPLINK) - Στη συνέχεια επιλέξαμε το πλήκτρο reset πάνω στον μικροεπεξεργαστή ώστε να αρχίσει να εκτελεί το πρόγραμμα μας. #include "mbed.h" DigitalOut myled(LED1); int main() { while(1) { myled = 1; wait(0.2); myled = 0; wait(0.2); } } β) - Στην γράψαμε στην main() την εντολή printf("Hello World! /n"); και στη συνέχεια wait(1); - Μεταφέραμε το .bin αρχείο στο DAPLINK - Εκτελέσαμε την λειτουργία RESET του μικροεπεξεργαστή - Ανοίξαμε σειριακή σύνδεση μέσω putty - Είδαμε να τυπώνονται "Hello World!" και να αλλάζει γραμμή. #include "mbed.h" int main() { printf("Hello World!\n"); } γ) Για την υλοποίηση του ερωτήματος γ ακολουθήσαμε τα εξής βήματα: - Συνδέσαμε ενα LED λαμπάκι στο breadboard - Συνδέσαμε τα καλώδια απο το λαμπάκι στα πινάκια D5 D6 D7 κάθε ένα για το red green blue αντίστοιχα - Με την συνάρτηση getc δεχθήκαμε τη είσοδο του χρήστη - "l" για την λειτουργία ΟΝ/OFF και "+, -" για την αυξομείωση της έντασης #include "mbed.h" PwmOut r(D7); PwmOut g(D5); PwmOut b(D6); char c; bool isOn = false; int main(){ printf("Press l to turn ON/OFF the led or +,- for dimming control /n"); while(1) { c = getc(stdin); if ( c == 'l' ) { if (isOn){ r = 0; g = 0; b = 0; isOn = false; }else { r = 1; g = 1; b = 1; isOn = true; } }else if ( c == '-' & isOn) { g = g - 0.01; r = r - 0.01; b = b - 0.01; if (g or b or r < 0 ){ r,g,b = 0; } }else if ( c == '+' & isOn){ g = g + 0.01; r = r + 0.01; b = b + 0.01; if (g or b or r > 1 ){ r,g,b = 1; } } } } δ) Για την υλοποίηση του ερωτήματος χρησιμοποιήσαμε την κλάση InterruptIn της βιβλιοθήκης mbed και συνδέσαμε ενα πλήκτρο. Κάθε φορά που το πλήκτρο σηκώνεται καλούμαι την συνάρτηση increaseAndDisplayCounter η οποία και αυξάνει και τυπώνει τον μετρητή. #include "mbed.h" cnt = 0; InterruptIn interrupt(D8); void increaseCounter(){ cnt++; printf("Counter = : %d\n", cnt); } int main() { while(1) { interrupt.rise(&increaseAndDisplayCounter); wait(1); } } ε) Για το ε δηλώσαμε το onboard πλήκτρο σαν InterrruptIn και χρησιμοποιήσαμε την συνάρτηση fall η οποία κάθε φορά που το πλήκτρο πιέζεται ανάβει ή σβήνει το λαμπάκι. #include "mbed.h" DigitalOut led(LED_RED); InterruptIn onboardButton(SW2); void Pressed() { if (led){ led = 0; } else { led = 1; } } int main() { while (1) { onboardButton.fall(&Pressed); } } στ) Για την υλοποίση του στ ερωτήματος χρειαστήκαμε την κλάση Ticker η οποία διακόπτει το πρόγραμμα μας με συχνότητα που ορίζουμε εμεις. Φτιάξαμε την συνάρτηση changeRandomColor() που επιλέγει τυχαία χρώμα. Σαν δεύτερο όρισμα στην συνάρτηση βάλαμε την τιμή 1 η οποία είναι η συχνότητα σε second με την οποία γίνεται το interrupt #include "mbed.h" Ticker timer; PwmOut r(D7); PwmOut g(D5); PwmOut b(D6); float red_random, green_random, blue_random ; void changeRandomColor() { int randomValue = rand() % 3; r,g,b = 0; if (randomValue == 1){ r = 1; }else if (randomValue == 2){ g = 1; } else { b = 1; } red_led = red_random; green_led = green_random; blue_led = blue_random; } int main() { while(1) { timer.attach(&changeRandomColor, 1.0); } } ζ)Για την χρήση του ποτενσιόμετρου έπρεπε να ακολουθήσουμε τα εξής βήματα: - Να συνδέσουμε στο ένα άκρο την τροφοδοσία - Να συνδέσουμε στο άλλο άκρο την γείωση - Στο μεσαίο ακροδέκτη να συνδέσουμε ένα καλώδιο με μια αναλογική είσοδο (Στην περίπτωση μας A3) AnalogIn potentiometer(A3); DigitalOut red(D7); char c; int main() { float potValue ; while(1) { potValue = potentiometer.read(); red = 1; wait(potValue*1000); red = 0; } } ====== Ερώτημα 2. Dhrystone Benchmark ====== α) Για το ερώτημα α έπρεπε να κάνουμε: - Import την βιβλιοθήκη Dhrystone. - Σύνδεση του onboard button. - Εκτέλεση του πειράματος. - Καταμέτρηση επαναλήψεων. - Χρονομέτρηση εκτέλεσης. - Διαίρεση επαναλήψεων/ χρόνος εκτέλεσης. - Τελικό αποτέλεσμα. #include "mbed.h" #include "dhry.h" DigitalOut myled(LED1); Timer timer; Serial pc(USBTX, USBRX); //serial channel over HDK USB interface InterruptIn btn(SW2); void pressed(){ double benchtime, dps; unsigned long loops; double DMIPS; double totalDMIPSScores = 0; double max = -1000; double avg; int totalRepetitions=0; pc.baud(9600); printf("Dhrystone Benchmark Program C/1 12/01/84\r\n"); timer.start(); while(1) { loops = 0l; myled = 1; timer.reset(); do { Proc0(); loops += LOOPS; benchtime = timer.read(); } while (benchtime <= 60.000); myled = 0; dps = (double)loops / benchtime; DMIPS = dps/1757; //1757 was the score from first MCU totalRepetitions++; totalDMIPSScores += DMIPS; avg = totalDMIPSScores/totalRepetitions ; if(max < DMIPS){ max = DMIPS; } printf("Dhrystone time for %ld passes = %.3f sek\r\n", loops, benchtime); printf("benchmarks Result = %.0f DMPIS\r\n", DMIPS); printf("Best DMIPS Score = : %.0f\r\n", max); printf("Average DMIPS Score = : %.0f\r\n", avg); wait(1.0); } } int main() { btn.fall(&pressed); } ===== Αποτελέσματα ===== {{2a.jpg}} β) Στο ερώτημα αυτό ήταν απαραίτητη η κάρτα SD για την αποθήκευση των txt αρχείων κάτι το οποίο δεν είχαμε στην κατοχή μας με σκοπό να μην μπορέσουμε να υλοποιήσουμε το παραπάνω κομμάτι το οποίο είναι κάτι πολύ απλο αν συμπεριλάβουμε ότι στο α ερώτημα έχουμε τον κώδικα ώστε να τρέξουμε το benchmark όσες φορές επιθυμούμε. γ) Για το γ ερώτημα κάναμε κάποιες τροποποιήσεις. Δημιουργήσαμε μια συνάρτηση pressed η οποία είναι συνδεδεμένη με ενα από τα onboard button και είναι καταχωρημένο ως interruptIn. Στη main καλούμε τη συνάρτηση dhrystoneBenchmark() η οποία εκτελεί το benchmark και στη διάρκεια αυτής της εκτέλεσης πατούσαμε αρκετές φορές το interrupt button βλέποντας ταυτόχρονα την φωτεινή ένδειξη να ανάβει και να σβήνει κάθε φορά που καλούταν η pressed. #include "mbed.h" #include "dhry.h" DigitalOut myled(LED1); Timer timer; Serial pc(USBTX, USBRX); //serial channel over HDK USB interface InterruptIn btn(SW2); AnalogIn potentiometer(A3); DigitalOut led(LED2); void pressed(){ if (led) led = 0; else led = 1; } void dhrystoneBenchmark(){ double benchtime, dps; unsigned long loops; double DMIPS; double totalDMIPSScores = 0; double max = -1000; double avg; int totalRepetitions=0; pc.baud(9600); printf("Dhrystone Benchmark Program C/1 12/01/84\r\n"); timer.start(); while(1) { loops = 0l; myled = 1; timer.reset(); do { Proc0(); loops += LOOPS; benchtime = timer.read(); } while (benchtime <= 60.000); myled = 0; dps = (double)loops / benchtime; DMIPS = dps/1757; //1757 was the score from first MCU totalRepetitions++; totalDMIPSScores += DMIPS; avg = totalDMIPSScores/totalRepetitions ; if(max < DMIPS){ max = DMIPS; } printf("Dhrystone time for %ld passes = %.3f sek\r\n", loops, benchtime); printf("benchmarks Result = %.0f DMPIS\r\n", DMIPS); printf("Best DMIPS Score = : %.0f\r\n", max); printf("Average DMIPS Score = : %.0f\r\n", avg); wait(1.0); } } int main() { dhrystoneBenchmark(); btn.fall(&pressed); } ===== Αποτελέσματα ===== Τα αποτελέσματα που πήραμε ήταν παράδοξα καθώς τα νούμερα ήταν μεγαλύτερα απο το ερώτημα 2α. {{23.jpg}} ====== Project Μέρος 3 ====== Αρχικός στόχος μας ήταν η δημιουργία μιας εφαρμογής στην οποία θα μπορούσαμε να εξοικειωθούμε με την χρήση της θύρας ethernet καθώς με διάφορα περιφερειακά με τα οποία θα μπορούσαμε να είχαμε αλληλεπίδραση με το χρήστη. Η εφαρμογή η οποία δημιουργήσαμε αποστέλει ενα HTTP request στην ιστοσελίδα openweathermap.org με την δυνατότητα ο χρήστης να επιλέξει την πόλη την οποία επιθυμεί. Στη συνέχεια διαχωρίζουμε τα δεδομένα τα οποία δεχτήκαμε και εκτυπώνουμε αυτά τα οποία έχουμε προεπιλέξει. Για την εφαρμογή χρησιμοποιήσαμε την βιβλιοθήκη **mbed-http** #if DEMO == DEMO_HTTP #include "mbed.h" #include "http_request.h" #include "mbed_mem_trace.h" #include using namespace std; void dump_response(HttpResponse* res) { char buffer[3000]; string result; printf("Status: %d - %s\n", res->get_status_code(), res->get_status_message().c_str()); printf("Headers:\n"); for (size_t ix = 0; ix < res->get_headers_length(); ix++) { printf("\t%s: %s\n", res->get_headers_fields()[ix]->c_str(), res->get_headers_values()[ix]->c_str()); } printf("\nBody (%d bytes):\n\n%s\n", res->get_body_length(), res->get_body_as_string().c_str()); } NetworkInterface *connect_to_default_network_interface() { printf("[Connecting to network...\n"); NetworkInterface* network = NetworkInterface::get_default_instance(); if (!network) { printf(" No network interface found, select an interface in 'network-helper.h'\n"); return NULL; } nsapi_error_t connect_status = network->connect(); if (connect_status != NSAPI_ERROR_OK) { printf(" Failed to connect to network (%d)\n", connect_status); return NULL; } printf("Connected to the network\n"); printf("IP address: %s\n", network->get_ip_address()); return network; } int main() { printf("Program Starting..\n"); // Connect to the network with the default networking interface NetworkInterface* network = connect_to_default_network_interface(); // Do a GET request { // By default the body is automatically parsed and stored in a buffer, this is memory heavy. // To receive chunked response, pass in a callback as last parameter to the constructor. HttpRequest* get_req = new HttpRequest(network, HTTP_GET, "http://api.openweathermap.org/data/2.5/weather?q=Ioannina&units=metric&APPID=3ff29328f7c661abef83a312168bc559"); HttpResponse* get_res = get_req->send(); if (!get_res) { printf("HttpRequest failed (error code %d)\n", get_req->get_error()); return 1; } printf("\n----- HTTP GET response -----\n"); dump_response(get_res); delete get_req; } wait(osWaitForever); } #endif ===== Αποτελέσματα ===== {{output.jpg}}