Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[ATMEGA16][c] - Dekodowanie DCF

mslech 05 Sep 2009 13:51 2438 5
  • #1
    mslech
    Level 9  
    Witam!

    Posiada ktoś program dekodujący sygnał DCF napisany w C?? Przeszukałem całą elektrode + net i nie mogę znaleźć. Chyba dopadła mnie jakaś impotencja umysłowa, a temat jest pilny. Wszystko co znalazłem to tylko BASCOM, a tego języka jeszcze się nie tykałem.

    Jak nie macie to może jakiś punkt zaczepienia do rozpoczęcia proga??

    Program na ATMEGA16, 8MHz, wyś 7 seg.

    Z góry dzięki za pomoc.
  • #3
    mslech
    Level 9  
    kordirko - dzięki za linki.
    A może ma ktoś coś mniej skomplikowanego??
  • #4
    mslech
    Level 9  
    Niestety nie rozumiem tego co dzieje się w programach z linków, dlatego muszę napisać coś prostego sam.
    Napisałem pseudokod według którego moim zdaniem powinno się odbywać dekodowanie sygnału. Liczę na to że mi pomożecie.

    while{(zmienna_pomocnicza=0) do

    -ustawienie portu PD2 (port z INT0) jako wejście
    DDRB=0x00;

    -ustawienie timera

    -ustawienie przerwania zewnętrznego żeby reagował na zbocze wzrastające

    -znalezienie początku transmisji (przerwa pomiędzy impulsami trwa 2s)
    if (zmienna=2) then start dekodowania

    -zwrocenie zdekodowanych wartosci minut i godzin(tylko te dwie wartosci mnie interesuja)

    -koniec detekcji, skok do petli głównej

    zmienna_pomocnicza=1

    Dobrze myślę??
    W jaki sposób zmierzyć długość impulsu?? (przerwanie zewnętrzne ma włączać timer??) Jak wykryć początek impulsu??(1 to impuls trwający od 50 do 150 ms, 0 to impuls 150 do 250 ms), kwarc 8Mhz
  • #5
    psooya
    Level 38  
    Użyj np przerwania INT na 2 zbocza. Pierwszym np wystartuj czy wyzeruj timer a drugim odczytaj jego zawartość. Po czym trzeba by porównać jego wartość i określić czy to 1 czy 0. Możesz np nie zerować timera a zapamiętać jego wartość początkową i końcową i z tych dwóch wyliczyć ile timer zliczył. To jedne z pomysłów :-)
    Pozdrawiam
  • #6
    mslech
    Level 9  
    Czyli np jeżeli chce zmierzyc czas trwania impulsu to robię to tak -

    while(jakis_warunek)
    {
    -ustaw przerwanie na zbocze narastające
    -uruchom timer
    -ustaw przerwanie na zbocze opadające
    -odczytaj timer, wyzeruj rejestry timera
    }

    Czy takie coś zadziała?? Czy jest możliwość skonfigurowania dwóch osobnych przerwań na zbocze narastające i opadające czy za każdym razem muszę je od nowa konfigurować? jeżeli jest taka możliwość to jak to zrobić??
    Czy ta pętla umieszczona jest wewnątrz funkcji czy poza funkcją main??

    Code:

    ISR(INT0_vect)
    {

    int start_DCF=0;
    int licznik_50ms=0;
    int czas_przerwy;

    while(start_DCF==0)
       {
       TCCR0 |= ((1 << CS00)); // Ustawienie timera T0
       TCNT0 = 0; //zerowanie licznika 0
       MCUCR |= (1<<ISC01); //przerwanie wyzwolone zboczem opadającym
       if(TCNT0 >= 160) licznik_50ms++;
         
       
       MCUCR |= ((1<<ISC01)|(1<<ISC00)); //przerwanie wyzwolone zboczem narastającym
       TCCR0 |= ((0<<CS00)|(0<<CS01)|(0<<CS02)); // wyłączenie timera T0
       
       if (licznik_50ms>=30) start_DCF=1;
       
       };


    Czy takie coś ma prawo zadziałać? Jak to zmodyfikować?