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

[Atmega8][C] Przetwornik A/D

skalsky5000 26 Sty 2010 10:03 1702 4
REKLAMA
  • #1 7593362
    skalsky5000
    Poziom 21  
    Witam. Mam problem z przetwornikiem w Atmega8.Na wyświetlaczu chce wyświetlić zawartość rejestru ADC. Problem jest w liczeniu. Program liczy od 0 do 89 w porządku potem dzieje się coś dziwnego: ...88,89,80,90,91...99,90,91..99,00. Dodatkowo na 1 segmencie cały czas wyświetlana jest cyfra 8.
    Nie mogę sobie poradzić z tym problemem.
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    volatile int cyfra[10] = { 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82,
                        0xf8, 0x80, 0x90 };
    volatile int wysw; 
    volatile int setki;
    volatile int dziesiatki;
    volatile int jednosci;
    volatile unsigned char  mlodszapolowka ,starszapolowka , wynikadc;
    
    
    int main(void)                       
    {
    		DDRD=255;
    		PORTD=255;
    		DDRB=255;
    		ADMUX = (1<<ADLAR)|(1<<REFS0)|(1<<MUX2);     
    		ADCSRA = (1<<ADEN)|(1<<ADIE)|(1<<ADFR)|(1<<ADSC)|(1<<ADPS0)|(1<<ADPS1);
    		TCCR1B |= (1 << WGM12); // tryb CTC
    		OCR1A = 30000; 
    		TCCR1B |= (1 << CS10); 
    		TIMSK |= (1 << OCIE1A); 
    		sei();
    		
      for (;;)
    {
    	wynikadc=~(starszapolowka);
    	jednosci = wynikadc % 10;
    	wynikadc = (wynikadc - jednosci) / 10;
    	dziesiatki = wynikadc % 10;
    	wynikadc = (wynikadc - dziesiatki) / 10;
    	setki= wynikadc % 10;
    }
    return 0;
    }     
    
      
    ISR(ADC_vect)   
    {
    mlodszapolowka = ADCL;
    starszapolowka = ADCH;
    }
    ISR(TIMER1_COMPA_vect)
    {
    	switch(wysw)
    	{
    		case 0:
    		        PORTD = 0b1111110;
    			PORTB=cyfra[setki];
    			wysw++;
    			break;
    			
    		
    
    		case 1:
    		
    			PORTD = 0b1111101;
    			PORTB = cyfra[dziesiatki];
    			wysw++;
    			break;
    		
    		case 2:
    			
    			PORTD = 0b1111011;			
    			PORTB = cyfra[jednosci]; 
    			wysw=0;
    			break;
    			
    	}
    }
    
  • REKLAMA
  • #2 7594245
    Nagus
    Poziom 27  
    Nie chciało ci się nawet wziąć kalkulatora i policzyć czy z tych działań w pętli for jakieś głupoty nie wychodzą...
    Piszesz w c i zamiast użyć na początek banalnej konstrukcji typu:
    uint16_t value = ADC;
    jednostki = value %10;
    value = value / 10;
    i.t.d.
    

    ty stosujesz dziwne metody liczenia na palcach...
  • REKLAMA
  • #3 7594289
    skalsky5000
    Poziom 21  
    Moze i liczę na palcach ale dopiero sie uczę programowania.
  • REKLAMA
  • #5 7625117
    Przemek Elektro
    Poziom 16  
    skalsky5000 napisał:

    #include <avr/io.h>
    {
    	wynikadc=~(starszapolowka);
    	jednosci = wynikadc % 10;
    	wynikadc = (wynikadc - jednosci) / 10;
    	dziesiatki = wynikadc % 10;
    	wynikadc = (wynikadc - dziesiatki) / 10;
    	setki= wynikadc % 10;
    }
    


    Jakoś nie moge zrozumieć co chciałeś osiągnąć, albo masz tam kilka błędów, albo Twoje rozumowanie jest całkowicie błędne i nie ma prawa to działać poprawnie. Policz na kartce co się dzieje w każdej zmiennej, to może zobaczysz skąd się biorą błędy.

    Jak chcesz liczyć "na piechote", to zazwyczaj robi się to odwrotnie (najpierw liczysz setki):
    
                                                               //np dla liczby 157
    setki= wynikadc / 100;                             //setki = 1
    wynikadc = wynikadc - (setki * 100);          //wynik adc = 157 - 1 *100 = 57
    dziesiatki = wynikadc / 10;                        //dziesiatki = 5
    wynikadc = wynikadc - (dziesiatki * 10);     //wynik adc = 57 - 5 * 10 = 7
    jednosci = wynikadc;                               //=7
    
REKLAMA