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

2313 + wyświetlacz - AVRStudio - jest ok, w praktyce nie :-(

20rafalo 23 Lip 2009 13:21 1700 10
REKLAMA
  • #1 6813031
    20rafalo
    Poziom 19  
    Witam
    Moje założenie było aby 2313 wyświetlało trzy sekwencje ledów na wyświetlaczu z portów B.. (prościej - 3 litery). W symulatorze AVR Studio jest ok, jednak po podłączeniu, śiecą się diody na porcie D - bez żadnych sekwencji i na dodatek nie te co chciałem.
    Załączam kod:

    #include <avr/io.h>
    #include <avr/delay.h>
    
    int main(void)
    {
    
    for(;;)
    	{
    	PORTB=0x07;
    	DDRD = 1<<6 | 1<<5 | 1<<4 | 1<<3 | 1<<2 | 1<<1 | 1<<0; 
    	/////
    	
        
    	_delay_loop_2(0xffff);
    	PORTD= 1<<1;
    	PORTB= (1<<5 | 1<<4 | 1<<3 | 1<<2 | 1<<1 | 1<<0);
    	_delay_loop_2(0xffff);
    	PORTB= (1<<6 | 1<<4 | 1<<3 );
    	_delay_loop_2(0xffff);
    	
    	}
    
    
    return 0;
    }



    https://obrazki.elektroda.pl/26_1248348408.jpg


    Z góry dziękuję i pozdrawiam

    Dodano po 16 [minuty]:

    Dodam, że dioda jest podłączona tak: minus do układu (PORTB) , plus diody do przez opornik zasilania + 5V
  • REKLAMA
  • #2 6813864
    janbernat
    Poziom 38  
    Czy jest to AT90s2313 czy ATtiny2313?
    To jest "prawie" to samo.
  • REKLAMA
  • #3 6813917
    Brutus_gsm
    Poziom 25  
    Robisz kilka podstawowych błędów. Operując na wyprowadzeniach portów musisz używać funkcji logicznych AND i OR, żeby ustawiać bądź kasować bit.

    Jeśli tego nie robisz, to operujesz na całym porcie. Np.:
     PORTD= 1<<1;
    Ustawiasz jedynkę na PD1, ale jednoczeście 0 na wszystkich innych. Czyli rejestr portu wygląda tak 00000010,a chyba nie o to ci chodziło ;)

    Musisz robić to tak:
    PORTD |= (1<<1);       // ustawianie bitu
    PORTD &= ~(1<<1);        // kasowanie bitu


    Dodatkowo nigdzie w kodzie nie ustawiasz portu B jako wyjściowego, a domyślnie porty są w ustawione jako wyjściowe.
  • #4 6815265
    20rafalo
    Poziom 19  
    #include <avr/io.h>
    #include <avr/delay.h>
    
    int main(void)
    {
    
    for(;;)
    	{
    	DDRD = 0x07;
    	/////
    	
        
    	_delay_loop_2(0xffff);
    	
    		PORTD |= (1<<5 | 1<<4 | 1<<3 | 1<<2 | 1<<1 | 1<<0);
    	_delay_loop_2(0xffff);
    	
    	    PORTD &= (1<<3 | 1<<2 | 1<<1);
    	_delay_loop_2(0xffff);
    	
    	    PORTD &= (1<<5);
    	_delay_loop_2(0xffff);
    	}
    
    
    return 0;
    }
    


    Teraz mi mrygają tylko na porcie PD 0,1,3 - a powinno mieć kilka sekwencji i więcej portów.
    Jak zrobić, aby 6 diod mrógało, potem 3, następnie powtórka
    Co zrobiłem źle?

    Dodano po 4 [minuty]:

    Jest to układ Atiny 2313
  • REKLAMA
  • #5 6815302
    michalko12
    Specjalista - Mikrokontrolery
    Jedziesz po omacku na maksa!. Piszesz o porcie B robisz na porcie D. Piszesz że działa Ci na 0,1,3 a z programu wynika że na 0,1,2.

    Pomyśl i popraw to:

  • #6 6815319
    20rafalo
    Poziom 19  
    źle policzyłem nóżki - PD2 :-)

    Dodano po 1 [minuty]:

    Ten symulator w ogóle się nie sprawdza. Wg niego wszystko gra. Ech!! Całkowicie mi pomieszał.

    W symulatorze Avrstudio mam patrzeć jak się zmienia PIND a ja patrzyłem na PORTD, ech
  • #7 6815363
    michalko12
    Specjalista - Mikrokontrolery
    20rafalo napisał:
    źle policzyłem nużki - PD2 :-)

    Dodano po 1 [minuty]:

    Ten symulator w ogóle się nie sprawdza. Wg niego wszystko gra. Ech!! Całkowicie mi pomieszał.



    nóżki!!!

    Jak ma się ten program do tego co napisałeś:

    Cytat:
    Dodam, że dioda jest podłączona tak: minus do układu (PORTB) , plus diody do przez opornik zasilania + 5V


    Wiesz co ta linijka kodu robi?


     PORTD |= (1<<5 | 1<<4 | 1<<3 | 1<<2 | 1<<1 | 1<<0);



    Ustawia bity 0,1,2,3,4,5 na wysoki poziom (+ ;) )

    Czyli PORTD = 0x3F (0011 1111)

    a wiesz co robi ta linijka kodu:

     PORTD &= (1<<3 | 1<<2 | 1<<1);


    ustawia bity 0,4,5,6,7 portu na niski poziom nie zmieniajac bitów 1,2,3

    czyli PORTD = 0x0E (00001110)

    Symulator na pewno w maliny Cie nie wpuszcza raczej nie potrafisz z niego korzystać, albo nie potrafisz odczytywać rezultatów jego działania.
  • #8 6815413
    20rafalo
    Poziom 19  
    Spójrz :-)

    #include <avr/io.h>
    #include <avr/delay.h>
    
    int main(void)
    {
    
    for(;;)
    	{
    	DDRD =  (1<<6 | 1<<5 | 1<<4 | 1<<3 | 1<<2 | 1<<1 | 1<<0);
    	/////
    	
        
    	_delay_loop_2(0xffff);
    	    PORTD &= ~(1<<6 | 1<<5 | 1<<4 | 1<<3 | 1<<2 | 1<<1 | 1<<0);
    		PORTD |= (1<<5 | 1<<4 | 1<<3 | 1<<2 | 1<<1 | 1<<0);
    		
    	_delay_loop_2(0xffff);
    	    PORTD &= ~(1<<5 | 1<<4 | 1<<3 | 1<<2 | 1<<1 | 1<<0);
    	    PORTD |= (1<<3 | 1<<2 | 1<<1);
    		
    	_delay_loop_2(0xffff);
    	PORTD &= ~(1<<3 | 1<<2 | 1<<1);
    	    PORTD |= (1<<6 |  1<<4 | 1<<3 );
    		
    	_delay_loop_2(0xffff);
    	PORTD &= ~(1<<6 |  1<<4 | 1<<3 );
    	}
    
    
    return 0;
    }
    


    już biegnę wypróbować :-)
  • #9 6815460
    michalko12
    Specjalista - Mikrokontrolery
    Spojrzałem :shocked!:

    #include <avr/io.h>
    #include <avr/delay.h>
    
    int main(void)
    {
    	DDRD =  (1<<6 | 1<<5 | 1<<4 | 1<<3 | 1<<2 | 1<<1 | 1<<0);
    
    	for(;;)
    	{
    			delay_loop_2(0xffff);
    		PORTD = (1<<5 | 1<<4 | 1<<3 | 1<<2 | 1<<1 | 1<<0);
    			_delay_loop_2(0xffff);
    		PORTD = (1<<3 | 1<<2 | 1<<1);
    			_delay_loop_2(0xffff);
    		PORTD = (1<<6 |  1<<4 | 1<<3 );
    			_delay_loop_2(0xffff);
    		PORTD = 0;
    	}
    return 0;
    }
  • REKLAMA
  • #11 6817726
    Brutus_gsm
    Poziom 25  
    Nie masz patrzeć na PINB bo to jest rejestr, w którym pokazuje się stan wejścia procesora. Ustawiasz PORTD jako wyjściowy, to to musisz patrzeć na rejestr PORTD. Ale jak widać z kodu nie rozumiesz niestety jego działania. Nie rób nic "na pałę". Pomyśl trochę co robisz w programie, to naprawdę nie jest trudne. Każdy kiedyś zaczynał ;) Po prostu trochę doczytaj. Proponuję przeanalizować taki prosty programik w AVRStudio. Zobacz jak zmieniają się rejestry. Może coś wywnioskujesz ;)

    
    #include <avr/io.h>
    #include <avr/delay.h> 
    
    int main(void)
    {
       DDRD |= (1<<2); // PD2 jako wyjściowy.
    
       for(;;)
       {
          PORTD |= (1<<2); // PD2 w stanie wysokim (dioda nie świeci)
          _delay_loop_2(0xffff); // pauza
          PORTD &= ~(1<<2); // PD2 w stanie niskim (dioda świeci)
          _delay_loop_2(0xffff);
       }
    return 0;
    }
    
    
REKLAMA