Zegarek na led (atmega8)

Jesli jesteś początkującym elektronikiem, to tu z pewnością znajdziesz pomoc. Miejsce dobre do dyskusji nad podstawami elektroniki w zakresie teorii i praktyki.
davu
-
Posty: 7
Rejestracja: 02 lis 2008, 10:53
Lokalizacja: Nevada
Kontakt:

Zegarek na led (atmega8)

Post autor: davu » 02 lis 2008, 11:08

Witam, niedawno pomyślałem o zrobieniu zegara na atmega8, potem doszło jeszcze do tego budzik i termometr (ds18b20). Przygotowałem na razie schematy i jako taki program. Mam do was prośbę, mógłby ktoś sprawdzić czy te schematy i program są dobre (nie jestem w tym jeszcze za bardzo obeznany). Coś w tym programie jest nie tak z przerwaniami bo nie chce mi się on kompilować, wyskakuje 1 błąd. I jeszcze pytanie, co zrobić z nóżką reset?
Jak potrzeba jeszcze jakichś informacji to proszę pisać.


Obrazek

Obrazek

Obrazek

Obrazek

Kod: Zaznacz cały

' Zegar, termometr, budzik
$crystal = 8000000

Dim Sekjed As Byte
Dim Sekdzies As Byte
Dim Minjed As Byte
Dim Mindzies As Byte
Dim Godzjed As Byte
Dim Godzdzies As Byte
Dim Multi As Byte
Dim Miganie As Bit
Dim Wlaczeniebudzika As Bit
Dim Ustawianie As Byte
Dim Trybustawianiabudzika As Bit
Dim Trybustawianiaczasu As Bit
Dim Uniwers As Byte
Dim Maxi As Byte
Dim Minjedb As Byte
Dim Mindziesb As Byte
Dim Godzjedb As Byte
Dim Godzdziesb As Byte
Dim Alarm As Bit


Dim Odczyttemp As Bit
Dim Ulamek As Byte
Dim Jednosci As Byte
Dim Dziesiatki As Byte
Dim Tmp As Single
Dim Temp As Byte
Dim Odczyt(2) As Byte
Dim T As Integer
Dim Liczba As Byte


Config Portb = &B00111111
Config Portc = &B0111110
Config Portd = &B11111111

Config 1wire = Pinc.0
Config Int0 = Timer , Prescale = 128
Config Timer0 = Timer , Prescale = 8
Enable Interrupts
Enable Int0
Enable Timer0
On Timer0 2ms
On Int0 1s

Sekjed = 0 : Sekdzies = 0 : Minjed = 0 : Mindzies = 0 : Godzjed = 0 : Godzdzies = 0
Uniwers = 4 : Alarm = 0 : Wlaczeniebudzika = 0 : Trybustawianiabudzika = 0
Trybustawianiaczasu = 0


Do

If Odczyttemp = 1 Then
Disable Interrupts

'odczytaj temperaturę


    1wreset                                       'reset
  1wwrite &HCC                                    'jedna kostka, więc wykorzystujemy rozkaz SKIP ROM
  1wwrite &H44                                    'dokonaj konwersji
  Waitms 750                                      'przeczekaj czas konwersji
  1wreset                                         'reset
  1wwrite &HCC                                    'rozkaz adresowy SKIP ROM
  1wwrite &HBE                                    'rozkaz funkcyjny - polecenie odczytu DS18x20

   Odczyt(1) = 1wread(2)
   T = Odczyt(2)
   Shift T , Left , 8
   T = T + Odczyt(1)
   Tmp = T / 16
   Liczba = Int(tmp)
   'oblicz ułamek
  Tmp = Frac(tmp)
  Tmp = Tmp * 10
  Ulamek = Int(tmp)


  Temp = Makebcd(liczba)
  Jednosci = Temp And &B00001111
  Shift Temp , Right , 4
  Dziesiatki = Temp

Enable Interrupts
End If

 Loop : End

