Program DSP

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 DSP

Post autor: elektronikopo » 09 kwie 2011, 15:21

Mam do napisania program w języku C na procesorze tms320c6713. Treść tego programu jest następująca :

- diody mrugają w następującej sekwencji 1110 1101 1011 0111 0111 1011 1101 1110
- opoźnienie mrugania diod zależne jest od stanu przycisków opoznienie= stan przycisków w kodzie binarnym * 0,1s
- jeśli załączymy wszytskie przyciski program ma się zatrzymac na ostatniej sekwencji, a jak odciśniemy ma działać dalej tzn dalej mrugać
- program ma być w funkcji 1sekunda

Kod: Zaznacz cały

#define CHIP_6713 1
#include"konfiguracjacfg.h"
#include <csl.h>
#include <dsk6713.h>
#include <dsk6713_led.h>
#include <dsk6713_dip.h>


unsigned char przel[4]={0,0,0,0};
void main(void)
{
	CSL_init();
    DSK6713_init();
    DSK6713_LED_init();
    DSK6713_DIP_init();
	

	//przel[0]=DSK6713_DIP_get(0);
	//DSK6713_LED_off(0);
	//DSK6713_LED_on(0);
	//DSK6713_LED_toggle(0);

}

void funkcja_1sekunda(void)
{
	DSK6713_LED_toggle(0);
}
- opoźnienie podstawowe 0,1s ustawiamy w programie Code Comboser Studio
ustawiajać DSP/BIOS Config -> open -> PRD -> 100ms jest to czas po którym program wykonuje jedną instrukcje programu czyli w efekcie nasze opoxnienie
- mam to zrobić poprzed zliczanie i sprawdzaniu stanów na przyciskach i jesli jak będzie okreslony warunek program wykonuje następujące sekwencje z odpowiednim opoźnieniem czasowym

sprawdzanie stanów pprzełaczników:

Kod: Zaznacz cały

przel[0]=DSK6713_DIP_get(0);
		przel[1]=DSK6713_DIP_get(1);
		przel[2]=DSK6713_DIP_get(2);
		przel[3]=DSK6713_DIP_get(3);
		p=przel[0]+(przel[1]*2)+(przel[2]*4)+(przel[3]*8);
zliczanie

Kod: Zaznacz cały

x++
Zaczym pisać ten program prosze o wasze rady

keruseykaryu

Post autor: keruseykaryu » 09 kwie 2011, 18:45

Zaczym pisać ten program prosze o wasze rady
Weź się chopie do roboty i pisz ten program. Korzystaj z symulacji, naprawiaj błędy i nie trać czasu na forum.

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

Post autor: elektronikopo » 09 kwie 2011, 22:27

Przedstawiam program , który napisałem

Kod: Zaznacz cały

#define CHIP_6713 1 
#include"konfiguracjacfg.h" 
#include <csl.h> 
#include <dsk6713.h> 
#include <dsk6713_led.h> 
#include <dsk6713_dip.h> 


unsigned char przel[4]={0,0,0,0},a=0,licznik=0,opoz; 
void main(void) 
{ 
    CSL_init(); 
    DSK6713_init(); 
    DSK6713_LED_init(); 
    DSK6713_DIP_init(); 
    

    //przel[0]=DSK6713_DIP_get(0); 
    //DSK6713_LED_off(0); 
    //DSK6713_LED_on(0); 
    //DSK6713_LED_toggle(0); 

} 

