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

Komenda PINx. Jak jej użyć? Czytanie stanu portu uC.

Sand_Man 01 Kwi 2010 12:58 1720 8
REKLAMA
  • #1 7906694
    Sand_Man
    Poziom 11  
    Drodzy forumowicze czy ktoś mógłby wytłumaczyć mi jak należy użyć funkcji PIN w programie, aby sczytać stan na porcie uC.

    Jestem mocno początkujący w programowaniu uC, a chciałbym napisać program sterujący pracą dwóch silników. Założenie jest takie, że pod port B w Atmedze podpiąłem 4 przyciski odpowiadające za kierunki przód, tył, lewo, prawo. A do portu D podpięte są na razie diody symulujące stany na wyjściach uC. Docelowo podpięty będzie tam mostek H. Ale nie mogę jak na razie uporać się sie ze sterowaniem stanami na wyjściu za pomocą przycisków.
    Na razie udało mi sie stworzyć coś takiego, jak wydać funkcja odpowiedzialna za zmianę stanów to if, ale nie wiem czy jest to poprawne.

    Konstruktywna krytyka i wszelkie uwagi mile widziane.


    
    #define F_CPU 1000000L
    #include <avr/io.h>
                  
    
    int main(void)
    {
    
        DDRD = 0xff;
        PORTD = 0xff;		// DIODY
        
    	DDRB = 0xff;
    	PORTB = 0x01;		//Przyciski
    
    while(1)
    { 		
    
    	if(bit_is_set(PORTB, PB3))  
    		{ 
    		PORTD = 0x0f;	 
    		} 
    	else 
    		{ 
    			 
    		}
    	return(0);
    }
    }


    Proszę poprawić temat, reg. pkt 11.1.
    Robak
  • REKLAMA
  • #2 7906707
    _Robak_
    Poziom 33  
    Jeśli dobrze rozumiem ideę programu to powinno być tak
    
    #define F_CPU 1000000L 
    #include <avr/io.h> 
                  
    
    int main(void) 
    { 
    
        DDRD = 0xff; 
        PORTD = 0xff;      // DIODY 
        
       DDRB = 0x00; //wejscia
       PORTB = 0xff;      //pull up
    
    while(1) 
    {        
    
       if(bit_is_set(PINB, PB3))  sprawdz pin3 portu B
          { 
          PORTD = 0x0f;    
          } 
       else 
          { 
              
          } 
       return(0); 
    } 
    }
    
  • #3 7906727
    Sand_Man
    Poziom 11  
    Niestety nie działa :(
  • REKLAMA
  • #4 7906740
    tadzik85
    Poziom 38  
    Return musi znajdować się po pętli while.
  • #5 7906763
    Sand_Man
    Poziom 11  
    Nadal nic. Zamiast na wyjściu dawać stan 0xff to jest 0x0f. Czyli jakby był wciśnięty przycisk. A nawet go nie tknąłem
  • REKLAMA
  • #6 7906783
    tadzik85
    Poziom 38  
    Bo wciśnięcie przycisku podaje na wejście stan niski a w twoim programie nie ma obsługi tego stanu.
  • REKLAMA
  • #7 7906807
    Sand_Man
    Poziom 11  
    OK udało sie rozwiązać problem :)
    Wystarczyło że zanegowałem odczyt z pinu.

    
    #define F_CPU 1000000L 
    #include <avr/io.h> 
                  
    
    int main(void) 
    { 
    
        DDRD = 0xff; 
        PORTD = 0xff;      // DIODY 
        
       DDRB = 0x00; 		//wejscia 
       PORTB = 0xff;      //pull up 
    
    while(1) 
    {        
    
       if(!(bit_is_set(PINB, PB3)))  //sprawdz pin3 portu B 
          { 
          PORTD = 0x0f;    
          } 
       else 
          { 
           PORTD = 0xff;   
          } 
        
    }
     return(0);
    }
    


    Dzięki wielkie za pomoc.

    Dodano po 45 [minuty]:

    Jeszcze jedno pytanie jak sprawić aby uC sprawdzał stany na wszystkich pinach portu B

    Bo napisałem coś takiego:
    
    
    #include <avr/io.h> 
                  
    
    int main(void) 
    { 
    
        DDRD = 0xff; 
        PORTD = 0x00;      // DIODY 
        
       DDRB = 0x00; 		//wejscia 
       PORTB = 0xff;      //pull up 
    
    while(1) 
    {        
    
       if(!(bit_is_set(PINB, PB0)))  
          { 
          PORTD = 0x01;    
          } 
    	
       if(!(bit_is_set(PINB, PB1)))  
          { 
          PORTD = 0x02;
    	  }
    	  
        if(!(bit_is_set(PINB, PB2)))  
          { 
          PORTD = 0x03; 
    	  }
    
        if(!(bit_is_set(PINB, PB3)))   
          { 
          PORTD = 0x04;
    	  }
    
        if(!(bit_is_set(PINB, PB4)))  
          { 
          PORTD = 0x05; 
    	  } 
    
     
    }
    	return(0);
    }
    
    

    Ale nie ma to ani ładu ani składu. Przypuszczam że lepiej rozwiązac to za pomocą funkcji switch. Tylko nie wiem jak uporać sie z tym aby uC sprawdzal stany na wszystkich 5 pinach.
  • #9 7907006
    Sand_Man
    Poziom 11  
    Wiem że kuleje z tym i to mocno, ale z programowaniem uC mam cos wspólnego dopiero od przeszło 2 tygodni:) Do tej pory jedyne co pisałem to proste programiki w stylu wyswietl na monitorze itd. choć elektroniką bawie sie już kilka ładnych lat.
REKLAMA