1s:
Incr Sekjed

Toggle Miganie
Return

If Pinb.2 = 0 Then
Incr Ustawianie
Else
Ustawianie = 0
End If

If Wlaczeniebudzika = 1 Then
    If Godzdzies = Godzdziesb And Godzjed = Godzjedb And Mindzies = Mindziesb And Minjed = Minjedb Then
      Alarm = 1
End If
    End If

 If Alarm = 1 Then                                'alarm gra 1 sek i nie gra 1 sek
   Toggle Portb.5
   Else
          Portb.5 = 1
End If : Return



2ms:

If Pinb.4 = 0 Then
  Odczyttemp = 1
  Else
  Odczyttemp = 0
  End If

 If Pinb.0 = 1 And Pinb.1 = 1 Then
 Maxi = 100 : Uniwers = 4
 End If

     If Ustawianie = 0 Then
Toggle Trybustawianiabudzika                      '  Wybieranie trybu ustawiania budzika po przytrzymaniu <1s
End If

If Ustawianie = 5 Then                            'Wybieranie ustawiania czasu po przytrzymaniu ok 5s
Toggle Trybustawianiaczasu
End If

If Pinb.3 = 0 Then
   Toggle Wlaczeniebudzika
End If



If Trybustawianiabudzika = 1 Then
    If Pinb.0 = 0 Then
        Decr Uniwers
        End If
       If Uniwers = 0 Then
           Uniwers = Maxi : Maxi = Maxi - 8 : If Maxi < 8 Then Maxi = 8
           End If                                 'coraz szybciej
        Incr Minjedb
         If Minjedb = 10 Then
            Minjedb = 0 : Incr Mindziesb
         End If
         If Mindziesb = 6 Then
            Mindziesb = 0 : Incr Godzjedb
         End If
         If Godzjedb = 10 Then
            Godzjedb = 0 : Incr Godzdziesb
         End If
         If Godzdziesb = 2 And Godzjedb = 4 Then
            Godzdziesb = 0 : Godzjedb = 0
         End If
     If Pinb.1 = 0 Then
        Decr Uniwers
        End If
       If Uniwers = 0 Then
           Uniwers = Maxi : Maxi = Maxi - 8 : If Maxi < 8 Then Maxi = 8
           End If                                 'coraz szybciej
           Incr Godzjedb
           If Godzjedb = 10 Then
            Godzjedb = 0 : Incr Godzdziesb
            End If
          If Godzdziesb = 2 And Godzjedb = 4 Then
            Godzdziesb = 0 : Godzjedb = 0
          End If


If Trybustawianiaczasu = 1 Then
 Miganie = 1

  If Pinb.0 = 0 Then
        Decr Uniwers
        End If
       If Uniwers = 0 Then
           Uniwers = Maxi : Maxi = Maxi - 8 : If Maxi < 8 Then Maxi = 8
           End If                                 'coraz szybciej
        Incr Minjed : Sekjed = 0 : Sekdzies = 0
       End If
  If Pinb.1 = 0 Then
        Decr Uniwers
        End If
       If Uniwers = 0 Then
           Uniwers = Maxi : Maxi = Maxi - 8 : If Maxi < 8 Then Maxi = 8
           End If                                 'coraz szybciej
           Incr Godzjed

End If

If Miganie = 1 Then                               'Część o świeceniu diody
Portc.5 = 0
Else
Portc.5 = 1
End If

If Sekjed = 10 Then                               'Procedury liczenia czasu
   Sekjed = 0 : Incr Sekdzies
End If

If Sekdzies = 6 Then
   Sekdzies = 0 : Incr Minjed
End If

If Minjed = 10 Then
   Minjed = 0 : Incr Mindzies
End If

If Mindzies = 6 Then
   Mindzies = 0 : Incr Godzjed
End If

If Godzjed = 10 Then
   Godzjed = 0 : Incr Godzdzies
End If

