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

[ATmega8][BASCOM] Sekundnik

hubertfab 27 Wrz 2008 12:17 4475 20
  • #1 5575959
    hubertfab
    Poziom 21  
    Wiatm.
    Posiadam ATmega8 i Wyś. LCD 16x2 (BIG).
    Znudziło mi się wyświetlanie tekstu bez sensu więc chciałem sobie zbudować urządzenie do zliczania sekund tylko, że nie mogę sobie poradzić z tymi przerwaniami.

    Więc proszę was o napisanie mi takiego programiku który by działał następująco.
    Podłączam zasilanie i zaczyna odmierzać czas po sekundzie i wyświetlać go na LCD.

    PS: Wiem, że to nie jest proste ale oddaję za to ok.700 punktów i kliki w pomógł.

    Program w BASCOM
    ATmega bez kwarcu (1MHz)

    Poprawiłem tytuł i zmieniłem dział
    [zumek]
  • #4 5576099
    bb5
    Poziom 15  
    Może tak: skoro Waitms 1000 = 3,5 sec to 1 sec = Waitms 286. Spróbuj ale nie jestem pewien
  • #5 5576128
    hubertfab
    Poziom 21  
    Może i tak ale jak ale jak dołożę jedno polecenie więcej to już się zmieni znacznie i nie będzie działało tak jak powinno.

    Proszę o program na timerze.
    PS: bb5 umiesz te przerwania? jak tak to napisz program za 700 pkt.
  • #6 5576146
    K.Krzysztof
    Poziom 12  
    Witam
    Panowie, nie róbcie Hubertowi wody z . . .
    Hubercie - jeżeli zegar ma być dokładny to procek powinien być sterowany kwarcem a nie wewn. generatorem RC. Żadne przerwania tu niczego nie zmienią, choć można ten wymóg obejść używając zegara rtc na szynie i2c (np PCF8583) -ale to komplikacja i sprzętowa i programowa.
    Pozdrawiam
  • #8 5576269
    K.Krzysztof
    Poziom 12  
    Ponownie ja
    Trochę mnie martwi fakt że wiedzę o tak elementarnych (w tym zakresie ) sprawach chcesz zdobyć z podpowiedzi przez internet.
    Jest bardzo dużo literatury na temat programowania up. Nie tylko w postaci książek. Bardzo gorąco polecam Ci cykl artykułów w EDw pt "up Ośla łączka". Krok po kroku ,przykład po przykładzie od najprostszych (gasimy i zapalamy leda) po dosyć złożone (częstościomierz, centralka alarmowa itp).
    A teraz do rzeczy.
    Po podłączeniu prawidłowym kwarcu do odpowiednich nóżek up , trzeba atmegę poinformować o tym, że od teraz będzie sterowana nie wewnętrznym generatorem RC , lecz zewnętrznym kwarcem o częstotliwości Fx.
    Ustawia się to w tzw. Fuse bitach.
    Jeżeli programujesz w Bascomie to domyślam się że programy wpisujesz programatorem typu ISP. Jeżeli tak jest to bardzo dokładnie opisane jest to tu :
    http://elportal.pl/index.php?module=ContentExpress&func=display&ceid=243
    właśnie na przykładzie atmegi 8.

    Popatrz, poczytaj 3 razy dokładnie, jeżeli czegoś nie zrozumiesz - wtedy pytaj i nie rób w fuse bitach niczego na oślep. Łatwo stracić kontrolę nad procesorem.

    powodzenia
  • #9 5576432
    hubertfab
    Poziom 21  
    Program wprowadzam do AT8 BASCOM-AVR tym samym co piszę programy.

    Ustawiłem 8MHz wewnętrzny generator.
    Teraz to 8razy lepiej wyświetla LCD :D

    Zrobiłem ten układ na Waitms tylko nie wiem jak obliczyć o ile przestawić jeśli w godzinę zwalnia o 1sekundę :D

    Dodano po 2 [minuty]:

    A teraz ustawiłem fuse bity na 8 MHz tylko, że kwarc i 2 kondensatory 33pF.
  • #10 5576500
    rrata
    Poziom 19  
    Skoro ma być dokładny to nie widzę innej możliwości niż użycie kwarcu zegarkowego. Albo z użyciem układu pcf, albo podłączając kwarc do TOSC1 i TOSC2.
  • #11 5576606
    hubertfab
    Poziom 21  
    To powiedz jak to zrobić.
    Mam zegarek cyfrowy więc i kwarc tam jest :D

    Gdzie podłączyć kwarc sam czy nie ?? No i oczywiście programik BASCOM albo wskazówki do napisania.

    Nagroda aktualna. :>
  • #13 5576660
    rrata
    Poziom 19  
    Używasz kwarcu zegarkowego 32768 Hz podłączając go do TOSC1 i TOSC2. Program ma wyglądać mniej więcej tak:
    -ustawiasz bit AS2 w rejestrze ASSR (taktujesz licznik 2 kwarcem)
    -ustawiasz bity CS20 i CS22 w TCCR2 (preskaler 128, wtedy będzie generować przerwania co sekundę)
    -ustawiasz bit TOIE2 w TIMSK (zezwalasz na przerwania z tego licznika)
    -uruchamiasz globalne przerwania (sei)
    -piszesz procedurę obsługi tegoż przerwania

    Oczywiście procesor taktujesz wewnętrznym oscylatorem, ponieważ odpowiednie wyprowadzenia już są zajęte przez kwarc zegarkowy. Do kwarcu trzeba pewnie jakieś kondensatory podłączyć, bo ja zrobiłem dwa zegary w ten sposób bez kondensatorów i błąd wynosił 4sek na godzinę.

    Jak ten program będzie wyglądał w bascomie to nie wiem bo go nie znam.
  • #14 5576694
    tehaceole

    Poziom 28  
    To część programu do obsługi pewnego sterownika. Jest tam to co Cie interesuje.

    $regfile = "m8def.dat"
    
    $crystal = 8000000
    Config Lcdmode = Port                                       'w pliku raportu będzie informacja o trybie pracy
    Config Lcdbus = 4
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portc.4 , Rs = Portb.0
    Initlcd
    
    Config Pinb.1 = Output
    Config Pinc.1 = Input
    Config Pinc.2 = Input
    Config Pinb.3 = Input
    S1 Alias Pinc.2
    S2 Alias Pinc.1
    S3 Alias Pinc.3
    Dioda Alias Portb.1
    Set Portc.1
    Set Portc.2
    Set Portc.3
    Config Timer1 = Timer , Prescale = 256
    Declare Sub Wysw_czas
    Declare Sub Przesun
    On Timer1 Odmierz_1s
    Dim Sekundy As Byte
    Dim Minuty As Byte
    Dim Nowa_w As Byte
    Dim Wart_bcd As Byte
    Dim Zegar As Byte
    Dim Zegar1 As Byte                                          'im Grafika As Byte
    Dim A As Byte
    
    Zegar = 0
    Zegar1 = 0
    'Minuty = 1
    'Sekundy = 10
    'Writeeeprom Sekundy
    'Writeeeprom Minuty
    'Wysw = 0
    'Grafika = 0
    Cursor Off
    Enable Interrupts
    Enable Timer1
    Counter1 = 34286
    Stop Timer1
    Set Nowa_w
    Cls                                                         'kasujemy LCD
    
    
    '************************************************************************************************
    Readeeprom Sekundy , 10
    Readeeprom Minuty , 11
    
    Locate 1 , 1 : Lcd "STEROWNIK CZAS."
    Locate 2 , 1 : Lcd "ABG sp. zoo"
    Wait 3
    Call Przesun
    Do
       If Zegar1 = 0 Then
       If S3 = 0 Then
       Waitms 25
       If S3 = 0 Then
       Zegar = 1
       Set Dioda
       Start Timer1
       End If
       End If
       End If
    
    
       If Zegar1 = 0 Then
       If S2 = 0 Then
       Waitms 25
       If S2 = 0 Then
       Zegar = 1
       Sekundy = 5
       Minuty = 0
       Set Dioda
       Start Timer1
       End If
       End If
       End If
    
    
    
    If Zegar = 1 And Zegar1 = 0 Then
    Locate 1 , 1 : Lcd "TRWA ODLICZANIE:"
    Elseif Zegar = 0 And Zegar1 = 0 Then
       Locate 1 , 1 : Lcd "CZAS PRACY:     "
     End If
    
    
    
    
                  If Zegar = 0 Then
       If S1 = 0 And S2 = 0 Then
       Wait 1
       If S1 = 0 And S2 = 0 Then
       Cls
       Wait 1
       Zegar1 = 1
       End If
       End If
       End If
    
                   If Zegar1 = 1 Then
                   Locate 1 , 1 : Lcd "USTAW ZEGAR:"
                         Locate 2 , 13 : Lcd "NOWY"
                         If S1 = 0 Then
                         Waitms 50
                         If S1 = 0 Then
                         'Locate 2 , 10 : Lcd "  "
                         Incr Sekundy
                         End If
                         Waitms 150
                             If S1 = 0 Then
                             Wait 1
                             If S1 = 0 Then
                             Sekundy = Sekundy + 4
                             End If
                             End If
                         If Sekundy >= 60 Then
                         Sekundy = 0
                         End If
                         End If
    
    
                            If S2 = 0 Then
                            Waitms 50
                            If S2 = 0 Then
                            'Locate 2 , 7 : Lcd "  "
                            Incr Minuty
                            If Minuty = 60 Then
                            Minuty = 0
                            End If
                            End If
                            Waitms 150
                            End If
    
                              If S3 = 0 Then
                              Wait 1
                              If S3 = 0 Then
                              'Eesekundy = Sekundy
                              'Eeminuty = Minuty
                            Writeeeprom Sekundy , 10
                            Writeeeprom Minuty , 11
                              Zegar = 0
                              Zegar1 = 0
                            Call Przesun
    
                              Wait 1
                              End If
                              End If
    
                   End If
    
    
       Call Wysw_czas
    
    Loop
    End
    
    
    
    
    
    
    
    
    '************************************************************************************************
    
    
    
    
    
    Sub Przesun
    For A = 1 To 5                                              'czekamy
    Display Off                                                 'wyłączamy wyświetlacz
    Waitms 100                                                  'czekamy
    Display On
    Waitms 100
    Next
    For A = 1 To 16
    Shiftlcd Right
    Waitms 50
    Next
    Cls
    End Sub
    
    
    
    
    Sub Wysw_czas
    Locate 2 , 1 : Lcd "Czas:"
    Wart_bcd = Makebcd(minuty)
    Locate 2 , 7 : Lcd Bcd(wart_bcd) ; ":"
    Wart_bcd = Makebcd(sekundy)
    Locate 2 , 10 : Lcd Bcd(wart_bcd) ;
    End Sub
    
    
    Odmierz_1s:
    Decr Sekundy
    If Sekundy = 0 And Minuty = 0 Then
    Stop Timer1
    'Waitms 150
    Reset Dioda
    Zegar = 0
    Readeeprom Sekundy , 10
    Readeeprom Minuty , 11
    End If
    
    If Sekundy = 255 Then
    Waitms 150
    Sekundy = 59
    If Minuty = 0 And Sekundy < 60 Then
    Minuty = 0
       Else
       Decr Minuty
       End If
    
    
    
    
    
    End If
    Counter1 = Counter1 + 34268
    Return
  • #15 5576946
    drasmen
    Poziom 11  
    Witam mam taki programik i niemogę sobie z nim poradzić może coś ktoś widzi co jest źle z tym. Atmege mam ustawioną na kwarc zewnętrzny
    po wgraniu programu na układ zegar stoi widać czas i date ale wszystko to stoi w miejscu czy czegoś tu brakuje ?
    pozdrawiam
    
    $regfile = "m8def.dat"                                      ' specify the used micro
    $crystal = 14318000                                         ' used crystal frequency
    $baud = 19200                                               ' use baud rate
    
    
    
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
    Config Lcdmode = Port
    Enable Interrupts
    
    Config Timer0 = Timer , Prescale = 1
    
    Config Date = Mdy , Separator = /
    
    Config Clock = Soft
    Date$ = "10/09/08"
    
    Time$ = "00:00:00"
    $lib "eurotimedate.lbx"
    
    Cls
    Do
    
     Home
     Locate 1 , 5                                               'kursor na początek
     Lcd Date$ ; ""
     Locate 2 , 5                                               'pokaż czas i datę
     Lcd Time$ ; ""
    
    Loop
    
    
    
    End
    


    Proszę na przyszłość , używać znaczników [code] - poprawiłem.
    [zumek]
  • Pomocny post
    #16 5577851
    dawid512
    Poziom 32  
    Do drasmen: jeżeli chcesz aby układ zadziałał musisz przestawić fuse bity na wew. generator np. 8MHz a do pinów gdzie podłączasz kwarc musisz wpiąć kwarc zegarkowy 32.768kHz.

    Program dla autora tematu:
    
    'Program wykorzystujący przerwanie od timera0(8 bitowego) generowane co 8ms
    'jeżeli przerwanie zostanie wywołane 125 razy, otrzymamy 1 sekundę
    
    $regfile = "m8def.dat"                                      'nagłowek, model uc
    $crystal = 1000000                                          'kwarc (generator taktujący)
    '*************************
     Config Lcdbus = 4                                          'konfiguracja lcd
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Pb.4 , Db5 = Pb.5 , Db6 = Pb.6 , Db7 = Pb.7 , E = Pb.3 , Rs = Pb.2
    '************************************************************************************************
    '********* Konfiguracja timera0(licznika) ***********************
    Config Timer0 = Timer , Prescale = 64
    On Timer0 Odmierz_1s                                        'podprogram wykonywany podczas wystapienia przerwania
    
    Dim Licz_8ms As Byte                                        'deklaracja zmiennej
    
    Enable Interrupts                                           'aktywacja globalnego systemu przerwan
    
    Enable Timer0                                               'aktywacja timera0
    
    Counter0 = 131                                              'wpisanie wartosci początkowej do timera0
    
    Dim Sek As Byte                                             'deklaracja zmienna zawierajaca wartosc sekund oraz jej wartosc poczatkowa
    Sek = 0
    
    Cls                                                         'czyszczenie lcd a takze jego inicjalizacja
    Cursor Off                                                  'kursor wylaczony( po co ma niepotrzebnie migotac :P)
    Wait 1                                                      'czekam sekunde
    '********** Pętla główna ************************
    Do
    Locate 1 , 1
    Lcd Sek
    
    Loop
    End
    
    '*********** podprogram wykonywany w czasie przerwania ********************************
    Odmierz_1s:
    
    Counter0 = 131
    
    Incr Licz_8ms
    
    If Licz_8ms = 125 Then
    
    Licz_8ms = 0
    
    Incr Sek
    
    End If
    
    Return
  • #17 5578020
    jacynka84
    Poziom 26  
    Takie skomplikowane rzeczy dla jednej sekundy...

    Takie coś odmierza sekundę dla kwarcu 11059200 , dla innego musisz użyć gdzieś dostępnego kalkulatora tajmerów:
    
    $crystal = 11059200
    Config Timer1 = Timer , Prescale = 256
    Enable Interrupts
    Enable Timer1
    On Timer1 Timer1_int
    Start Timer1
    
    Dim sekunda as byte ' bo mniej niż 255, 60sekund
    
    Do : Loop ' tu umieszczasz np. funkcję zegara
    
    Timer1_int:
       Incr Sek                  'powiększenie zmiennej dokładnie co sekundę
    Timer1 = 22336
    Return
      
  • #18 5578133
    hubertfab
    Poziom 21  
    dawid512 : Ty mi pomogłeś!

    Tylko teraz napisz jeszcze (jak możesz) jak go przerobić na :!: wew. 8MHz :!:
    I żeby w pierwszej lini było wyświetlone "Sekunda:"
    A w drugiej te zliczane sekundy.
    $regfile = "m8def.dat"                                      'nagłowek, model uc
    $crystal = 1000000                                          'kwarc (generator taktujący)
    '*************************
     Config Lcdbus = 4                                          'konfiguracja lcd
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Pb.1 , Db5 = Pb.2 , Db6 = Pb.3 , Db7 = Pb.4 , E = Pb.0 , Rs = Pb.5
    '************************************************************************************************
    '********* Konfiguracja timera0(licznika) ***********************
    Config Timer0 = Timer , Prescale = 64
    On Timer0 Odmierz_1s                                        'podprogram wykonywany podczas wystapienia przerwania
    
    Dim Licz_8ms As Byte                                        'deklaracja zmiennej
    
    Enable Interrupts                                           'aktywacja globalnego systemu przerwan
    
    Enable Timer0                                               'aktywacja timera0
    
    Counter0 = 131                                              'wpisanie wartosci początkowej do timera0
    
    Dim Sek As Byte                                             'deklaracja zmienna zawierajaca wartosc sekund oraz jej wartosc poczatkowa
    Sek = 0
    
    Cls                                                         'czyszczenie lcd a takze jego inicjalizacja
    Cursor Off                                                  'kursor wylaczony( po co ma niepotrzebnie migotac :P)
    Wait 1                                                      'czekam sekunde
    '********** Pętla główna ************************
    Do
    Locate 1 , 1
    Lcd Sek
    
    Loop
    End
    
    '*********** podprogram wykonywany w czasie przerwania ********************************
    Odmierz_1s:
    
    Counter0 = 131
    
    Incr Licz_8ms
    
    If Licz_8ms = 125 Then
    
    Licz_8ms = 0
    
    Incr Sek
    
    End If
    
    Return
    


    Dodano po 36 [minuty]:

    Dobra już nie trzeba. Sam to przerobiłem.
    Większość programu rozumiem.

    Tylko teraz mam problem ze zliczaniem w dół bo jak idzie od 105 do 0 to tak:
    105
    104
    103
    102
    101
    100
    990
    980
    970
    .....
    .....
    800
    700
    600
    500 - Tu powinno być tylko 5

    I nie wiem jak sobie z tym poradzić. :D
  • #19 5578774
    dawid512
    Poziom 32  
    Włącz sobie lcd designer kliknij na ok zrobi ci pusty znak. Wpisz na poczatek jakas wartosc np 0. Potem wystarczy ze zrobisz tak:
    lcd "sekundy:";sek;chr(0);chr(0)
    i to tyle ;)
  • #20 5579426
    Freddy
    Poziom 43  
    Cytat:
    ..................Tylko teraz napisz jeszcze (jak możesz) jak go przerobić na :!: wew. 8MHz :!:....................


    Kolego nie przesadzasz czasem ? Może zamiast rozkazywać innym i czekać na gotowce, kup sobie książkę u poucz się trochę.
  • #21 5579567
    zumek
    Poziom 39  
    Freddy napisał:
    Kolego nie przesadzasz czasem ? Może zamiast rozkazywać innym i czekać na gotowce, kup sobie książkę u poucz się trochę.

    Temat zamykam -> Regulamin p.16
REKLAMA