Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Problem z odczytem dwóch potencjometrów w ATMega

retsef 22 Lis 2007 15:35 3779 24
  • #1 22 Lis 2007 15:35
    retsef
    Poziom 14  

    Witam,

    mam problem sekwencyjnym odczytem z dwóch potencjometrów podpiętych pod konwertery A/C w ATMega88. Nazwijmy potencjometry odpowiednio POT1 i POT2. Problem polega na tym, że jak odczytuje po kolei POT1 i POT2 w przerwaniu wywoływanym co 1ms to czasami wartość POT2 jest kombinowana, to znaczy zależy zarówno od ustawienia POT1 jak i samego POT2. Co ciekawe gdy zamieniłem kolejność odczytu potencjometrów, czyli czytałem najpierw POT2 potem POT1 to efekt znikł, a raczej spodziewałem, się że POT1 będzie wartością kombinowaną. Minął tydzień i sytuacja się powtarza. Tym razem zgodnie z przewidywaniami odczyt POT1 głupieje. Czasami odczytuje się dobrze, a czasami dostaje wartość kombinowaną z obu. Sprawdziłem na oscyloskopie, że na nóżkach scalaka wszystko jest idealnie więc problem leży gdzieś w samym programie. Może źle coć odczytuje?

    Jakby ktoś chciał spytać jako wartość kombinowaną rozumiem, że odczytana wartość zależy od obu potencjometrów to znaczy jak rusze dowolnym to wartość ta będzie się zmieniać przy czym jak zatrzymam to będzie odczytywać cały czas to samo czyli nie jest to pojedynczy przypadek, ale powtarzająca się sprawa - co 1ms dokładnie.

    Załączam wycinki programu.
    Inicjalizacja konwertera A/C:

    Code:

    #include <string.h>
    #include <inttypes.h>
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/iomx8.h>

    signed long   POT1 = 0;
    signed long   POT2 = 0;

    //Procedura inicjalizująca konwertery A/C
    void ADCInit()
    {
       // konfiguracja portów I/O
       DDRC  = 0; // 1 - wyjście
       PORTC = 0; //0b00000000; // 1 - podciągnięte do Vcc
     
       ADMUX |= 0 /*_BV(REFS0) | _BV(REFS1)*/; //zewnetrzne zrodlo odniesienia
       ADMUX |= _BV(ADLAR); // osiem starszych bitow do ADCH
       ADCSRA|= _BV(ADEN); // zezwolenie na konwersje
       ADCSRA|= /*_BV(ADPS0) | */_BV(ADPS1) | _BV(ADPS2); // dzielnik zegara przez 128
       DIDR0 = _BV(ADC0D) | _BV(ADC1D); /*| 1<<ADC2D | 1<<ADC3D | 1<<ADC4D | 1<<ADC5D*/

    }


    Odczyt potencjometrów:
    Code:

    //Procedura odczytująca konwertery A/C
    void ADCRead()
    {   
       // pomiar wartosci potencjometr 2 - ADC1
       ADMUX |= _BV(MUX1);
       ADCSRA|= _BV(ADSC); //start pojedynczej konwersji
       while(bit_is_set(ADCSRA,ADSC)){};
       POT2  = ADCH;
       ADMUX &= ~_BV(MUX1);

       // pomiar wartosci potencjometr 1 - ADC0
       ADMUX |= _BV(MUX0);
       ADCSRA|= _BV(ADSC); //start pojedynczej konwersji
       while(bit_is_set(ADCSRA,ADSC)){};   
       POT1  = ADCH;
       ADMUX &= ~_BV(MUX0);


    }

    0 24
  • #2 22 Lis 2007 19:25
    kasaidolar
    Poziom 19  

    To jest dla Atmegi32 i Atmegi8. Powinno Ci pomoc. Jak nie to wieczorem przyjrze sie Twojemu programowi.

    Code:

             while (1){
                
                // poczatek konwersji 1 - ADMUX = 0bxxxx0000 - wejscie 0
                
                ADCSRA |= _BV(ADSC);                // Rozpoczęcie przetwarzania
                while(bit_is_set(ADCSRA,ADSC)){};   // Oczekiwanie na zakończenie przetwarzania
                   
                ADC_L=ADCL;                        // Zapisanie starszych 8 bitów wyniku konwersji do
                 Waitms(1);
                ADC_H=ADCH;

                pomiar1=ADC_H*256+ADC_L;          // pamietac justowanie 'do lewej' 10 bitowy
                
                Waitms(1);
                
                // poczatek konwersji 2 - ADMUX = 0bxxxx0001 - wejscie 2
                
                ADMUX |= _BV(PC0);                // zmiana wejscia przetwornika czyli ADMUX = 0bxxxx0001
                ADCSRA |= _BV(ADSC);                // Rozpoczęcie przetwarzania
                while(bit_is_set(ADCSRA,ADSC)){};   // Oczekiwanie na zakończenie przetwarzania
                
                ADC_L=ADCL;                        // Zapisanie starszych 8 bitów wyniku konwersji do
                 Waitms(1);
                ADC_H=ADCH;                  
                
                pomiar2=ADC_H*256+ADC_L;               




                
                ADMUX &= ~_BV(PC0);                // zmiana wejscia przetwornika czyli ADMUX = 0bxxxx0000
                
                // poczatek konwersji 3 - ADMUX = 0bxxxx0010 - wejscie 3
                
                ADMUX |= _BV(PC1);                 // zmiana wejscia przetwornika czyli ADMUX = 0bxxxx0010
                
                ADCSRA |= _BV(ADSC);                 // Rozpoczęcie przetwarzania
                while(bit_is_set(ADCSRA,ADSC)){};    // Oczekiwanie na zakończenie przetwarzania
                
                ADC_L=ADCL;                         // Zapisanie starszych 8 bitów wyniku konwersji do
                
                Waitms(1);
                
                ADC_H=ADCH;                  
                
                temperatura=ADC_H*256+ADC_L;
                
                ADMUX &= ~_BV(PC1);                 // zmiana wejscia przetwornika czyli ADMUX = 0bxxxx0000
                
             }




    Dodano po 1 [godziny] 18 [minuty]:

    Wrzuc moze delaya pomiedzy jednym przetwarzaniem a drugim. Daj mu chwile na zczytanie rejestru do zmiennej.
    Napisz czy to cos dalo.

    0
  • #3 22 Lis 2007 22:08
    retsef
    Poziom 14  

    Zaraz się pobawie i zobacze. W między czasie wymyśliłem, żeby odczytywać POT1, POT2, POT2 z czego środkowy pomiar wywalić, ale nie pomogło. Zaraz sprawdze twój program.

    Ile trzeba czekać pomiędzy pomiarami?

    Dla jasnosci sytuacji dorzucam raport z rs232. Ruszam tylko POT1:

    Code:
    { POT1= 0, POT2= 73}
    
    { POT1= 11, POT2= 78}
    { POT1= 21, POT2= 82}
    { POT1= 31, POT2= 88}
    { POT1= 40, POT2= 92}
    { POT1= 51, POT2= 96}
    { POT1= 66, POT2= 100}
    { POT1= 81, POT2= 103}
    { POT1= 98, POT2= 105}
    { POT1= 116, POT2= 107}
    { POT1= 135, POT2= 110}
    { POT1= 162, POT2= 113}
    { POT1= 185, POT2= 121}
    { POT1= 204, POT2= 131}
    { POT1= 227, POT2= 144}
    { POT1= 251, POT2= 159}
    { POT1= 255, POT2= 166}
    { POT1= 254, POT2= 168}
    { POT1= 255, POT2= 169}
    { POT1= 254, POT2= 170}
    { POT1= 254, POT2= 170}
    { POT1= 255, POT2= 170}
    { POT1= 255, POT2= 171}
    { POT1= 255, POT2= 170}
    { POT1= 255, POT2= 170}
    { POT1= 255, POT2= 170}
    { POT1= 255, POT2= 170}
    { POT1= 255, POT2= 170}
    { POT1= 239, POT2= 163}
    { POT1= 210, POT2= 147}
    { POT1= 188, POT2= 133}
    { POT1= 164, POT2= 120}
    { POT1= 134, POT2= 112}
    { POT1= 96, POT2= 106}
    { POT1= 62, POT2= 100}
    { POT1= 39, POT2= 95}
    { POT1= 17, POT2= 87}
    { POT1= 0, POT2= 77}
    { POT1= 0, POT2= 75}
    { POT1= 0, POT2= 74}
    { POT1= 0, POT2= 74}
    { POT1= 0, POT2= 74}
    { POT1= 0, POT2= 74}
    { POT1= 0, POT2= 73}

    0
  • #4 23 Lis 2007 00:54
    kasaidolar
    Poziom 19  

    poczekaj 1ms po zczytaniu POT2 = ADCH; oraz po POT1 = ADCH;

    Ja za chwile sprawdze Twoj program - sie zobaczy ;)

    Dodano po 50 [minuty]:

    hehehe wiem w czym problem :)

    Dodano po 5 [minuty]:

    Nie chodzi o czasy opoznienia :) Twoj program wlacza NIE ADC0 i ADC1 TYLKO ADC1 i ADC2 - Jak piszesz ADMUX |= _BV(MUX0); to ustawiasz jedynke na pozycji zerowej w rejestrze ADMUX co daje 0bxxxx0001 - czyli przetwornik ADC1 (str. 203 do atmegi8) a nie 0bxxxx0000 - dla przetwornika ADC0. I dla kolejnego wejscia robisz ten sam blad.

    Dodano po 4 [minuty]:

    Pisząc ADMUX |= _BV(MUX1); ustawiasz jedynke na 0bxxxx0010 - co daje wejscie ADC2 (a nie ADC1). Program Twoj powinien wygladac tak:

    Code:

    //Procedura odczytująca konwertery A/C
    void ADCRead()
    {   


       // pomiar wartosci potencjometr 1 - ADC0
      // ADMUX |= _BV(MUX0);  // TEGO NIE POWINNO BYC DLA ADC0
       ADCSRA|= _BV(ADSC); //start pojedynczej konwersji
       while(bit_is_set(ADCSRA,ADSC)){};   
       POT1  = ADCH;
     //  ADMUX &= ~_BV(MUX0);


       // pomiar wartosci potencjometr 2 - ADC1
       ADMUX |= _BV(MUX0);  // TO JEST DLA ADC1
       ADCSRA|= _BV(ADSC); //start pojedynczej konwersji
       while(bit_is_set(ADCSRA,ADSC)){};
       POT2  = ADCH;
       ADMUX &= ~_BV(MUX0);



    }




    Dodano po 16 [minuty]:

    I na stronie 242 pdfa do ATMega88 jest to samo napisane

    0
  • #5 23 Lis 2007 09:09
    retsef
    Poziom 14  

    Nie mogę czekać 1ms bo to wieczność, zresztą samo przerwanie wywołuje co 1ms. Potrzebuje mieć 10 wyników po 10ms żeby ustawić serwo.

    Dzięki za te muxy, sprawdze chociaż byłaby to porażka :/ Dziwna sprawa bo miałem już napisać, że naprawiłem to tak:

    Code:

    //Procedura odczytująca konwertery A/C
    void ADCRead()
    {   
       // pomiar wartosci potencjometr 1 - ADC1
       ADMUX |= _BV(MUX0);
       ADCSRA|= _BV(ADSC); //start pojedynczej konwersji
       while(bit_is_set(ADCSRA,ADSC)){};
      delayus(1);
       POT1  = ADCH;
       ADMUX &= ~_BV(MUX0);

       delayus(10);   

       // pomiar wartosci potencjometr 2 - ADC1
       ADMUX |= _BV(MUX1);
       ADCSRA|= _BV(ADSC); //start pojedynczej konwersji
       while(bit_is_set(ADCSRA,ADSC)){};
       delayus(1);
       //POT2  = ADCH; //<-- pomin wynik pomiaru
       
       delayus(10);

       //odczytaj jeszcze raz POT2   
       // pomiar wartosci potencjometr 2 - ADC1
       ADCSRA|= _BV(ADSC); //start pojedynczej konwersji
       while(bit_is_set(ADCSRA,ADSC)){};   
       delayus(1);
       POT2  = ADCH;
       ADMUX &= ~_BV(MUX1);


    }


    czyli poczekaj chwile przed odczytaniem ADCH (nie po) i chwile między odczytami. Dodatkowo dwa razy odczytaj POT2 z czego środkowy odczyt olej. Tak działa. Napisałem osobny program do tego problemu. Jeżeli wywale środkowy pomiar to psuje się najbardziej. Bez odczekania między pomiarami i po while też coś się psuje, ale całe szczęście wystarczy poczekać chwilke. delayus wykonuje poprostu zadana liczbe nopów - co moze nie koniecznie przeklada sie na mikrosekunde ale to niewazne.

    Dodano po 8 [minuty]:

    Sprawdziłem te muxy. Masz racje, wybieram ADC1 i ADC2. Chociaż dziwne, że wczoraj zaczęło działać, wprawdzie z jednego potencjometru odczytuje duży błąd. Czyżby przesłuchy? niby pozostałe nóżki nie idą do masy tylko wiszą w powietrzu, może ADC2 odbiera z ADC1 jak antena przy odczycie z POT2 stąd by też była czasami wartość z obu, jak się dobrze ustawi to odbiera z obu :/ Zrobiłem sobie system bezprzewodowy :D

    0
  • #6 23 Lis 2007 09:27
    kasaidolar
    Poziom 19  

    Tego typu klocki jak atmega sa juz w stodku tak skomplikowane ze trudno zastanawiac sie dlaczego jak nie wlaczyles ADC0 to i tak mial jakis wplyw na ADC1 - tak juz bywa - jak go nie wlaczyles porzadnie to sie nie dziw ze procek dziala dziwnie :) . Grunt ze teraz juz dziala - i program jest napisany dobrze.
    Ciesze sie ze pomogłem :)
    Pozdrawiam serdecznie i sluże pomoca gdyby cos ;)

    0
  • #7 23 Lis 2007 09:35
    retsef
    Poziom 14  

    Sprawdze w domu, te potencjometry steruja serwem, dokladnie odwróconym wahadłem i jakieś głupoty wychodziły, nawet bez samego algorytmu przesuwania biegunów.

    Wczoraj już się załamałem bo napisałem prosty program, który do serwa wysyła tę samą pozycję, którą odczytał, oczywiście po skonwertowaniu odczytu na ustawienie generatora PWM. Wynik był taki, że serwo najpierw pływało a potem uciekało w którąś stronę :/ W sumie tam już samo serwo mogło siać.

    0
  • #8 23 Lis 2007 10:36
    Ch.M.
    Poziom 27  

    Witaj
    Na 90% robisz coś źle...
    1. Spróbuj poustawiać większe przerwy między konwersjami
    2. Po co Ci odczyt serwa co 1ms? Rób je co 10ms a do serwa możesz dostarczać ten sam wynik powielony 10razy.
    3. Zwiększ liczbę konwersji i uśrednij wynik
    4. Wg mnie dostajesz przy pomiarze POT2 wynik (MSB) z POT1... ale tu mogę się mylić bo nie pracuje w C
    5. jeśli jednak to przetwornik nie pracuję zbyt szybko i nienadąża za zmianami to zastosuj trzeci pomiar POT1,5 , który jest spięty do masy.
    Pozdrawiam

    0
  • #9 23 Lis 2007 12:55
    retsef
    Poziom 14  

    mialem duze bledy w odczycie, a potrzebuje miec bardzo dokladne stad pomysl na srednia kroczaca z dziesieciu pomiarow, wynik dostarczam co 10ms stad pomysl zeby odczytywac potencjometry co 1ms. Jeszcze nie spradzalem ale wyglada na to ze odczytuje POT2 z nozki wiszacej w powietrzu stad zbiera dane z obu potencjometrow jak antena.

    Dodano po 30 [minuty]:

    Odczyt musi byc bardzo dokładny ponieważ nowa pozycja wysyłana do serwa opiera się o tę odczytaną. Na razie strasznie wszystko pływa. Mam nadzieje, że to tylko głupi błąd bo już zacząłem wątpić, że to da się zrobić w oparciu o serwo.

    0
  • #10 23 Lis 2007 13:24
    kasaidolar
    Poziom 19  

    Ale juz to zmieniles? Odczytujesz dobre wejscia? Dzialaja Ci w koncu te wejscia przetwornika? A co do wynikow to zawsze powinno sie robic wiecej pomiarow i wyrzucac skrajne i robic srednia. Chyba ze dokladnosc nie jest Ci az tak potrzebna. Jak ja sterowalem potencjometrami serwa i pwm to nie robilem sredniej bo taka dokladnosc nie jest potrzebna.

    Dodano po 41 [sekundy]:

    Masz jakis schemat?

    0
  • #11 23 Lis 2007 15:54
    retsef
    Poziom 14  

    Jeszcze siedze w pracy więc się dzisiaj nie bawiłem. Dokładność musze mieć dużą ponieważ z aktualnej pozycji wyliczam też nową, a całość steruje odwróconym wahadłem. Schemat całości tutaj:
    Problem z odczytem dwóch potencjometrów w ATMega

    Z początku POT2 brałem bezpośrednio z serwa, ale że głupoty wychodziły to dołożyłem drugi nad serwem. Jak można się domyślić jest to samo.

    Rysunek poglądowy całości:
    Problem z odczytem dwóch potencjometrów w ATMega

    0
  • #12 23 Lis 2007 17:12
    kasaidolar
    Poziom 19  

    Tym lpt programujesz tylko tak? A w czym piszesz? Tzn w AVRstudio? Jak juz zrobisz to daj znac

    Dodano po 8 [minuty]:

    Teraz dostalem od Ciebie dopiero wiadomosc z skypa

    Code:

    void ADC_init(void)
    {
       
    // Wybranie wewnętrznego żródła napięcia odniesienia   
       ADMUX |= _BV(REFS0);      
       ADMUX |= _BV(REFS1);
    //   Wybranie sposobu zapisu wyniku z wyrównaniem do lewej (osiem starszych bitów wyniku w rejestrze ADCH)
       ADMUX |= _BV(ADLAR); // To jest jak jest wyrowanie do lewej a jak tego nie ma to do prawej (ADCH i ADCL)      
    // Zezwolenie na konwersję   
       ADCSRA |= _BV(ADEN);      
    // Wybranie częstotliwości dla taktowania przetwornika  (1/8 częstotliwosci zegara kontrolera)
       ADCSRA |= _BV(ADPS0);   
       ADCSRA |= _BV(ADPS1);      
       
    }

    0
  • #13 23 Lis 2007 18:28
    retsef
    Poziom 14  

    LPT programowanie, RS232 wyjscie na hyper terminal, pisze w avrstudio.

    Uff mieliscie racje, czytalem z nozki wiszacej w powietrzu. Ciekawe ze odczyty byly tak dokladne - znaczy byl blad ale nie byl to generator liczb losowych a calkiem sensowne dane, poza tymi sytuacjami gdy nakladaly sie wyniki z dwoch potencjometrow.

    Teraz mam inny problem ale to juz w osobnym poscie.

    Dodano po 56 [minuty]:

    Jakby kogoś interesowało to wrzucilem filmik do nowego postu:
    https://www.elektroda.pl/rtvforum/viewtopic.php?p=4512680#4512680

    0
  • #14 25 Lis 2007 19:01
    kasaidolar
    Poziom 19  

    retsef

    Mam pytanko :) Troche z innej beczki :) Chodzi mi o to LPT - ja programuje takim programatorem pod USB ale potrzebuje jakis szybki programator pod lpt :) I tu moje pytanie - Czy dobrze Ci sie ta atmege programuje przez tak prosty programator ;) Skad masz taki pomysl na programator? Musiales cos instalowac do tego programowania oprócz AVRStudio ?

    0
  • #15 25 Lis 2007 21:00
    retsef
    Poziom 14  

    Pomysl z neta, wystarcza same rezystorki. Teoretycznie nawet bez mozna ale lepiej nie dla bezpieczenstwa LPT. Schematow jest pelno. Tu jakis przyklad na szybko znaleziony:
    Problem z odczytem dwóch potencjometrów w ATMega

    jak wpiszesz w google: atmega very simple programmer albo atmega programmer resistors to powinienes tez do jakiegos dojsc.

    Dziala bardzo dobrze, choc uwazaj z dlugoscia kabla, jest podatny na zaklocenia. Jego alternatywna bardziej stabilna wersja uklad z zatrzaskami. Zaleta samych rezystorkow jest fakt ze mozna je tanio wkomponowac w plytke i zapomniec a zatrzaski juz nie kosztuje po groszu.

    Do programowania uzywam programu ISPPROG:
    http://www.idg.pl/ftp/pc_13008/ISPPROG..html

    Polecalbym takze przyjrzec sie bootloaderowi MEGALOAD, który sam potrzebuje byc skompilowany i wgrany, ale pozniej moze wgrywac program np przez rs232. Jest to zdecydowanie najwygodniejsza forma jezeli przewidujesz duzo zmian.

    0
  • #16 27 Lis 2007 00:53
    retsef
    Poziom 14  

    Qrde powtarza mi sie problem. Raz czytam dobrze, raz czytam jakby z powietrza. Juz poprawilem program wszystko teoretycznie powinno dzialac a tym czasem dostaje w jednym z potencjometrow raz wyniki dobrea a raz z drugiego potencjometru.

    Dolutowalem kondesatory blokujace wszedzie gdzie sie dalo i nadal nic.

    Wywalilem obliczanie sredniej i zmniejszylem czestotliwosc odczytow i nadal jakies glupoty. Zaczynam wariowac a termin oddania pracy zbliza sie nieublaganie :/

    0
  • #17 27 Lis 2007 01:16
    kasaidolar
    Poziom 19  

    Wrzuc program sie zobaczy :)

    0
  • #18 27 Lis 2007 09:16
    retsef
    Poziom 14  

    Po poprawkach procedura wyglada tak:

    Code:

    //Procedura odczytująca konwertery A/C
    void ADCRead()
    {      

       // pomiar wartosci potencjometr 1 - ADC1
       ADMUX |= _BV(MUX0);
       ADCSRA|= _BV(ADSC); //start pojedynczej konwersji
       while(bit_is_set(ADCSRA,ADSC)){};
       delayus(1);   
       POT1  = ADCH;
       ADMUX &= ~_BV(MUX0);

       delayus(10);   

       // pomiar wartosci potencjometr 2 - ADC0
       ADCSRA|= _BV(ADSC); //start pojedynczej konwersji
       while(bit_is_set(ADCSRA,ADSC)){};
       delayus(1);
       POT2  = ADCH;
    }


    Jak zaczalem kombinowac to zmienilem takze inicjalizacje zeby byc pewnym ze wybieram ADC0:

    Code:

    //Procedura inicjalizująca konwertery A/C
    void ADCInit()
    {

       // konfiguracja portów I/O
       DDRC  = 0; // 1 - wyjście
       PORTC = 0; //0b00000000; // 1 - podciągnięte do Vcc
     
       ADMUX = 0 ; //upewnij sie ze w ADMUX jest 0
       ADMUX |= _BV(ADLAR); // osiem starszych bitow do ADCH
       ADCSRA|= _BV(ADEN); // zezwolenie na konwersje
       ADCSRA|=_BV(ADPS1) | _BV(ADPS2); // dzielnik zegara przez 64
       DIDR0 = _BV(ADC0D) | _BV(ADC1D);
    }


    Nie bardzo wiem jak do tego podejsc, wydaje sie jakby wyniki jednak szly z nieba. Jakies pomysly poza przelutowaniem? DIDR0 dobrze inicjalizuje?

    Schemat zaraz dorzuce jak uwzględnie poprawki.

    0
  • #20 27 Lis 2007 10:07
    retsef
    Poziom 14  

    Niby nieużywane nóżki wiszą w powietrzu, teoretycznie założyłem, że nie ma to znaczenia, ale może coś psuje że nie do masy?

    Dodano po 3 [minuty]:

    Czytam tego posta co podesłałeś, przyjrze się plikom .h może gdzieś się ustawiają rejestry źle i czytam znowu nie z tej nóżki.

    Dodano po 14 [minuty]:

    Inna sprawa ze przy potencjometrze nie mam zadnego kondensatora, moze dorzucic jakis 22pF ?

    0
  • #21 27 Lis 2007 10:37
    Ch.M.
    Poziom 27  

    A może potencjometr jest uszkodzony?
    Sprawdz miernikiem jak sie zachowuje przy kręceniu ośką . Inna sprawa pamiętaj, że wejscia wyjścia sa liczone od 0 do 7 nie od 1 do 8. Za te podstawowe rady się nie gniewaj, bo im ktoś dłuzej coś robi tym prostrze błędy może popełnić mimo uwzględnienia złożonych :)
    Pozdrawiam

    0
  • #22 27 Lis 2007 10:38
    retsef
    Poziom 14  

    Potencjometr mam 10k, niby czytam w dokumentacji ze dobry, przez moment zastanawialem sie czy nie za duzy.

    0
  • #23 27 Lis 2007 11:09
    snow
    Poziom 28  

    Ale tu chodzi czy fizycznie jest dobry a nie w dokumentacji. Kondensator na wejściu da ci stabilne wyniki, tyle że te 22pF to trochę mało. Daj ze 100nF albo z 1uF i jakiś opornik (układ RC) to powinno ci zjeść skakanie wyniku na LCD. Pozostałe nóżki nie muszą iść na mase.

    0
  • #24 27 Lis 2007 18:43
    retsef
    Poziom 14  

    Fizycznie dobry bo sprawdzam okresowo na oscyloskopie, patrze co jest na odczepie jak i na nozce od atmegi.

    Dodano po 55 [minuty]:

    Schemat po poprawkach:
    Problem z odczytem dwóch potencjometrów w ATMega

    Dodałem na schemacie kondensatory blokujące C9-C12. Uwzględniłem także kondesatory 1uF C13,C14 przy potencjometrach, których jeszcze nie ma.

    Dodano po 5 [godziny] 58 [minuty]:

    Qrna ale glupi jestem, przeciez blokujace najmniejsze powinny byc z 10nF a ja 22pF wlutowalem :/

    0
  • #25 29 Lis 2007 10:33
    retsef
    Poziom 14  

    Działa!

    Problem były zimne luty, raz stykało a raz nie. Jak nie stykało to brało wyniki z powietrza czyli bezprzewodowo z drugiego potencjometru. A jak stykało to brało odczyt z właściwego potencjometru stąd raz sprawdzałem na oscyloskopie i było dobrze a raz brało wyniki wyraźnie z powietrza.

    0