Program w języku C na procesorze MPS430

Tu piszemy wiadomość, jeżeli zadanie domowe sprawia kłopot
i szybko potrzebujemy pomocy w rozwiązaniu.
ODPOWIEDZ
elektronikopo
Użytkownik
Posty: 182
Rejestracja: 16 gru 2007, 22:28
Lokalizacja: Poznań

Program w języku C na procesorze MPS430

Post autor: elektronikopo » 20 mar 2011, 22:23

Kod: Zaznacz cały

#include <msp430xG46x.h>

void main (void){
   unsigned char blink_status=1;
   volatile unsigned int i;

   WDTCTL = WDTPW | WDTHOLD;      //Stop Watchdog Timer
   
   P2DIR |= 0x04;                 //Configure P2.2 as Output (LED1)
   P1DIR &= ~0x01;                //Configure P1.0 as Input (S1)
  
   while(1){                      //Infinite loop  
     if (blink_status == 1) { 
         P2OUT ^= 0x04;           //Toggle Port P2.2
         i=15000;                 //Delay 
         do (i--);
         while (i !=0);
     }
     
     if (!(P1IN & 0x01)) {        //Detect button pressed
      i=1500;                     //Delay, button debounce 
      do (i--);
      while (i !=0);
      while (!(P1IN & 0x01));     //Wait for the release of the button
   
      i=1500;                     //Delay, button debounce 
      do (i--);
      while (i !=0);

       if (blink_status ==1){     //If LED is blinking, stop it
         P2OUT&= ~ 0x04;          // Turn Led off
         blink_status=0;
       }else 
        blink_status=1;
     }
  }   
}

Powyższy program mruga dioda co nacisnieciu przycisku sw1 przestaje mrugac po ponownym naciśnięciu ponownie mruga

Musze dopisac do tego programu takie coś , że jesli nacisne sw2 jest opoznienie czasowe mrugania 0,1s jesli ponwonie nacisne 0,5s

Jesli ktoś wie jak to zrobić prosze sie zglosić do mnie nie mam na celu żeby ktoś zrobił to dla tylko chcem uzyskac kilka rad jak to zrobić

Awatar użytkownika
Ertew
Użytkownik
Posty: 1414
Rejestracja: 03 lip 2005, 10:36
Lokalizacja: Leszno
Kontakt:

Re: Program w języku C na procesorze MPS430

Post autor: Ertew » 20 mar 2011, 22:43

Kod: Zaznacz cały

   while(1){                      //Infinite loop  
     if (blink_status == 1) { 
         P2OUT ^= 0x04;           //Toggle Port P2.2
         i=15000;                 //Delay 
         do (i--);
         while (i !=0);
     }
do tego dodaj warunek zmieniający opóźnienie np.

Kod: Zaznacz cały

 if (blink_rate == 1){
         P2OUT ^= 0x04;           //Toggle Port P2.2
         i=15000;                 //Delay
         do (i--);
         while (i !=0);
     }
else {
         P2OUT ^= 0x04;           //Toggle Port P2.2
         i=100;                 //Delay
         do (i--);
         while (i !=0);
     }
i jeszcze dodaj w pętli sprawdzanie drugiego przycisku odpowiadającego za zmianę prędkości migania.

elektronikopo
Użytkownik
Posty: 182
Rejestracja: 16 gru 2007, 22:28
Lokalizacja: Poznań

Post autor: elektronikopo » 20 mar 2011, 23:04

Witam
Wiem , że musze dać warunek sprawdzania przycisku sw2 pod portem P1.1
tylko , że ja nie mam pojęcia jaka jest konstrukcja tego co jest w środku warunku if odpowiedzialne za sprawdzanie tego przycisku

Kod: Zaznacz cały


if (blink_rate == 1){ 
         P2OUT ^= 0x04;           //Toggle Port P2.2 
         i=15000;                 //Delay 
         do (i--); 
         while (i !=0); 
     } 
else { 
         P2OUT ^= 0x04;           //Toggle Port P2.2 
         i=100;                 //Delay 
         do (i--); 
         while (i !=0); 
     }
w tym fragmencie kodu co jest robione bo jestem z tego zielony

[ Dodano: 2011-03-20, 23:08 ]

Kod: Zaznacz cały

else { 
         P2OUT ^= 0x04;           //Toggle Port P2.2 
         i=100;                 //Delay 
         do (i--); 
         while (i !=0); 
     }
możesz mi pwoiedziec co robi to else co napislaes

Awatar użytkownika
Ertew
Użytkownik
Posty: 1414
Rejestracja: 03 lip 2005, 10:36
Lokalizacja: Leszno
Kontakt:

Re: Program w języku C na procesorze MPS430

Post autor: Ertew » 21 mar 2011, 18:49

W poprzednim fragmencie jeśli zmienna blink_rate ma wartość 1 to do zmiennej odliczania i jest podstawiana wartość 1500 (oryginalna). Jeśli będzie 0 to będzie podstawiona inna wartość, którą musisz dobrać.
Nie wiedziałem że aż tak zielony jesteś.
Jeśli możesz to wstaw swoje zdjęcie, chcę zobaczyć jakiemu ufoludkowi czy Śrekowi pomagam :wink:


Kod: Zaznacz cały

     if (!(P1IN & 0x01)) {        //Detect button pressed
      i=1500;                     //Delay, button debounce 
      do (i--);
      while (i !=0);
      while (!(P1IN & 0x01));     //Wait for the release of the button
   
      i=1500;                     //Delay, button debounce 
      do (i--);
      while (i !=0);

       if (blink_status ==1){     //If LED is blinking, stop it
         P2OUT&= ~ 0x04;          // Turn Led off
         blink_status=0;
       }else 
        blink_status=1;
     }
  }  
