logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak w C dla 51' zmienic przypisanie sbit w zaleznosci od var

Bigfoot 28 Cze 2006 14:05 855 2
REKLAMA
  • #1 2771253
    Bigfoot
    Poziom 25  
    Posty: 982
    Pomógł: 74
    Ocena: 13
    Mam taki problem: w ukladzie jest jedna 51'i trzy identyczne zewnetrzne przetworniki AD. Linie danych i CLK sa wspolne, natomiast linie CS sa podlaczone do trzech roznych pinow 51'. Oczywiscie w danym momencie dziala tylko jeden przetwornik, w zaleznosci od wyboru CS1, CS2 lub CS3. Napisalem funkcje, ktora odczytuje wartosci pierwszego AD, wszystko ok. Ale teraz musze napisac jeszcze dwie funkcje do dwoch pozostalych przetwornikow. Beda one prawie identyczne, roznic sie beda tylko definicja pinu sbit CS1 = P0^0 sbit CS2 = P0^1 sbit CS3 = P0^2. Oczywiscie mozna napisac trzy takie same funkcje z trzema roznymi definicjami CS ale czy jest jakis bardziej elegancki sposob, jakas dyrektywa #?, nie wiem, aby juz w samej funkcji (ktora bylaby jedna dla wszystkich trzech przetwornikow) mozna bylo zamieniac przypisanie sbit? Jak uzaleznic od np zmiennej to ktory pin ma nazwe CS?

    teoretycznie widze to tak (oczywiscie pogladowo tylko):
    
    int ReadAD(AD, channel)
    {
    ...
    if (AD == 1)
    	sbit CS = P0^0;
    else if (AD == 2)
    	sbit CS = P0^1;
    else if (AD == 3)
    	sbit CS = P0^2;
    
    (...) i tutaj wlasciwy kod programu, np
    CLK=0; 
    CLK=1;
    CS=0;
    ...
    return(value);
    } 
    


    Program w C (Keil).
  • REKLAMA
  • Pomocny post
    #2 2771502
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Nie , taki numer nie przejdzie ;)
    Etykieta CS jest przypisywana konkretnemu bitowi w czasie kompilacji , a nie w czasie działania programu , więc kompilator będzie się "burzył " ;)
    W Twoim przypadku , kiedy są to sąsiadujące bity jednego portu ,a stan aktywny CS to "0", wystarczy:
    
    void select_cs(unsigned char ADnum)
    {
    P0|=0x07;
    P0&=~(1<<ADnum);//ADnum , to liczba z zakresu 0-2
    }
    

    Gdyby stanem aktywnym CS miało być "1" , to powyższe trzeba "postawić na głowie" ;)

    Piotrek
  • #3 2771627
    Bigfoot
    Poziom 25  
    Posty: 982
    Pomógł: 74
    Ocena: 13
    Rzeczywiscie, mozna i tak - ze od razu na to nie wpadlem :)
REKLAMA