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

[ATmega48]Przetwornik ADC- konwersja po cli()

Łuki Płonka 13 Kwi 2010 19:35 1412 8
REKLAMA
  • #1 7957166
    Łuki Płonka
    Poziom 10  
    Chciałem zapytać czy obsługa przerwań musi być włączona aby można było przeprowadzić konwersję?

    Mam następującą funkcję wyłączającą w moim programie. Chciałbym aby przerwania były wyłączone żeby nie włączało mi przekaźników. Zanim PortD zostanie wyzerowany(wtedy następuje wyłączenie) muszę doprowadzić do odpowiedniej temperatury komorę urządzenia, które steruję. Służy temu sygnał z przetwornika ADC portu 2, dlatego ADMUX=2. Niestety program się wyłącza przed schłodzeniem do pożądanej temperatury.

    
    void wylacz(void)
    
    {
    
    	cli();
    
    	ADCSRA &=~_BV(ADEN);
    
    	PORTD &= 0x08;
    
    	ADMUX = 2;
    
    	ADCSRA |= _BV(ADEN) |_BV(ADSC);
    
    	while (bit_is_clear(ADCSRA,ADIF));
    
    	while (ADCW>350);
    
    	PWM_out(0);
    
    	PORTD = 0x00;
    
    	while(1);
    
    	}
    


    Przetwornik jest wcześniej zainicjowany w main:

    
    ADCSRA = _BV(ADEN)|_BV(ADIE)|_BV(ADATE)|_BV(ADSC)|_BV(ADPS0)|_BV(ADPS1)|_BV(ADPS2);
    
  • REKLAMA
  • #2 7957217
    tadzik85
    Poziom 38  
    2 funkcja while nie ma sensu. Odczytujesz a ADC raz a następnie ciągle sprawdzasz tą wartość ADC. Musisz w każdym kroku pętli odczytać wartość adc i sprawdzać czy jest mniejsza od 350.

    Dodano po 1 [minuty]:

    I ta nieskończona pętla na końcu? Po co?
  • REKLAMA
  • #3 7957237
    Łuki Płonka
    Poziom 10  
    To znaczy, że zawartość tego rejestru nie zmienia się automatycznie w takt przetwornika? Nie do końca rozumiem jak mam to inaczej zrobić. Jak uaktualnić ADCW?

    Dodano po 3 [minuty]:

    Ta nieskończona musi być, bo wyjdzie inaczej z funkcji. Chodzi o to że ustawienie PORTD= 0x00, powoduje odcięcie zasilania przez przerzutnik. Inaczej stan niski by trwał zbyt krótko by się zdążył wyłączyć.
  • REKLAMA
  • #4 7957414
    _Robak_
    Poziom 33  
    Tyle że pętla nieskończona zazwyczaj jest w mainie, teraz wykona raz tą funkcję i na tym działanie programu się kończy.
  • REKLAMA
  • #5 7957436
    Łuki Płonka
    Poziom 10  
    No właśnie o to chodzi, bo to jest funkcja wyłącz.

    Dodano po 7 [minuty]:

    Proszę abyście się skupili na konwersji, chodzi o to, że on omija mi while- przechodzi jak przez masło mimo, że na wejsciu tego przetwornika jest napięcie wyższe niż powinno przejść przez tę pętlę. Pętli nieskończoonej na końcu nie ma, proszę o niej zapomnieć.

    Dodano po 17 [minuty]:

    Czy nadal jestem w trybie freerunning gdy wyzerowałem ADEN ? Czy muszę jeszcze raz zainicjować?
  • #6 7957594
    tadzik85
    Poziom 38  
    Włącz tryb free running to raz.

    Najlepiej 2 funkcje while zrób inaczej wynik przetwarzania porównuj dopiero po zakończeniu przetwarzania.
  • #7 7957642
    Łuki Płonka
    Poziom 10  
    to skoro wyzerował się ADATE, to inne bity też? muszę preskaler na nowo ustawić?
    (W atmega 48 free running załącza się właśnie przez ADATE)
  • #8 7957771
    janbernat
    Poziom 38  
    Ab ovo.
    Cli wyłącza zezwolenie obsługi przerwań- a czym innym jest ustawianie flagi że przerwanie było.
    Jak ponownie włączysz obsługę przerwań- SEI- to zostaną "obsłużone".
    Można kasować poszczególne flagi- jeśli jest to potrzebne- zwykle wpisując 1 do odpowiedniego bitu w odpowiednim rejestrze.
  • #9 7957824
    Łuki Płonka
    Poziom 10  
    Zmieniłem kod na taki:
    
    void wylacz(void)
    {
    	cli();
    	ADCSRA &=~_BV(ADEN);
    	PORTD &= 0x08;
    	ADMUX = 2;
    	ADCSRA |= _BV(ADEN) |_BV(ADSC)|_BV(ADATE);
    	while (bit_is_clear(ADCSRA,ADIF));
    	_delay_ms(50);
    	while (bit_is_clear(ADCSRA,ADIF));
    	while (ADCW>350){
    	while (bit_is_clear(ADCSRA,ADIF));
    	}
    	PWM_out(0);
    	PORTD = 0x00;
    	while(1);
    	}
    
    


    efekt ten sam

    Dodano po 21 [minuty]:

    Ok. Znalazłem błąd.
    Po trostu ze złego portu korzystałem, pomyliło mi się z taklicą w której mam ten port pod dwójką, ale to jest ADMUX 1 :P
    Temat uważam za zamknięty.
REKLAMA