W tym fragmencie zmień maskę przycisku i zmienną blink_status na blink_rate. Możesz też wywalić gaszenie LEDa bo przy zmianie prędkości migania jest zbędne.

W pierwszym poście pisałeś, że chcesz rad a nie gotowca. Jeśli nadal tak twierdzisz, to posklejaj kod do kupy, skompiluj żeby sprawdzić czy nie literówek i wklej cały na forum.
Jeśli masz na czym to odrazu sprawdź czy działa.

elektronikopo
Użytkownik
Posty: 182
Rejestracja: 16 gru 2007, 22:28
Lokalizacja: Poznań

Post autor: elektronikopo » 21 mar 2011, 19:03

jaka jest maska przycisku sw2?

Awatar użytkownika
Ertew
Użytkownik
Posty: 1414
Rejestracja: 03 lip 2005, 10:36
Lokalizacja: Leszno
Kontakt:

Post autor: Ertew » 21 mar 2011, 19:14

To już zależy od sprzętu: pod jakie piny masz podłączone poszczególne przyciski.

Zmiany musisz wprowadzić w linijkach konfiguracji

P2DIR |= 0x04; //Configure P2.2 as Output (LED1)
P1DIR &= ~0x01; //Configure P1.0 as Input (S1)

oraz w wykrywaniu przycisku, tutaj zapisanym jako port wejściowy (P1IN) oraz maska pierwszego bitu

P1IN & 0x01

elektronikopo
Użytkownik
Posty: 182
Rejestracja: 16 gru 2007, 22:28
Lokalizacja: Poznań

Post autor: elektronikopo » 21 mar 2011, 19:16

sw2 jest pod pinem P1.1

[ Dodano: 2011-03-21, 19:23 ]
ale ja mam używac sw1 i sw2 to jak zmienie to nie będzie działał sw1

Awatar użytkownika
Ertew
Użytkownik
Posty: 1414
Rejestracja: 03 lip 2005, 10:36
Lokalizacja: Leszno
Kontakt:

Post autor: Ertew » 21 mar 2011, 19:24

No to P1IN & 0x02 powinno pasować.
Teraz skleć z tego program i zobacz czy zadziała.

elektronikopo
Użytkownik
Posty: 182
Rejestracja: 16 gru 2007, 22:28
Lokalizacja: Poznań

Post autor: elektronikopo » 24 mar 2011, 22:40

Kod: Zaznacz cały

#include <msp430xG46x.h>

void main (void){
   unsigned char blink_status=1;
  unsigned char blink_rate=1;
   volatile unsigned int i;

   WDTCTL = WDTPW | WDTHOLD;      //Stop Watchdog Timer
   
   P2DIR |= 0x04;                 //Configure P2.2 as Output (LED1)
   P1DIR &= ~0x01;                //Configure P1.0 as Input (S1)
   P1DIR &= ~0x02;               //Configure P1.0 as Input (S2)
  
   while(1){                      //Infinite loop  
     if (blink_status == 1) { 
     if (blink_rate ==1) {

         P2OUT ^= 0x04;           //Toggle Port P2.2
         i=15000;                 //Delay 
         do (i--);
         while (i !=0);
     }
     else {
       P2OUT ^= 0x04;              //Toggle Port P2.2 
       i=1000; //Delay 
       do (i--); 
       while (i !=0); 
     }
}

     
     if (!(P1IN & 0x01)) {        //Detect button pressed
      i=1500;                     //Delay, button debounce 
      do (i--);
      while (i !=0);
      while (!(P1IN & 0x01));     //Wait for the release of the button
   
      i=1500;                     //Delay, button debounce 
      do (i--);
      while (i !=0);

       if (blink_status ==1){     //If LED is blinking, stop it
         P2OUT&= ~ 0x04;          // Turn Led off
         blink_staus=0;
       }else 
        blink_status=1;
     }

if (!(P1IN & 0x02)) {        //Detect button pressed
      i=1500;                     //Delay, button debounce 
      do (i--);
      while (i !=0);
      while (!(P1IN & 0x02));     //Wait for the release of the button
   
      i=1500;                     //Delay, button debounce 
      do (i--);
      while (i !=0);

       if (blink_rate == 1){ 
         blink_rate=0;
     } 
else { 
        blink_rate=1;
     }

     }
  }   
}
Dobrze?

