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

[WinAVR][C] Omija warunek?

nomadp1000 15 Lis 2010 22:06 1150 9
REKLAMA
  • #1 8748759
    nomadp1000
    Poziom 2  
    Witam

    Nie wiem dlaczego program zlicza mimo, że przycisk nie został wciśnięty. Zaraz po uruchomieniu chwile wyświetlane jest 0 a następnie program sam zaczyna liczyć. Co robię nie tak?

    #define F_CPU 4000000L
    #include <avr/io.h>
    #include <util/delay.h>
    
    int8_t i,m, wysw,jednostki,dziesiatki;																
    unsigned char liczba_LED[10]={192,249,164,176,153,146,130,248,128,144};
    	
    	void confIO(void)
    			{
    				DDRB=0xFF;																	
    				PORTB=0xFF;																	
    		
    				DDRD=24;																	
    				PORTD=0x03;																	
    			}
    	
    	
    
    			
    	
    int main(void)
    {
    	confIO();
    	
    	
    	while(1)
    		{
    		_delay_ms(5);
    			wysw++;
    			
    			switch(wysw)
    				{
    					case 1:
    					
    						 {
    							PORTB = liczba_LED[jednostki]; 
    							PORTD=16; 
    							break; 
    						 }
    						 
    					case 2:
    					
    						 {
    							PORTB = liczba_LED[dziesiatki]; 
    							PORTD=8; 
    							break; 
    						 }
    						 
    					case 3:
    					
    						 {
    							wysw = 0; 
    							break; 
    						 }
    					 
    				}
    				
    					if(!(PIND&0x01))
    						
    							
    						{
    							jednostki++;
    							
    
    								if(jednostki==10)
    									{
    										jednostki=0;
    										dziesiatki++;
    
    											if(dziesiatki==10)
    												{
    													dziesiatki=0;
    												}
    												
    									}		
    							
    						}
    		}		
    
    
    }
  • REKLAMA
  • Pomocny post
    #2 8748775
    tadzik85
    Poziom 38  
    Brak oczekiwania na zwolnienie przycisku i eliminacji drgań styków.
  • REKLAMA
  • Pomocny post
    #3 8748886
    czmi3l
    Poziom 14  
    Tutaj i tutaj
    Przestajesz podciągać piny na porcie D które sprawdzasz, a które sam w inicjalizacji podciągnąłeś o tutaj . Piny są w HIZ i odczytuje raz wysoki raz niski stan pewnie :)
  • Pomocny post
    #4 8749288
    hotdog
    Poziom 26  
    Dokładnie tak jak kolega wcześniej napisał. W 99% przypadków do zmiennych takich jak PORTx, PINx,DDRx podchodzi się w sposób bitowy (atomowy). Wyjątek to np kiedy używasz całego portu np jak w twoim przypadku dla multipleksowanego wyświetlacza.

    W tych 99% będziesz chciał pisać:
    PORTx |=(1<<4); // lub 16 zamiast (1<<4)
    PORTx &=~(1<<4); // lub 16 zamiast (1<<4)
    czasami może też:
    PORTx ^=(1<<4); // lub 16 zamiast (1<<4)
  • Pomocny post
    #5 8749291
    bigrom
    Poziom 14  
    Jak chcesz ustawiać lub kasować bity to napisz tak
    PORTD |= 8; // ustawia b3 =1
    PORTD |=16; // ustawia b4 =1
    a jak chcesz skasować bity to tak
    PORTD &=~8; // b3 =0
    PORTD &=~16; // b4 =0

    A najlepiej makro
    #define dBitSet(co,Zm,Msk) if( co ) Zm |=Msk; else Zm &=~Msk

    i wtedy piszesz sobie
    dBitSet( 0, PORTD, 16); // PORTD.4 =0
    dBitSet( 1, PORTD, 16); // PORTD.4 =1
  • Pomocny post
    #6 8749332
    Halkilor
    Poziom 15  
    hotdog napisał:
    do zmiennych takich jak PORTx, PINx,DDRx podchodzi się w sposób bitowy (atomowy)


    Tak dla ścisłości atomowy IMHO nie oznacza dostępu bitowego. Mówimy o jakiejś operacji, że jest atomic (atomowa) jeśli jest niepodzielna, nieprzerywalna.
  • REKLAMA
  • Pomocny post
    #7 8749414
    gaskoin
    Poziom 38  
    ustawianie bitów jest właśnie niepodzielne. Nie da się tego rozbić na dwie instrukcje
  • REKLAMA
  • #8 8749692
    nomadp1000
    Poziom 2  
    dziekuje wszystkim za pomoc, teraz juz wiem jak sie zabrac z a to :-)
  • #9 8749861
    michalko12
    Specjalista - Mikrokontrolery
    gaskoin napisał:
    ustawianie bitów jest właśnie niepodzielne. Nie da się tego rozbić na dwie instrukcje


    Zależy o które bity chodzi i zależy od architektury

    Proste ustawienie dwóch bitów:

    x |= 3;

    => Odczyt, modyfikacja, zapis = min 3 instrukcje

    Jedna prosta instrukcja w C, a przy wielowątkowości (przerwania to też jakieś wątki) może nie jednemu programiście przysporzyć siwych włosów.
  • #10 8750881
    gaskoin
    Poziom 38  
    miałem na myśli samo ustawienie
REKLAMA