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.

Komparator analogowy w ATmega8515

sygi 14 Wrz 2004 11:18 1125 2
  • #1 14 Wrz 2004 11:18
    sygi
    Poziom 12  

    Potrzebuje zbudować urządzenie które bedzie zliczało czas do momentu gdy mierzone napięcie przekroczy napięcie odniesienia. Więc skorzystałem z Timera1 i oczywiście z komparatora.
    Otóż mój problem polega na tym że komparator nie działa(chyba). Próbowałem zrobić to na 2 sposoby za pomocą kontroli stanu wyjścia komparatora(wyjście ustawione 1 jeżeli napięcie mierzone wieksze od napięcia odniesienia) i za pomocą funkcji zatrzaśnięcia licznika. Obydwa sposoby nie działają.
    Poniżej są wyrwane fragmenty dwóch programów które napisałem dla jednego i drugiego sposobu
    (kompiluje Code Vision AVR)

    /////////////////// 1- kontrola wyjścia komparatora ///////////////////////

    void pomiar(void)
    {
    TCNT1H=0x00; zeruje licznik 1
    TCNT1L=0x00;
    while(ACSR!=0x20); petla dopóki wyjście nie ustawione (1)
    time=TCNT1H; zapis zawartości licznika do zmiennej globalnej
    time<<=8; czas ten póżniej wyświetlam na LCD
    time+=TCNT1L;
    }

    void main(void)
    {


    ....
    TCCR1A=0x00;
    TCCR1B=0x04; preskaler /256
    ACSR=0x00; komparator włączony
    ....

    while(1)
    {
    pomiar();
    }
    }
    ////////////////////////////////////////////

    ////////////////////// 2- funkcja ztrzaśnięcia licznika //////////////////

    void pomiar(void)
    {
    TCNT1H=0x00; zeruje licznik
    TCNT1L=0x00;
    while(TIFR!=0x08); czeka aż zostanie ustawiona flaga ICF1
    time=ICR1H; zapisuje zawartośc rejestru zatrzaskowego do
    time<<=8; zmiennej globalnej która wyswietlam pózniej na LCD
    time+=ICR1L; ;
    }

    void main(void)
    {


    ....
    TCCR1A=0x00;
    TCCR1B=0xC4; preskaler /256 i właczenie funkcji zatrzasniecia licznika
    ICR1H=0x00; zeruje rejestr zatrzaskowy
    ICR1L=0x00;
    ACSR=0x04; właczenie komparatora i funkcji zatrzasniecia licznika
    ....

    while(1)
    {
    pomiar();
    }
    }
    ///////////////////////////////////////////////////////////

    Prosze o jakiekolwiek uwagi, poprawki tych programów, może coś żle rozumuje i te rozwiazania nie beda działac. Może jest jakis inny sposób.
    Myślałem nad uzyciem przerwań ale nie wiem jak sie do tego zabrać. Prosiłbym tez o namiar na jakis dobry darmowy symulator . Z góry dzieki :)

    0 2
  • #2 14 Wrz 2004 21:59
    zysiu
    Poziom 13  

    Jako symulator polecam AVRStudio 4. Sam go uzywam z CodeVision.

    0
  • #3 14 Wrz 2004 23:46
    Dexter77
    Poziom 28  

    Za bardzo w C sie nie orientuje ale nie podobaja mi sie takie linijki:
    time=TCNT1H; zapis zawartości licznika do zmiennej globalnej
    time<<=8; czas ten póżniej wyświetlam na LCD
    time+=TCNT1L;
    W dokumentacji AVR-ow pisza zeby odczyty/wpisy do 16-to bitowych rejestrow I/O dokonywac bez przerw i wylaczac nawet na ten czas przerwania. Jezeli pomiedzy wpisami/odczytami starszej i mlodszej czesci slowa wystapia inne instrukcje to dane wpisane/odczytane beda bledne.
    Pozdro
    Dexter

    0
  Szukaj w 5mln produktów