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

ATmega32, C, przerwanie ADC

janbernat 21 Sie 2010 11:36 2500 13
  • #1 8421714
    janbernat
    Poziom 38  
    Napisałem programik w celu testowania czasu w przerwaniu ADC.
    
    #include <stdint.h>
    #include <avr/io.h>
    #include <stdlib.h>
    #include <avr/interrupt.h>
    
    int main(void)
    {	
    	sei();
    	DDRB=255;
    	DDRC=255;
        ADMUX = _BV(REFS0)|_BV(REFS1);    
        ADCSRA = _BV(ADEN)|_BV(ADIE)|_BV(ADATE)|_BV(ADPS0)|_BV(ADPS1)|_BV(ADPS2)|_BV(ADSC);   
     	PORTB=255;
    	static int8_t test1;
      while(1)
    	{
    	test1=!test1;
    	PORTC=test1;
    	}
    }
    
    ISR(ADC_vect)
    {
    	static int8_t test;
    
    	test=!test;
    	PORTB=test;
    }
    

    I wszystko dobrze działa- przez minutę, kilka minut- czasem kilkanaście.
    A w pewnym momencie przestaje działać.
    Płytka EVBavr05, kwarc 16MHz, zasilanie części analogowej procesora przez dławik i odsprzężone kondensatorem.
    Watchdog wyłączony.
    Przypadkowy reset chyba nie występuje- na oscyloskopie ani w trybie normal ani single nic nie zauważyłem.
    Co to może być?
  • Pomocny post
    #2 8421739
    _Robak_
    Poziom 33  
    Skoro wywołujesz przerwanie z ADC może warto zczytwać w nim jednak wartości z ADC;) Taka myśl...
  • #3 8421821
    janbernat
    Poziom 38  
    Do wejść kanału 0 ADC jest podpięty potencjometr.
    Tak że w ADCL i ADCH pewnie coś jest.
    Stale to samo- z dokładnością do błędu przetwornika.
    Nigdzie nie spotkałem się z opisem że odczyt z tych rejestrów coś robi- to nie uart.
    Ale sprawdzę.
    Co ciekawe- po paru minutach "przestoju" wszystko się ponownie włącza- znowu na jakiś czas.
  • Pomocny post
    #4 8421839
    _Robak_
    Poziom 33  
    Trochę skąpych informacji udzielasz;) Nie działa to znaczy? Jeśli wszystko stoi to podepnij diodę na port i migaj nią ale za pomocą przerwań, wtedy się przekonamy co tak na prawdę nie działa.
  • #5 8421876
    janbernat
    Poziom 38  
    Jest na stałe wpięty oscyloskop w PORTB0 i PORTC0.
    I diody też.
    I co ciekawe- zgadza się.
    Jak program stanie to te piny są w całkiem przypadkowym położeniu.
    Albo w niskim albo w wysokim.
    Dodałem:
    
    	uint8_t dol;
    	uint8_t gora;
    	dol=ADCL;
    	gora=ADCH;
    

    w przerwaniu.
    Bez zmian.
  • Pomocny post
    #6 8421894
    gaskoin
    Poziom 38  
    o volatile się zapomniało :P

    // no tak w przerwaniu :P

    a ruszasz coś układem? może źle jest cuś przylutowane ?
    Z taktowaniem może też coś nie tak?
    Może z zasilaniem?
    Może to wpływ wiatrów słonecznych ?
  • Pomocny post
    #7 8421895
    _Robak_
    Poziom 33  
    Hmm, ja bym jednak dodał miganie pinem z timerka, chociaż wydaje się że procek idzie w maliny. Jeśli siada wszystko jak wygląda zasilanie? Może tu tkwi problem. Wepnij sondę zaraz przy zasilaniu ustaw wyzwalanie na 4.9V np i sprawdź czy się wyzwoli. Czym taktujesz procesor? Może warto wstawić generator. Ustaw BOR dodatkowo.

    gaskoin, volatile czy nie, chodzi tylko o zczytanie bajtów;)
  • #8 8421916
    mirekk36
    Poziom 42  
    Ja też nie poznaję kolegi :) - i zastanawiam się co to może oznaczać to tajemnicze: "działa przez minutę lub kilkanaście" albo "przestaje działać"

    Może napisz co obserwujesz, a co chciałeś w ogóle uzyskać?

    przecież jeśli masz podłączone diody do portów B i C to będą one po prostu cały czas świecić dla oka ludzkiego ;)
  • #9 8422119
    janbernat
    Poziom 38  
    gaskoin- się nie zapomniało.
    Z volatile to samo.
    Static jest static- przyjmuje przy deklaracji wartość 0 i potem się przepisuje i jest.
    _Robak_ - zasilanie i reset sprawdzałem oscyloskopem przy wyzwalaniu normal i single przy opodającym zboczu i przy ustawieniu poziomu wyzwalania na ok.4.8V.
    Jak napisałem- nic nie ma podejrzanego.
    mirekk36- to że jest to dziwne- to dlatego ten temat.
    A chciałem uzyskać pomiar- ile trwa przerwanie od ADC- łącznie z prologiem i epilogiem.
    I nic więcej.
    104us przy kwarcu 16MHz zmierzyłem.
    mirekk36- odpowiadasz jakbym był początkującym elektronikiem albo zaawansowanym kretynem.
    To że diody sobie swiecą- to widzę.
    Z okresem 1us i 208us- co widzę na oscyloskopie- a nie oczkami.
    Teraz tak- zmieniłem procesor i płytkę- na ZL3AVR.
    Chodzi już z pół godziny- zobaczę co dalej.
    I zacząłem oglądać płytkę EVBavr05.
    I parę rzeczy przestało mi się podobać.
  • Pomocny post
    #10 8422177
    _Robak_
    Poziom 33  
    Jak masz jakiegoś PDFa z widokiem PCB to możesz zamieścić to się przyjrzymy:) To co ze zdjęcia widać, to kwarc trochę daleko sobie siedzi, nie wiem czy płytka jest dwustronna ale na TOP nie widzę kondensatorów przy nogach VCC.
  • Pomocny post
    #11 8422189
    mirekk36
    Poziom 42  
    janbernat ---> eeej no co ty opowiadasz że traktuję cię jak początkującego czy jeszcze gorzej jak piszesz - bzdura! Po prostu wiem też że zaczynasz chyba pisać w C i stąd może jakieś dziwne czy nieoczekiwane dla ciebie rzeczy się dzieją.

    Np dodawanie przydomka volatile do zmiennej static test w przerwaniu nie ma najmniejszego sensu, skoro jest ona wykorzytywana tylko i wyłącznie w tym przerwaniu. Podobnie zresztą ze zmienną test1

    Poza tym - to nie wiem co się stało ale mój post ukazał się dużo wcześniej a tu jakieś dziwne rzeczy
  • #12 8422312
    janbernat
    Poziom 38  
    Schemat i zdjęcia- to szybciej ściągniecie z Propox- EVBavr05.
    A teraz tak- wsadziłem program na płytkę ZL3AVR z BTC.
    Nie lubię tej płytki- bo dedykowana pod jakiś kurs- a nie naprawdę uniwersalna.
    No ale program już chodzi "bez cudów" pół godziny.
    A teraz- co mi się nie podoba na płytce z Propoxu.
    Dławik smd do zasilania AVCC- czyli części analogowej procesora- ma wymiar 0402- ja w takie dławiki nie wierzę.
    Do AREF nie ma żadnego kondensatora.
    Kondensator wlutuję i sprawdzę.
    Ale nie mam dławika o rozsądnych wymiarach- a da się od biedy zmienić na normalny.
    P.S.
    Chodzi normalnie już 40 minut.

    Dodano po 1 [godziny] 22 [minuty]:

    No- i post pod postem.
    W płytce z Propoxu dodałem kondensator 100nF do AVREF.
    Zmieniłem kondensator w AVCC- tak na wszelki wypadek.
    Dławik zwarłem drutem- ale jak zdobędę dławik o normalnych wymiarach to wlutuję.
    Chodzi program na nieco zmienionej płytce z Propoxu już 20 minut- bez żadnych problemów.
    Dzięki wszyskim.
    Myślałem że programator ze mnie d...a- no bo tak jest.
    A to jednak projektanci płytki dali d...
    Ale dlaczego się to tak zachowuje- dalej nie wiem.
    Czy zasilanie części analogowej czy też brak kondensatora na AVREF.
  • #13 8423345
    tmf
    VIP Zasłużony dla elektroda
    Brak kondensatora na AVREF jest bez znaczenia, to tylko wpływa na pływanie odczytów z ADC. Ja obstawiam, że miałeś płytkę z zimnym lutem i twoje działania usunęły problem permanentnie/czasowo.
  • #14 9393012
    janbernat
    Poziom 38  
    Zmieniłem dławik- albo to był dławik smd uszkodzony albo złe lutowanie.
    Po wymianie pomogło.
    Ale co było pierwotnym powodem- nie do sprawdzenia.
REKLAMA