If Godzdzies = 2 And Godzjed = 4 Then
   Godzdzies = 0 : Godzjed = 0
End If

Incr Multi
If Multi = 4 Then
   Multi = 0
End If

If Trybustawianiabudzika = 0 Then
Portd = &B11111111

Select Case Multi
Case 0:
       Portd = Lookup(godzdzies , Tabela) : Portc.1 = 0
Case 1:
       Portd = Lookup(godzjed , Tabela) : Portc.2 = 0
Case 2:
       Portd = Lookup(mindzies , Tabela) : Portc.3 = 0
Case 3:
       Portd = Lookup(minjed , Tabela) : If Wlaczeniebudzika = 1 Then Portd.4 = 0 : Portc.4 = 0
End Select
Else
 If Miganie = 1 Then
 Select Case Multi
Case 0:
       Portd = Lookup(godzdziesb , Tabela) : Portc.1 = 0
Case 1:
       Portd = Lookup(godzjedb , Tabela) : Portc.2 = 0
Case 2:
       Portd = Lookup(mindziesb , Tabela) : Portc.3 = 0
Case 3:
       Portd = Lookup(minjedb , Tabela) : If Wlaczeniebudzika = 1 Then Portd.4 = 0 : Portc.4 = 0
End Select
End If
End If

If Odczyttemp = 1 Then

  Select Case Multi
Case 0:
       Portd = Lookup(godzdziesb , Tabela) : Portc.1 = 1
Case 1:
       Portd = Lookup(dziesiatki , Tabela) : Portc.2 = 0
Case 2:
       Portd = Lookup(jednosci , Tabela) : Portd.4 = 0 : Portc.3 = 0
Case 3:
       Portd = Lookup(ulamek , Tabela) : Portc.4 = 0
End Select
End If : Return

Tabela:
Data &B00110000 , &B11111001 , &B01010010 , &B11010000 , &B10011001 , &B10010100 , &B00010100 , &B11110001 , &B00010000 , &B10010000

radekg
-
Posty: 19
Rejestracja: 31 paź 2008, 21:55
Lokalizacja: Pabianice

Re: Zegarek na led (atmega8)

Post autor: radekg » 02 lis 2008, 13:35

Reset podciągnij przez opornik 10 kOhm do VCC.

davu
-
Posty: 7
Rejestracja: 02 lis 2008, 10:53
Lokalizacja: Nevada
Kontakt:

Post autor: davu » 02 lis 2008, 15:23

Ok, poprawiłem to na schemacie. A schemat ogólnie jest dobry??

radekg
-
Posty: 19
Rejestracja: 31 paź 2008, 21:55
Lokalizacja: Pabianice

Post autor: radekg » 02 lis 2008, 18:31

Niestety z braku doświadczenia reszty sprawdzić nie potrafie. Z tego na czym się znam to błędów nie widze.

Powodzenia,
Radek.

davu
-
Posty: 7
Rejestracja: 02 lis 2008, 10:53
Lokalizacja: Nevada
Kontakt:

Post autor: davu » 03 lis 2008, 20:32

Dzięki.

Może ktoś inny sprawdzi ten schemat dokładnie?

Awatar użytkownika
przemotronik
Użytkownik
Posty: 252
Rejestracja: 18 paź 2006, 19:30
Lokalizacja: Wrocław

Post autor: przemotronik » 03 lis 2008, 21:02

1. Napisz, w której linii pokazuje komunikat błędu oraz jaka jest jego treść.
2. Nie pasuje mi zapis napięć na wejściu stabilizatora oraz napięcia zapasowego: wg mnie, zamiast +5V i -5V powinno być +5V i masa (GND); domyślam się, o co chodziło (plus i minus, jak w baterii), ale taki zapis wprowadza w błąd.
3. Dodaj kondensatory elektrolityczne, np. 100uF przed i za stabilizatorem, podobnie daj 100nF ceramika i np. 47uF elektrolita jak najbliżej zasilania uC (tuż przy nóżkach).
4. Wszystkie ścieżki na płytce głównej poprowadziłeś w warstwie po stronie elementów (TOP), tymczasem powinny być w warstwie BOTTOM (niebieskiej). Poza tym płytki bardzo ładne (dodaj otwory montażowe).
5. Zmień wartość kondensatorów C4, C5 - katalog, str. 28:
:arrow: link
podaje wartość 36pF dla niskoczęstotliwościowego kwarcu.
Pozdrawiam,
Przemotronik

