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

Atmega + C + wyświetlacz LED + dziwne zachowanie

bestmlody 01 Lis 2009 15:52 1538 3
REKLAMA
  • #1 7202126
    bestmlody
    Poziom 14  
    wymyśliłem sobie, że jak wartość wyświetlana spada poniżej 100, to ma nie być wyświetlana pierwsza zero (zamiast 099 ma być 99)
    jeśli wartość spadnie poniżej 10 mają nie być wyświetlane 2 pierwsze pozycje wyświetlacza (zamiast 009 ma być 9)
    Niby proste. Wystarczy na tą pozycje wpisać 10 i cyfra się wygasi.
    Kod jest taki:
    
    ISR(TIMER1_COMPA_vect)
    {
        switch (aktywna_cyfra)
        {
            case 0:
                PORTB |=  (1 << 0); //ustawia bit 0 portu B - włącza wyświetlacz nr 0
                PORTB &= ~(1 << 1); //zeruje bit 1 portu B - wyłącza wyświetlacz nr 1
                PORTB &= ~(1 << 2); //zeruje bit 2 portu B - wyłącza wyświetlacz nr 2
    			
                if (setki==0) setki=10;
                PORTD = cyfra(setki);
                aktywna_cyfra++;
            break;
    
            case 1:
                PORTB &= ~(1 << 0); //zeruje bit 0 portu B - wyłącza wyświetlacz nr 0
                PORTB |=  (1 << 1); //ustawia bit 1 portu B - włącza wyświetlacz nr 1
                PORTB &= ~(1 << 2); //zeruje bit 2 portu B - wyłącza wyświetlacz nr 2
                
                if ((setki==0) & (dziesiatki==0)) dziesiatki=10;
                PORTD = cyfra(dziesiatki);
                aktywna_cyfra++;
            break;
    		
    		case 2:
                PORTB &= ~(1 << 0); //zeruje bit 0 portu B - wyłącza wyświetlacz nr 0
                PORTB &= ~(1 << 1); //zeruje bit 1 portu B - wyłącza wyświetlacz nr 1
                PORTB |=  (1 << 2); //ustawia bit 2 portu B - włącza wyświetlacz nr 2
    			
                PORTD = cyfra(jednosci);
                aktywna_cyfra=0;
            break;
        }
    }

    A jednak problem... Pierwsza cyfra setek wygasza się po przejściu poniżej 100, ale cyfra dziesiątek nie zawsze chce się wyłączyć po przejściu poniżej 10. Nie chce, to znaczy, że raz się wyłączy i na wyświetlaczu raz będzie 4 a raz 04.
    Zauważyłem też, że wygaszona cyfra setek, leciutko pokazuje ostatnia cyfre jedności, może to sprawa wyświetlacza, a może jakiegoś błędu w multipleksowaniu?
    Wyświetlacz to zielone 3 cyfry w jednej obudowie, 12 wyprowadzeń.

    Dodano po 27 [minuty]:

    normalnie problem jak z elektroniki analogowej, raz jest raz nie.
  • REKLAMA
  • #2 7202548
    Krauser
    Poziom 26  
    Problem jest w linii
    if ((setki==0) & (dziesiatki==0)) dziesiatki=10; 

    spróbuj
    if ((setki==0 || setki==10) && (dziesiatki==0)) dziesiatki=10; 

    bo po pierwsze jeśli setki już są równe 10 to dziesiątki nigdy nie zostaną wygaszone. a jedynie w takim przypadku, gdy setki nie zostaną wcześniej sprawdzone. Po drugie w takim przypadku stosuje się operatory logiczne a nie bitowe.
  • REKLAMA
  • #3 7202697
    bestmlody
    Poziom 14  
    Pięknie dziękuje, bo pieknie działa.
    Problem wcale nie "analogowy" :) Przeciez to logiczne, choć z tymi operatorami logicznymi jeszcze nie miałem do czynienia, będe musiał doczytać kiedy się je stosuje.
  • #4 7205184
    bestmlody
    Poziom 14  
    Dla tych co spotkaliby się z takim problemem pokaże jeszcze jedno rozwiązanie. Zastanawiała mnie lekko świecąca cyfra setek. Postanowiłem ją wyłączać a właściwie nie włączać :)
    
    case 0:
             aktywna_cyfra++;
    			
    			if (setki==0) break;
    						
    			PORTB |=  (1 << 0); //ustawia bit 0 portu B - włącza wyświetlacz nr 0
    			PORTB &= ~(1 << 1); //zeruje bit 1 portu B - wyłącza wyświetlacz nr 1
             PORTB &= ~(1 << 2); //zeruje bit 2 portu B - wyłącza wyświetlacz nr 2
    			PORTD = cyfra(setki);
                
            break;
    
    case 1:
             aktywna_cyfra++;
    			
    			if ((setki==0) && (dziesiatki==0)) break;
    			
    			PORTB &= ~(1 << 0); //zeruje bit 0 portu B - wyłącza wyświetlacz nr 0
    			PORTB |=  (1 << 1); //ustawia bit 1 portu B - włącza wyświetlacz nr 1
             PORTB &= ~(1 << 2); //zeruje bit 2 portu B - wyłącza wyświetlacz nr 2
             PORTD = cyfra(dziesiatki);
                
            break;
REKLAMA