Atmega2560 timer'y

Pytania, kody i porady dotyczące nie tylko Bascom.
ODPOWIEDZ
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Atmega2560 timer'y

Post autor: Jacek » 26 gru 2017, 11:33

Witam - nie mogę znaleźć który Timer w a2560 jest ile bitowy - wiem że a2560 ma 2 8 bitowe timery oraz 4 16 bitowe, ale który jest który - czy może Ktoś z forumowiczów naprowadzić mnie w którym miejscu datasheet pisze który timer ile ma bitów :oops:
pozdrawiam Jacek.
Awatar użytkownika
niveasoft
Posty: 1219
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Atmega2560 timer'y

Post autor: niveasoft » 26 gru 2017, 11:38

Zerknij na obrazek ;)
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Re: Atmega2560 timer'y

Post autor: Jacek » 26 gru 2017, 11:45

Witam - no tak ślepy jestem - miałem wyłączone to okno z lewej strony :oops: Bartek bardzo dziękuje za oświecenie.
pozdrawiam Jacek.
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Re: Atmega2560 timer'y

Post autor: Jacek » 26 gru 2017, 13:33

Bartku czy ja dobrze odliczam czas w A2560 mam taki program:
  1. '----------------------------------------------------------------
  2. ' odliczanie 1 sekundy na A2560 przy kwarcu 16MHz
  3. $regfile = "m2560def.dat"
  4. $crystal = 16000000
  5. $baud = 19200
  6. $hwstack = 255
  7. $swstack = 128
  8. $framesize = 128
  9.  
  10.  
  11.  
  12. Config Timer0 = Timer , Prescale = 256                                          'konfiguracja Timer0 jako Timer
  13. Enable Timer0 : On Timer0 Przertimer0
  14. Enable Interrupts
  15.  
  16.  
  17.  
  18. Dim Dziel(4) As Byte
  19. Dim Flaga100ms As Bit
  20. Dim Flaga500ms As Bit
  21. Dim Flaga1s As Bit
  22. Dim Flaga5s As Bit
  23.  
  24. Config Portk = Output                                                           'konfiguracja portu k jako wyjścia
  25. Set Portk.0                                                                     'ustawienie portu k.0 w satn wysoki
  26.  
  27. Do
  28.    If Flaga100ms = 1 Then
  29.       Flaga100ms = 0
  30.       'Toggle Portk.0                                                            ' tu na oko mruga co 1s
  31.    End If
  32.  
  33.    If Flaga1s = 1 Then
  34.       Flaga1s = 0
  35.       Toggle Portk.0                                                            'tu na oko mruga co 5s
  36.    End If
  37. Loop
  38. End
  39.  
  40.  
  41. '--------------------------------------------------------------------
  42. '            podprogram przerwań Timer0
  43. Przertimer0:
  44.    Timer0 = 6                                                                   'wstawienie do Timer0 wartości 6
  45.    Incr Dziel(1)                                                                'zwiększ dzielnik 1
  46.    If Dziel(1) = 25 Then                                                        'jeśli dzielnik 1 zwiększy się 25 razy
  47.       Dziel(1) = 0                                                              'wyzeruj dzielnik 1
  48.       Set Flaga100ms                                                            'ustaw flaga100ms
  49.       Incr Dziel(2)                                                             'zwiększ dzielnik 2
  50.       If Dziel(2) = 5 Then                                                      'jestli dzielnik 2 zwiększy się 5 razy
  51.          Dziel(2) = 0                                                           'wyzeruj dzielnik 2
  52.          Set Flaga500ms                                                         'ustaw flaga500ms
  53.          Incr Dziel(3)                                                          'zwiększ dzielnik 3
  54.          If Dziel(3) = 2 Then                                                   'jeśli dzielnik3 zwiększy się 2  razy
  55.             Dziel(3) = 0                                                        'wyzeruj dzielnik 3
  56.             Set Flaga1s                                                         'ustaw flaga1s
  57.             Incr Dziel(4)                                                       'zwiększ dzielnik 4
  58.             If Dziel(4) = 5 Then                                                'jeśli dzielnik 4 zwiekszy się 5 razy
  59.                Dziel(4) = 0                                                     'wyzeruj dzielnik 4
  60.                Set Flaga5s                                                      'ustaw flaga5s
  61.             End If                                                              'koniec warunku
  62.          End If                                                                 'koniec warunku
  63.       End If                                                                    'koniec warunku
  64.    End If                                                                       'koniec warunku
  65. Return                                                                          'powrót
