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

[atmega8][C] Dzielenie portu

Szaflik 17 Paź 2008 16:25 1221 4
REKLAMA
  • #1 5641083
    Szaflik
    Poziom 20  
    WITAM !!!

    Mam mały problem, a mianowicie:

    mam kawałek kodu sterującego silnikiem krokowym:

    void prawo_caly (int k)
    {	
    	
    	PORTC = 0b1100 ;
    	delay(predkosc) ;
    	PORTC = 0b0110 ;	
    	delay(predkosc);	
    	PORTC = 0b0011;	
    	delay(predkosc);	
    	PORTC = 0b1001 ;
    	delay(predkosc);
    }


    wykorzystane sa tylko 4 bity. na bicie 5 chciał bym niezależnie sterować przekaźnikiem.
    Robie to za pomocą:
    
    PORTC &= ~_BV(5);
    PORTC |= _BV(5);


    I tu mam problem - przy odpalaniu funkcji prawo_caly zmienia mi się stan pinu 5 portu C (zeruje sie). Może mi ktoś powiedzieć co z tym zrobić ? Rozwiązanie jest prawdopodobnie banalne ale nie mogę go wymyślić :/ ;]

    Próbowałem juz maski bitowej - jednak bez powodzenia :/
  • REKLAMA
  • Pomocny post
    #2 5641130
    szelus
    Poziom 34  
    Nie ma innego wyjścia, jak pozmieniać wszystkie zapisy do portu C tak, aby zmieniały tylko potrzebne bity np.
    
        PORTC = (PORTC & 0xf0) | 0b1100;
    
  • REKLAMA
  • Pomocny post
    #3 5641132
    Freddie Chopin
    Specjalista - Mikrokontrolery
    zamiast modyfikowac calosc:

    PORTC = 0b1100 ;

    zmodyfikuj przy uzyciu funkcji logicznych:

    PORTx &= ~((1<<numer bitu do wyzerowania)|(1<<numer innego bitu do wyzerowania));
    PORTx |= (1<<numer bitu do ustawienia)|(1<<numer innego bitu do ustawienia);

    4\/3!!
  • REKLAMA
  • Pomocny post
    #4 5643274
    _StinG_
    Poziom 14  
    Najprostszym sposobem była by funkcja:

    
    void silnik_set(unsigned char *bity)
    {
      for (unsigned char i=0; i<4; i++)
      {
        if (bity[i]==0)
         PORTC &= ~_BV(i);   
        else
          PORTC |= _BV(i);
      }
    }
    


    moze nie jest to najpiękniejsze rozwiązanie ale napisane w 5min ;P
    dalej baw się sam.
REKLAMA