Awatar użytkownika
Melon
Użytkownik
Posty: 128
Rejestracja: 20 cze 2008, 15:53
Lokalizacja: Kraków / Jarosław
Kontakt:

Post autor: Melon » 03 lis 2008, 22:29

Jeżeli ja miałbym wrzucić swoje trzy grosze:

PCB) Ścieżki prowadź pod kątem 45 stopni, przy tym zasilaniu widać (+5V, -5V) widać, że masz jakiś inny "niestandardowy". Generalnie, to ma głównie walory estetyczne. Sprawdź też dokładnie jak będziesz doprowadzał zasilanie, ja osobiście preferuję kostkę zaciskową, albo nakładki na piny.

Czy zrobiłeś DRC?

davu
-
Posty: 7
Rejestracja: 02 lis 2008, 10:53
Lokalizacja: Nevada
Kontakt:

Post autor: davu » 04 lis 2008, 18:23

1. Taki błąd:

Kod: Zaznacz cały

Error : 347   Line :   41    External interrupt mode not supported or found in DAT file [TIMER] 
.
Chodzi o linie:

Kod: Zaznacz cały

 Config Int0 = Timer , Prescale = 128 
A dobrze są skonfigurowane przerwania?

2. ok poprawiłem

3. Kondensatory przed i po stabilizatorze już są chyba 100nf. A przy zasilaniu dałem 100nf. Jakie jeszcze potrzeba?

4. Jakoś mi wyszło z tej strony. Gdzie są te otwory?

5. Ok zmieniłem

Melon:
Jest jakaś różnica pomiędzy kontami prowadzenia? Ja chciałem żeby były możliwie najdalej siebie. Jeszcze jedno pytanie... co to jest drc?



Obrazek

Obrazek

Zubik
-
Posty: 31
Rejestracja: 06 lut 2008, 17:23
Lokalizacja: Pogórze
Kontakt:

Post autor: Zubik » 04 lis 2008, 19:34

Witam.
Kod błędu wskazuje na złe skonfigurowanie przerwania INT0. Nie możesz nazwać tego przerwania "Timer" , bo jest to słowo zastrzeżone w języku Bascom, tobie pewni chodziło o licznik timer2 który występuje w ATmega8. W takim przypadku zmiana na

Kod: Zaznacz cały

Config timer2 = timer , async = on , prescale = 128
powinna pomóc.
Aha zmień jeszcze nazwę przerwania od timer2 , na taką która nie kojarzy się z wejściem przerwania INT0.


Pozdrawiam.

Awatar użytkownika
przemotronik
Użytkownik
Posty: 252
Rejestracja: 18 paź 2006, 19:30
Lokalizacja: Wrocław

Post autor: przemotronik » 04 lis 2008, 20:36