czy to jest poprawnie oby dioda led podłączona do portu k.0 mrugała co 1 sekunde
pozdrawiam Jacek.
Awatar użytkownika
niveasoft
Posty: 1219
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Atmega2560 timer'y

Post autor: niveasoft » 26 gru 2017, 13:47

Jaki najmniejszy przedział jest Ci potrzebny?
Osobiście najczęściej ustawiam 10ms bo się przydaje do klawiatury/przycisków.
Do tego lepiej jest użyć trybu CTC i można nawet nie korzystać z przerwania.
Kawałek mojego programu na Mega2560 poniżej, ale jak byś potrzebował tylko 1s albo 500ms to można użyć innego Timera 16bit i on Ci odmierzy od razu gotowy czas bez tego składania z małych odcinków.
  1. $regfile = "m2560def.dat"
  2. $crystal = 16000000
  3. $hwstack = 128
  4. $swstack = 128
  5. $framesize = 255
  6.  
  7. '*****************************************************************
  8. '*                TIMER2 FOR TIME BASE                           *
  9. '*****************************************************************
  10. Config Timer2 = Timer , Prescale = 1024 , Compare_a = Disconnect , Compare_b = Disconnect , Clear_timer = 1
  11.  Compare2a = 155                                            '10ms @16MHz/1024
  12.  
  13.  
  14.  Do
  15.  
  16.  
  17.  '--[ TIMER2 10ms ]----------------------------
  18.   If Tifr2.ocf2a = 1 Then                                   'jeśli Timer ustawił flagę sprzetową
  19.    Tifr2.ocf2a = 1                                          'skasuj flagę przez wpisanie 1 (a nie 0)
  20.  
  21.     'tu w środku IF`a program jest co 10ms bez użycia przerwań
  22.  
  23.  
  24.   End If
  25.  
  26.  Loop
Awatar użytkownika
niveasoft
Posty: 1219
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Atmega2560 timer'y

Post autor: niveasoft » 26 gru 2017, 14:04

Jak się gdzieś nie machnąłem (bo nie testowałem) i masz, na przykład, Arduino Mega2560 to możesz sobie pomigać tą wbudowaną diodą LED co pół sekundy lub co sekundę ;)
  1. $regfile = "m2560def.dat"
  2. $crystal = 16000000
  3. $hwstack = 128
  4. $swstack = 128
  5. $framesize = 255
  6.  
  7. Config Portb.7 = Output : Arduino_mega_led Alias Portb.7
  8.  
  9. '*****************************************************************
  10. '*                TIMER3 FOR TIME BASE                           *
  11. '*****************************************************************
  12.  Config Timer3 = Timer , Prescale = 256 , Clear_timer = 1
  13.   Compare3a = 31249                                         '500ms @16MHz/256
  14.   'Compare3a = 62499                                         '1s @16MHz/256
  15.  
  16.  Do
  17.  
  18.   If Tifr3.ocf3a = 1 Then
  19.    Tifr3.ocf3a = 1
  20.  
  21.       Toggle Arduino_mega_led
  22.   End If
  23.  
  24.  Loop
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Re: Atmega2560 timer'y

Post autor: Jacek » 26 gru 2017, 14:19

:( coś nie gra z moim arduino M2560 bo jak załadowałem Twój program ten ostatni to mruga mi co około ( na oko) 4 sekundy.
czy spotkałeś się że płytki arduino M2560 były z innymi kwarcami?
Awatar użytkownika
niveasoft
Posty: 1219
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Atmega2560 timer'y

Post autor: niveasoft » 26 gru 2017, 14:28

Wgrywasz soft przez Arduinowe USB czy programatorem przez 6-cio pinowe złącze?
Jak przez USB to coś z programem bo Bootloader dla Mega na pewno śmiga na 16MHz.
Jak programatorem to może przestawiłeś FuseBity na wewnętrzny 8MHz.
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Re: Atmega2560 timer'y

Post autor: Jacek » 26 gru 2017, 14:54

Wgrywam przez złącze 6 pin programatorem, programem wbudowanym w Bascom AVR - nigdy nie ustawiałem :oops: Fusebits możesz podpowiedzieć gdzie to ustawić.
P.S.
już znalazłem i ustawiłem aby nie było podziału przez 8 - działa
dzięki Bartek.
ODPOWIEDZ