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

[ATtiny2313][C] Wyświetlacz biegów nie zeruje.

PisorDemet 24 Kwi 2011 21:01 1176 2
REKLAMA
  • #1 9435983
    PisorDemet
    Poziom 12  
    Witam. Napisałem prosty program wyświetlający załączony bieg. Ale niestety jest jakiś problem wyświetlaniem luzu który powinien załączać się gdy nie jest wciśnięty żaden przycisk (załącza się nimi biegi). Jeżeli dodam b=0 gdy nie jest wciśnięty żaden klawisz można złączyć tylko wsteczny czyli działa tylko KEY6. Jeżeli skasuję b=0 działają wszystkie klawisze bardzo bardzo dziwne. Macie jakieś pomysły. W kodzie poniżej nieszczęsna linijka została zaznaczona.

    
    
    #include <avr/io.h>
    #include <util/delay.h>
    
    #define SEG_A (1<<PB6)
    #define SEG_B (1<<PB5)
    #define SEG_C (1<<PB2)
    #define SEG_D (1<<PB0)
    #define SEG_E (1<<PB1)
    #define SEG_F (1<<PB4)
    #define SEG_G (1<<PB3)
    
    
    #define KEY_1 (1<<PD6)
    #define KEY_2 (1<<PD5)
    #define KEY_3 (1<<PD4)
    #define KEY_4 (1<<PD3)
    #define KEY_5 (1<<PD2)
    #define KEY_6 (1<<PD1)
    #define ZEROWANIE PORTB&=~(SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)
    
    uint8_t aktualny_bieg (uint8_t bieg);
    volatile uint8_t b=0;
    uint8_t old_b=0;
    
    volatile uint8_t biegi[] = {
    	(SEG_E | SEG_G | SEG_C), //0-n
    	(SEG_B | SEG_C),		//1
    	(SEG_A | SEG_B | SEG_D | SEG_E | SEG_G), //2
    	(SEG_A | SEG_B | SEG_C | SEG_D | SEG_G), //3
    	(SEG_B | SEG_C | SEG_F | SEG_G),		  //4
    	(SEG_A | SEG_C | SEG_D | SEG_F | SEG_G), //5
    	(SEG_E | SEG_G), //6-r
    	
    	};
    
    int main(void)
    {
    
    	DDRB |= SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G ;             // KIERUNEK SEGMENTÓW WYJSCIOWY
    	PORTB |= ~(SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G) ;            // WYGASZENIE SEGMENTÓW PODCIAGNIECIE SEGMENTOW POD REZYSTOR
    	DDRD &= ~( KEY_1 | KEY_2 | KEY_3 | KEY_4 | KEY_5 | KEY_6 );							// KIERUNEK KLAWISZY WEJSCIOWY
    	PORTD |= KEY_1 | KEY_2 | KEY_3 | KEY_4 | KEY_5 | KEY_6 ;							// PODCIAGNIECIE KALWISZY POD REZYSTOR
    
    	ZEROWANIE;               //test wyswietlacza
    	b=1;
    	PORTB |=  biegi[b];
    	_delay_ms(50);
    	ZEROWANIE;
    	b=2;
    	PORTB |=  biegi[b];
    	_delay_ms(50);
    	ZEROWANIE;
    	b=3;
    	PORTB |=  biegi[b];
    	_delay_ms(50);
    	ZEROWANIE;
    	b=4;
    	PORTB |=  biegi[b];
    	_delay_ms(50);
    	ZEROWANIE;
    	b=5;
    	PORTB |=  biegi[b];
    	_delay_ms(50);
    	ZEROWANIE;
    	b=6;
    	PORTB |=  biegi[b];
    	_delay_ms(50);
    	ZEROWANIE;
    	b=0;
    	PORTB |=  biegi[b];
    	_delay_ms(50);
    	ZEROWANIE;
    	_delay_ms(50);
    
    
    
    
    
    
    
    
        while(1)
        {
    
    
    		 if (aktualny_bieg (KEY_1) )	b=1;    //1
    
    		 if (aktualny_bieg (KEY_2) )	b=2;	//3
    
    		 if (aktualny_bieg (KEY_3) )	b=3;	//5
    
    		 if (aktualny_bieg (KEY_4) )	b=4;	//2
    
    		 if (aktualny_bieg (KEY_5) )	b=5;	//4
    
    		 if (aktualny_bieg (KEY_6) )	b=6;	//r
    
    
    
    		if (old_b != b)																		  //SPRAWDZENIE WARUNKU ZEBY NIE MRUGAL EKRAN JAK JEST TEN SAM BIEG
    			{
    				ZEROWANIE;       //ZEROWANIE WYSWIETLACZA ZEBY NIE BYLO POZOSTALOSCI
    				PORTB |=  biegi[b];																//WYSWIETLANIE NOWEGO BIEGU
    				old_b = b;
    				
    
    			}
    
    		
        }
    }
    
    uint8_t aktualny_bieg(uint8_t bieg)
    {
    
    	if ( ! (PIND & bieg))
    	{
    	_delay_ms(10);                        //niwelacja szumu klawisza
    	if ( ! (PIND & bieg)) return 1;
    
    	}
    b=0;   // ***************************** bez b=0 wszystko działa ale nie zeruje a z b=0 da się włączyć tylko wsteczny bardzo dziwne.
    return 0;
    
    
    
    }
    
    
    
  • REKLAMA
  • Pomocny post
    #2 9436105
    michalko12
    Specjalista - Mikrokontrolery
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    A dlaczego tak a nie inaczej to sam dojdź.
  • #3 9436142
    PisorDemet
    Poziom 12  
    I wszystko jasne. Dzięki serdeczne za pomoc. Śmiga aż miło.
REKLAMA