Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Zegar AVR/PCF

Redok 14 May 2004 21:06 2577 3
  • #1
    Redok
    Level 13  
    JAk by ktos mial schemat zegarka na AVR wraz z programen...i by udostepnił to bym byl bardzo wdzieczny!!!!!Wielkie dzieki z gory!!1
  • #2
    koval_s
    Level 17  
    Podaj więcej szczegułów co do zegarka, ja używam DS1307 i mam go oprogramowanego
  • #3
    adi-niunio
    Level 23  
    podziękuj redakcjii edw bo listingi są ich.

    zakłądam ze urzywasz bascom avr

    inne listingi do pobrania ze strony edw są to programy testowe do oślej łączki z kursu avr


    'C018b Prosty zegar z budzikiem
    Dim Sekundy As Byte , Minuty As Byte , Godziny As Byte , Uniwers As Byte
    Dim Sekjed As Byte , Sekdzies As Byte , Minjed As Byte , Mindzies As Byte
    Dim Godzjed As Byte , Godzdzies As Byte , Mux As Byte , Migaj As Bit , Maxi As Byte
    Dim Godzinyb As Byte , Minutyb As Byte , Trybustawbudzika As Bit , Wlaczeniebudzika As Bit
    Dim Przyciski As Byte , Minut As Byte , Godz As Byte , Klawisz As Byte , Pomoc As Bit
    Dim Dzwiek As Bit , Mux1 As Byte , Blokada As Byte , Blok1 As Bit , Blok As Bit
    Const Powrot = 3 ' czas automatycznego powrotu z trybu ustawiania budzenia
    Config Portb = 255 : Portb = 255 : Config Portd = &B1111100 : Portd = &B1111111
    Config Timer0 = Timer , Prescale = 64 : Config Timer1 = Timer , Prescale = 64
    Enable Interrupts : Enable Timer0 : Enable Timer1 'odblokowanie przerwań
    On Timer0 Co4ms : On Timer1 Co1s 'po przepełnieniu liczników skocz
    Maxi = 100 : Blokada = 10 : Klawisz = 1 : Wlaczeniebudzika = 1 'wartości początkowe
    Godziny = 22 : Minuty = 18 : Godzinyb = 22 : Minutyb = 19 'po minucie pracy włączy alarm

    Do : Loop : End 'to jest główny program - pusta nieskończona pętla

    Co1s: 'co 1 sekundę
    Load Timer1 , 62500 : Incr Sekundy : Toggle Migaj 'standardowe odliczanie 1 sekundy
    If Minuty = Minutyb And Godziny = Godzinyb Then 'przez minutę w porze budzenia
    If Wlaczeniebudzika = 1 Then 'gdy budzik ma dzwonić
    Wlaczeniebudzika = 0 'jednorazowe budzenie
    Dzwiek = 1 'włączenie alarmu
    Blok = 1 'żeby kasowanie alarmu nie zmieniało wskazań zegara
    Blokada = 10 'przyciski zostaną zablokowane na 10s,
    End If 'przez wpisanie "nadmiernego" opóźnienia do zmiennej Uniwers
    Else
    Dzwiek = 0 'zawsze, gdy nie jest pora budzenia
    Blok = 0 'wyłącz dźwięk, zeruj flagę pomocniczą blokady
    End If
    ' przez czas 10 sekund po każdym ręcznym wyłączeniu alarmu przyciski mają być zablokowane
    ' problem w tym, że ten czas 10s może wyjść poza minutę alarmu, dlatego
    ' poniższa procedura nie może być zawarta w poprzedniej:
    If Blok1 = 1 Then 'zablokowanie możliwości zmian czasu
    Uniwers = 255 'przyciski w ogóle nie reagują bo 255*4,096ms= 1,26sekundy
    Decr Blokada ' wcześniej było: Blokada=10
    If Blokada = 0 Then ' więc po 10 sekundach
    Blok = 0 'znów normalna praca przycisków
    Blok1 = 0 'bo za sekundę zostanie ustawiona wartosć Uniwers=40
    End If ' a nie Uniwers=255
    Else 'w czasie, gdy klawisze nie są zablokowane
    Uniwers = 40 'ustawia standardowy czas opóźnienia reakcji przycisku
    If Przyciski = 0 Then 'jeśli naciśnięte oba przyciski S1, S2
    If Trybustawbudzika = 0 Then ' w trybie wskazywania czasu bieżącego
    If Pomoc = 1 Then Trybustawbudzika = 1 'po sekundzie zwłoki przechodzi w tryb
    Pomoc = 1 ' ustawiania budzika
    Else 'w trybie ustawiania czasu budzenia
    Toggle Wlaczeniebudzika 'załącz/wyłącz budzenie
    End If ' co będzie sygnalizowane potem zaświeceniem prawej kropki
    Else
    Pomoc = 0 'gdy nie są przciśnięte S1+S2, zeruje
    End If ' bit pomocniczy opóźnienia o sekundę reakcji sa S1+S2
    End If
    'poniżej procedura automatycznego wychodzenie z trybu ustawiania budzika
    Decr Klawisz 'zmniejsz zawartość licznika Klawisz od Powrot do zera
    If Klawisz = 0 Then Trybustawbudzika = 0 'wychodzi z trybu ustawiania budzika
    Return 'koniec procedury Co1s

    Co4ms: 'obsługa przerwania od T/C0 co 4,096ms
    If Blok = 1 And Dzwiek = 0 Then '4ms po każdym ręcznym wyłączeniu alarmu
    Blok1 = 1 ' blokowana jest możliwość zmian czasu
    Uniwers = 255 'przez wpisanie "nadmiernego" opóźnienia
    End If 'i tak będzie przez 10s - patrz wyżej

    Przyciski = Pind And 3
    Select Case Przyciski
    Case 0: 'naciśnięte oba S1, S2
    Klawisz = Powrot 'każde naciśnięcie dowolnego przycisku odświeża wartość Klawisz
    Dzwiek = 0 'inne procedury zrealizowane w procedurze Co1s

    Case 1: 'naciśnięty tylko S2 - minuty
    Decr Uniwers
    Klawisz = Powrot
    Dzwiek = 0
    If Uniwers = 0 Then
    Uniwers = Maxi : Maxi = Maxi - 8 : If Maxi < 8 Then Maxi = 8 'coraz szybciej
    If Trybustawbudzika = 1 Then 'w trybie ustawiania budzika
    Incr Minutyb 'zwiększ minuty budzenia
    Else ' w trybie zegara
    Incr Minuty : Sekundy = 0 'zwiększ licznik minut i wyzeruj sekundy
    End If
    End If
    Case 2: 'naciśnięty tylko S1 - godziny
    Decr Uniwers
    Klawisz = Powrot
    Dzwiek = 0
    If Uniwers = 0 Then
    Uniwers = Maxi : Maxi = Maxi - 8 : If Maxi < 8 Then Maxi = 8 'coraz szybciej
    If Trybustawbudzika = 1 Then 'w trybie ustawiania budzika
    Incr Godzinyb 'zwiększ godziny budzenia
    Else ' w trybie zegara
    Incr Godziny 'zwiększ licznik godzin
    End If
    End If
    Case 3: ' w spoczynku
    Maxi = 100
    End Select

    ' co 4ms sprawdzamy i korygujemy stany liczników
    If Sekundy = 60 Then 'skróc cykl licznika sekund: 0...59 , itd...
    Sekundy = 0 : Incr Minuty
    End If 'tym razem nie zagnieżdzamy procedur sprawdzania,
    If Minuty = 60 Then ' - zagnieżdżenie spowodowałoby błędy podczas
    Minuty = 0 : Incr Godziny ' ustawiania zegara
    End If '
    If Godziny = 24 Then '
    Godziny = 0
    End If
    If Minutyb = 60 Then ' - zagnieżdżenie spowodowałoby błędy podczas
    Minutyb = 0 : Incr Godzinyb ' ustawiania zegara
    End If '
    If Godzinyb = 24 Then '
    Godzinyb = 0
    End If

    Incr Mux 'obsługa wyświetlaczy jest teraz bardziej skomplikowana:
    If Trybustawbudzika = 1 Then 'w trybie budzenia
    Minut = Minutyb 'do zmiennych pomocniczych Minut i Godz
    Godz = Godzinyb 'wpisujemy rzecz jasna czas budzenia
    Mux = Mux And &B111 'w efekcie liczy 0...7
    Else 'przy normalnej pracy
    Minut = Minuty 'będzie wyświetlony czas bieżący
    Godz = Godziny
    Mux = Mux And &B11 'w efekcie liczy 0...3
    End If
    'teraz zamieniamy liczby dwójkowe na BCD
    Mindzies = Makebcd(minut) 'zamieniamy liczbę dwójkową na BCD
    Minjed = Mindzies And 15 'przez polecenie AND i maskę &B00001111 = 15
    'uzyskujemy tylko cztery młodsze bity, czyli jednostki minut
    Shift Mindzies , Right , 4 'przesuwając w prawo usuwany 4 młodsze bity
    'pozostają dziesiątki minut w czterech młodszych bitach
    'a w czterech starszych są zera - tak przecież działa polecenie SHIFT
    Godzdzies = Makebcd(godz) 'zamieniamy liczbę dwójkową na BCD
    Godzjed = Godzdzies And 15 'uzyskujemy tylko cztery młodsze bity - jednostki
    Shift Godzdzies , Right , 4 'przesuwając w prawo usuwany 4 młodsze bity
    'teraz wyświetlamy jedną cyfrę na wyświetlaczu:
    Portd = &B1111111 'wygaś wszystko
    Select Case Mux ' obsługa wyświetlacza
    Case 0: 'wyświetl zawartość licznika jednostek minut
    Portb = Lookup(minjed , Tabela) : Portd.3 = 0 : Portb.7 = Not Wlaczeniebudzika
    Case 1: 'wyświetl zawartość licznika dziesiątek minut
    Portb = Lookup(mindzies , Tabela) : Portd.4 = 0
    Case 2: 'wyświetl zawartość licznika jednostek godzin
    Portb = Lookup(godzjed , Tabela) : Portd.5 = 0 : Portb.7 = Migaj 'ew. włącz punkt dziesiętny
    Case 3: 'wyświetl zawartość licznika dziesiatek godzin
    Portb = Lookup(godzdzies , Tabela) : Portd.6 = 0
    End Select

    If Dzwiek = 1 Then Portd.2 = Migaj 'i daje przerywany sygnał dźwiękowy

    Return 'koniec obsługi przerwania od T/C0 co 4,096ms

    Tabela:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144
  • #4
    Redok
    Level 13  
    a jakis schemat do tego???chodzi mi o zegarek na pCF-ce