এমএসপি 430 - সেমফোর - সি ভাষা


2

আমি এখানে একটি সি কোড করছি যা এমএসপি 430 লঞ্চপ্যাডে চালিত হয়। আমার এখানে যা করা দরকার তা হল প্রোগ্রামটি পরিবর্তন করা, যাতে বোতামটির ধাক্কায়, 4 টি বিভিন্ন মোডের মাধ্যমে মাইক্রো চক্র:

  1. LED2 বন্ধ থাকাকালীন LED1 ফ্ল্যাশ হয়
  2. LED1 বন্ধ থাকাকালীন LED2 ফ্ল্যাশ হয়
  3. একসাথে LED1 এবং LED2 ফ্ল্যাশ
  4. বিকল্পভাবে LED1 এবং LED2 ফ্ল্যাশ

একসাথে এবং বিকল্পভাবে উভয়ই এলইডি ফ্ল্যাশ করতে আমি কী করতে পারি তা আমি এখানে বেশ বুঝতে পারি না। এসডাব্লু 2 উচ্চ এবং এর বিপরীতে যদি LED1 ফ্লাশ হয় এবং LED2 বন্ধ থাকে। অন্য দু'জন কীভাবে কাজ করবেন?

এখন পর্যন্ত যা করা হয়েছে তা এখানে:

#include <msp430.h> 
#include "msp430g2553.h"
int sw2=0;

int main(void) 
{
    WDTCTL = WDTPW | WDTHOLD;      //stop watchdog timer

    P1DIR  = 0x00;         //port 1 all inputs
    P1DIR |= (BIT0 | BIT6);        //set P1.0 and P1.6 as outputs (LED1, LED2)
    P1REN |= BIT3;         //activate resister on P1.3
    P1OUT |= BIT3;         //make it pull up because SW2 is active low

    for(;;)
    { sw2 = P1IN;          //read values from P1
      sw2 &= BIT3;         //mask out only BIT3 where SW2 is connected
      if (sw2 == BIT3)               
         {             //if SW2 is high
            P1OUT &= ~BIT6;    //turn LED2 off 
            P1OUT ^= BIT0;     //toggle LED1
          __    delay_cycles(50000);   //delay 50,000 micro seconds
         }
      else             
         {             //else (SW2 is low) 
            P1OUT &= ~BIT0;    //turn LED1 off
            P1OUT ^= BIT6;     //toggle LED2
            __delay_cycles(200000);   //delay 200,000 micro seconds
         }
     }
// end of infinite loop
}
//end of main

শিরোনামে আপনি semaphore আছে। আমি আর কোথাও সেম্যাফোরটিকে রেফারেন্স দেখতে পাচ্ছি না। কটাক্ষপাত MSP430 জন্য sys / BIOS- র দ্রুত সূচনা
মহেন্দ্র Gunawardena

উত্তর:


1

আমি কেবল দেখতে পাচ্ছি যে আপনি "যদি উচ্চ - তবে একটি কাজ করুন, যদি কম হয় - অন্য কিছু করুন" এ স্যুইচটি প্রোগ্রাম করেছেন। আপনি স্যুইচ (এবং উত্সাহ) জন্য একটি কাউন্টার অন্তর্ভুক্ত করা প্রয়োজন। তারপরে 4 যদি বিবৃতি, প্রতিটি মোডের জন্য একটি আপনি সাইকেল চালাচ্ছেন।

সিউডো-ইশ কোড:

int sw2 = 0;
int counter = 0;
flipbit = 0;

Int main(void) {

   (whatever ports/bits you need to set up here)

   If (sw2 == 1) {                    //if the switch is depressed..
      delay_cycles(200,000);          //Wait 200ms (lazy debounce) as long as you click a button quicker than 200ms no worries
      counter == counter + 1;         //increment the counter
   }
   if (counter == 1) {
      P1OUT ^= BIT0;                  //turn led1 on
      __delay_cycles(200000);         //wait 200ms
      P1OUT ^= BIT0;                  //turn led1 off
      __delay_cycles(200000);         //wait 200ms
   }
   if (counter == 2) {
      P1OUT ^= BIT6;                  //turn led2 on
      __delay_cycles(200000);         //wait 200ms
      P1OUT ^= BIT6;                  //turn led2 off
      __delay_cycles(200000);         //wait 200ms
   }
   if (counter == 3) {
      P1OUT &= ~BIT0;                 //turn led 1 on
      P1OUT ^= BIT6;                  //turn led 2 on
      delay_cycles(200,000);          //wait 200ms
      P1OUT &= ~BIT0;                 //turn led 1 off
      P1OUT ^= BIT6;                  //turn led 2 off
      delay_cycles(200,000);          //wait 200ms
   }
   if (counter == 4) {                //now it gets exciting...
      if (flipbit == 0) {             //this statement lets us run a statement once per loop
         P1OUT &= ~BIT0;              //turn led1 on
         flipbit == flipbit + 1       //make flipbit = 1 so it doesn't run again this cycle
         }
      P1OUT &= ~BIT0;                 //turn led 1 off
      P1OUT ^= BIT6;                  //turn led 2 on
      delay_cycles(200,000);          //wait 200ms
      P1OUT &= ~BIT0;                 //turn led 1 on
      P1OUT ^= BIT6;                  //turn led 2 off
      delay_cycles(200,000);          //wait 200ms
   }
   if (counter == 5) {                //you clicked the button again, to return to the first mode
      P1OUT &= ~BIT0;                 //turn led1 back off, ready to start the cycle again
      flipbit = 0;
      counter = 1;                     //set counter to 1, so it starts on first mode
   }

যেহেতু আপনি বিটগুলি '1' বা '0' হিসাবে নির্ধারণের পরিবর্তে 'টগলিং' করছেন, আমি প্রতিটি স্টেটমেন্টের মধ্যে একটি সম্পূর্ণ চক্র তৈরি করে, অর্থাৎ সেগুলি চালু করে এবং পিছনে রেখে তারা কোন অবস্থানে রয়েছে তা ট্র্যাক করে রাখা নিশ্চিত করেছি made এটি এগিয়ে যাওয়ার আগে বন্ধ।

এই 'ফ্লিপবিট' প্রথমে নেতৃত্ব 1 ঘুরিয়ে দিয়ে প্যাটার্নটি অফসেট করার জন্য রয়েছে যাতে আমরা মোড 3 এর মতো একই প্যাটার্নটি ব্যবহার করতে পারি, এবং কাউন্টারটির পঞ্চম ধাপটি সেই নেতৃত্বকে ফিরিয়ে আনতে এবং সেই ফ্লিপবিটটিকে 0 এ পুনরায় সেট করতে হয়।

এটি বাস্তবায়নের কয়েকটি উপায় রয়েছে। এইটি সবচেয়ে সহজ যেটি আমি 'পাঠযোগ্য' বলে মনে করতে পারি।

সম্পাদনা করুন:

সবেমাত্র এটি সন্ধান করা হয়েছে এবং '__ডেলা_সাইক্লস' আসলে আরডুইনোর মতোই যেখানে এটি কোড প্রয়োগ কার্যকর করে। এটি দুর্দান্ত নয় কারণ আপনার বোতাম টিপুন প্রোগ্রামের একটি বড় অংশের নজরে আসবে না। এটিতে যাওয়ার 2 টি উপায় রয়েছে, হয় স্যুইচটির জন্য একটি বাধা ব্যবহার করুন বা বিলম্বের পরিবর্তে টাইমার ব্যবহার করুন। এই লিঙ্কটি আপনাকে কীভাবে দেখায়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.