void funkcja_1sekunda(void) 
{ 

if( licznik>=opoz && opoz!=0)

{
licznik=0;

a++

if(a==1 ) {
  DSK6713_LED_on(0);    // 1110
  DSK6713_LED_on(1);
  DSK6713_LED_on(2);
  DSK6713_LED_off(3);
		}

if(a ==2 ) {
   DSK6713_LED_on(0);  //1101
   DSK6713_LED_on(1);
   DSK6713_LED_off(2);
   DSK6713_LED_on(3);
		 }
		  
if(a ==3 ) {
 DSK6713_LED_on(0); // 1011
 DSK6713_LED_off(1);
 DSK6713_LED_on(2);
 DSK6713_LED_on(3);
 
		  }
if(a ==4 ) {
  DSK6713_LED_off(0); //0111
  DSK6713_LED_on(1);
  DSK6713_LED_on(2);
  DSK6713_LED_on(3);
  
		   }

if(a ==5 ) {
  DSK6713_LED_off(0); //0111
  DSK6713_LED_on(1);
  DSK6713_LED_on(2);
  DSK6713_LED_on(3);
  
		   }

if(a ==6 ) {
 DSK6713_LED_on(0); // 1011
 DSK6713_LED_off(1);
 DSK6713_LED_on(2);
 DSK6713_LED_on(3);


if(a ==7 ) {
   DSK6713_LED_on(0);  //1101
   DSK6713_LED_on(1);
   DSK6713_LED_off(2);
   DSK6713_LED_on(3);
		 }


if(a ==8)   {  
      DSK6713_LED_on(0);  // 1110
      DSK6713_LED_on(1);
      DSK6713_LED_on(2);
      DSK6713_LED_of(3);
                   a=0;
	  
		    }


}



licznik++;
opoz=DSK6713_DIP_get(0)+DSK6713_DIP_get(1)*2+DSK6713_DIP_get(2)*4+DSK6713_DIP_get(3)*8; 




   
} 
Może mi ktoś powiedzieć co oznacza w kontekście program ten warunek if( licznik>=opoz && opoz!=0) czemu jak licznik jest większy lub równy stanowi na przełaczniakch to program wykonuje pętle if. Prosze o rady

Awatar użytkownika
Aro
Użytkownik
Posty: 677
Rejestracja: 30 paź 2006, 18:49
Lokalizacja: Świerczyniec | Wrocław
Kontakt:

Post autor: Aro » 09 kwie 2011, 23:48

elektronikopo pisze:czemu jak licznik jest większy lub równy stanowi na przełaczniakch to program wykonuje pętle if. Prosze o rady
Odpowiedziałeś sobia na to wcześniej:
elektronikopo pisze:- opoźnienie mrugania diod zależne jest od stanu przycisków opoznienie= stan przycisków w kodzie binarnym * 0,1s
- jeśli załączymy wszytskie przyciski program ma się zatrzymac na ostatniej sekwencji, a jak odciśniemy ma działać dalej tzn dalej mrugać
Przyjrzyj się tej instrukcji:

Kod: Zaznacz cały

opoz=DSK6713_DIP_get(0)+DSK6713_DIP_get(1)*2+DSK6713_DIP_get(2)*4+DSK6713_DIP_get(3)*8;
I powiedz w jakim przypadku opoz = 0?
Następnie popatrz na tą instrukcje if, a dokładnie warunek opoz != 0. Wróć do tego co napisałeś w pierwszym poście i przeczytaj ze zrozumieniem.
Druga sprawa, licznik >= opoz , Popatrz, na dole jest instrukcja licznik++, sprawdź, jak często jest zwiększana ta zmienna? Później zastanów się jakie wartości przyjmuje zmienna opoz. Zauważ też że w ramach tego "if-a" jest zerowana zmienna licznik. Czyli? ...instrukcja warunkowa jest wykonywana raz na pewną liczbę przebiegów pętli, ta pewna liczba = wartość zmiennej opoz. Myślę, że teraz już wszystko będzie jasne.
Na koniec taka mała uwaga: "Przedstawiam program, który napisałem", to zdanie trochę wprowadza błąd, bo sugeruje, że skoro Ty go pisałeś to wiesz co ten program robi, a z dalszej części postu wynika, że jednak jest inaczej. Oj, kończę już bo się czepiam szczegółów;)

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

Post autor: elektronikopo » 10 kwie 2011, 7:45

Kod: Zaznacz cały

opoz=DSK6713_DIP_get(0)+DSK6713_DIP_get(1)*2+DSK6713_DIP_get(2)*4+DSK6713_DIP_get(3)*8;
Ta instrukcja sprawdza stan na przyciskach. Ogólnie rzecz biorać ja mam obliczyć opoźnienie czasowe mrugania diód, ale skoro mamy doczynienia z obiktem PRD, gdzie w ustawieniu DSP/Bios Config mamy ustalony odgórnie czas wykonania jednej instrukcji równy 100ms nie ma potrzebny definiowania czasu podstawoweho 0,1s. Program wykonując kolejne sekwencje przez właśnie obiekt PRD wprowadza opoźnienie podstawowe, które jest mnozone razy stan na przyciskach. Dobrze mówie? może mi ktoś wyjaśni w jaki sposób to się odbywa, bo nie dokońca rozumiem.

Zmienna odpowiedzialna za stan przycisków opoz równa jest zero, gdy wszytskie przełączniki są wcisnięte czyli gdy stan przelacznikow jest równy 1111. Dobrze mówie?
Czy może odwortnie? Moim zdaniem generalnie jest to ten warunek programu, kiedy ma się program zatrzymać na ostatniej sekwencji.

Czyli warunek opoz != 0 oznacza, że program wykonuje kolejne sekwencje w odpowoednim opoźnieniem czasowym gdy wszytskie przełączniki nie są wcisnięte.

Zmienna licznik moim zdaniem zmienna jest często, przed wykoaniem każdej sekwencji
mrugania diód zwiększana jest ta zmienna i sprawdzany jest stan przełaczników. Dobrze myśle? Zminna opoz przyjmuje wartosci od 0 do 15 jest to po prostu stan przełączników w kodzie binarnym.

Własnie nie dokońca rozumiem dlaczego, żeby program mrugał kolejne kombinacja musi być zerowany licznik.

Kod: Zaznacz cały

 Czyli? ...instrukcja warunkowa jest wykonywana raz na pewną liczbę przebiegów pętli, ta pewna liczba = wartość zmiennej opoz. 
Tego fragmentu nie rozumiem. Znaczy to ,że wraz ze zwiększaniem zminnej licznik wykonywana jest instrukcja warunkowa tylko gdy spełniony jest warunek. Dobrze myśle?

Program pisałem na podstawie innego programu, którego nie dokońca rzoumiem. Wszytsko wiem tylko mam problem z tymi warunkami.

Jeszcze jedno dobrze jest ten program napisany?

ODPOWIEDZ