keruseykaryu

Post autor: keruseykaryu » 26 mar 2011, 20:55

Dobrze?
http://www.iar.com/website1/1.0.1.0/220/1/
Kompilacja. Symulacja. Wnioski. I koniec zawracania tyłka.

elektronikopo
Użytkownik
Posty: 182
Rejestracja: 16 gru 2007, 22:28
Lokalizacja: Poznań

Post autor: elektronikopo » 03 kwie 2011, 13:20

Kod: Zaznacz cały

#include <msp430xG46x.h>     // definicja rejestrow procesora 

void main (void){
   unsigned char blink_status=1;
  unsigned char blink_rate=1;
   volatile unsigned int i;

   WDTCTL = WDTPW | WDTHOLD;      //Stop Watchdog Timer
   
   P2DIR |= 0x04;                 //Configure P2.2 as Output (LED1)
   P1DIR &= ~0x01;                //Configure P1.0 as Input (SW1)
   P1DIR &= ~0x02;               //Configure P1.0 as Input (SW2)
  
   while(1){                      // petla nieskonczona  
     if (blink_status == 1) { 
     if (blink_rate ==1) {

         P2OUT ^= 0x04;           // Zapalenie diody LED1
         i=15000;                 // Pętla opóźniająca
         do (i--);
         while (i !=0);
     }
     else {
       P2OUT ^= 0x04;              // Zapalenie didoy LED1 
       i=1000;                     // Pętla opóźniająca
       do (i--); 
       while (i !=0); 
     }
}

     
     if (!(P1IN & 0x01)) {        // Jesli Sw1 wcisnięty 
      i=1500;                     
      do (i--);
      while (i !=0);
      while (!(P1IN & 0x01));    // oczekiwanie na zwolnienie przyciski 
   
      i=1500;                     
      do (i--);
      while (i !=0);   / opoznienie aż drgania na stykach ustana 

       if (blink_status ==1){    
         P2OUT&= ~ 0x04;      // zgaszenie diody LED1         
         blink_staus=0;
       }else 
        blink_status=1;
     }

if (!(P1IN & 0x02)) {      // Jesli sw2  wcisniety    
      i=1500;                     
      do (i--);
      while (i !=0);
      while (!(P1IN & 0x02));    // oczekiwanie na zwolnienie przycisku 
   
      i=1500;                            
      do (i--);
      while (i !=0);  // opoznienie aż drgania na stykach ustana 

       if (blink_rate == 1){ 
         blink_rate=0;
     } 
else { 
        blink_rate=1;
     }

     }
  }   
}
Może ktoś poprawić mój kod jeśli są błędy?

keruseykaryu

Post autor: keruseykaryu » 03 kwie 2011, 17:33

Może ktoś poprawić mój kod jeśli są błędy?
A symulacja co wskazuje?

elektronikopo
Użytkownik
Posty: 182
Rejestracja: 16 gru 2007, 22:28
Lokalizacja: Poznań

Post autor: elektronikopo » 04 kwie 2011, 10:02

Po skompilowaniu programu, program IAR Embedded Workbench nie wyświetla błędów.
Nie mam możliowści sprawdzenia czy program realizuje swoje zadanie na rzeczywistym układzie MSP430 więc pytam wam. Powodem jest to , że nie ma takowego symulatora układu MPS430. Prosze mi powiedziec czy dobrze zaprogramowałem przycisk SW2.

snow
Użytkownik
Posty: 794
Rejestracja: 16 sty 2007, 3:44
Lokalizacja: lubelskie
Kontakt:

Post autor: snow » 04 kwie 2011, 16:15

Zdaje się że Proteus 7 VSM symuluje MSP430.

keruseykaryu

Post autor: keruseykaryu » 04 kwie 2011, 16:57

snow pisze:Zdaje się że Proteus 7 VSM symuluje MSP430.
IAR też ma symulator.
elektronikopo pisze:Nie mam możliowści sprawdzenia czy program realizuje swoje zadanie na rzeczywistym układzie MSP430 więc pytam wam.
Masz możliwość programowej symulacji w IAR, tylko że bronisz się "ręcami" i nogami by tego nie zrobić. Ale nie, nie. Nikt nie będzie odwalał całej roboty za Ciebie.
Prosze mi powiedziec czy dobrze zaprogramowałem przycisk SW2.
Tego dowiesz się po symulacji.

ODPOWIEDZ