davu pisze:3. Kondensatory przed i po stabilizatorze już są chyba 100nf. A przy zasilaniu dałem 100nf. Jakie jeszcze potrzeba?
Dodaj elektrolity 100uF; przed i za stabilizatorem, przy końcówkach zasilania uC oraz najlepiej jeszcze gdzieś w układzie (ważne: w innym miejscu płytki).
davu pisze:Jest jakaś różnica pomiędzy kontami prowadzenia?
Ogólnie chodzi o estetykę i takie "złote zasady" trasowania ścieżek (sory, że uprzedzam Kolegę Melona :wink: )
davu pisze:Ja chciałem żeby były możliwie najdalej siebie.
I powinny być, szczególnie, jeżeli sam trawisz. Można spróbować je porozsuwać.
davu pisze:Jeszcze jedno pytanie... co to jest drc?
To Design Rule Check, czyli predefiniowane zasady tworzenia płytek oraz ich test (podobnie, jak ERC, czyli to samo, ale Electrical). Masz te opcje w toolbarach z lewej (ERC w obydwu oknach, DRC tylko w Board Editorze).
davu pisze:4. Jakoś mi wyszło z tej strony. Gdzie są te otwory?
Otwory powinny być w rogach płytki (na śruby, wrkęty etc.-czyste ułatwienie montażu). Ścieżki na stronie TOP w przypadku płytek jednostronnych to bardzo poważny błąd, bo będą na tej samej stronie, co elementy (powinny być na dole).
Aha, po co dałeś rezystor równolegle do D2?
Pozdrawiam
Ostatnio zmieniony 04 lis 2008, 20:39 przez przemotronik, łącznie zmieniany 1 raz.

davu
-
Posty: 7
Rejestracja: 02 lis 2008, 10:53
Lokalizacja: Nevada
Kontakt:

Post autor: davu » 04 lis 2008, 20:38

Ja w tej linijce próbowałem skonfigurować zewnętrzny rezonator zegarkowy i podzielić żeby wyszło co sekundę.

Awatar użytkownika
joon
Użytkownik
Posty: 2076
Rejestracja: 30 cze 2007, 22:56
Lokalizacja: Kraków, Przemyśl, Warszawa
Kontakt:

Post autor: joon » 04 lis 2008, 20:43

Rezystor równolegle wpięty do D2 służy do ładowania aku...

Awatar użytkownika
Melon
Użytkownik
Posty: 128
Rejestracja: 20 cze 2008, 15:53
Lokalizacja: Kraków / Jarosław
Kontakt:

Post autor: Melon » 04 lis 2008, 22:32

davu pisze: Melon:
Jest jakaś różnica pomiędzy kątami prowadzenia? Ja chciałem żeby były możliwie najdalej siebie. Jeszcze jedno pytanie... co to jest drc?
Generalnie chodzi o estetykę, ale też łatwiej prowadzi się wtedy pozostałe ścieżki, jak masz większy projekt. Obejrzyj sobie płytę główną, tam wszystko jest oparte o 45 stopni lub 90 stopni.

DRC to jest Design Rule Check. Narzędzie to pozwala Ci wychwycić podstawowe błędy (na przykład przecinające się ścieżki różnych sygnałów, albo małe odległości między ścieżkami/padami/otworami).

Polecam samouczek od Eagle'a:
wersja 4.16r
wersja 5.3, ale po niemiecku

alaris
Użytkownik
Posty: 530
Rejestracja: 21 lut 2006, 14:56
Lokalizacja: Gorzow/Poznan

Post autor: alaris » 04 lis 2008, 23:13

przemotronik pisze:Ścieżki na stronie TOP w przypadku płytek jednostronnych to bardzo poważny błąd, bo będą na tej samej stronie, co elementy (powinny być na dole).
Rowniez uwazam, ze tak nie powinno byc, ale jezeli nie chce Ci sie poprawiac, to wydrukuj wersje lustrzana (mirror) sciezek i bedzie dobrze...

davu
-
Posty: 7
Rejestracja: 02 lis 2008, 10:53
Lokalizacja: Nevada
Kontakt:

Post autor: davu » 05 lis 2008, 18:51

Alaris, ostatnio jak robiłem jakiś układ to jak wydrukowałem mirror to musiałem scalaka od dołu lutować, a jak dałem bez mirror to było ok. Termotransferem oczywiście robiłem.

Dobrze kondesatory dałem?:

Obrazek

Obrazek
Ostatnio zmieniony 05 lis 2008, 19:26 przez davu, łącznie zmieniany 1 raz.

ODPOWIEDZ