Strona 1 z 1
Atmega2560 timer'y
: 26 gru 2017, 11:33
autor: Jacek
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
pozdrawiam Jacek.
Re: Atmega2560 timer'y
: 26 gru 2017, 11:38
autor: niveasoft
Zerknij na obrazek

Re: Atmega2560 timer'y
: 26 gru 2017, 11:45
autor: Jacek
Witam - no tak ślepy jestem - miałem wyłączone to okno z lewej strony

Bartek bardzo dziękuje za oświecenie.
pozdrawiam Jacek.
Re: Atmega2560 timer'y
: 26 gru 2017, 13:33
autor: Jacek
Bartku czy ja dobrze odliczam czas w A2560 mam taki program:
'----------------------------------------------------------------
' odliczanie 1 sekundy na A2560 przy kwarcu 16MHz
$regfile = "m2560def.dat"
$crystal = 16000000
$baud = 19200
$hwstack = 255
$swstack = 128
$framesize = 128
Config Timer0 = Timer , Prescale = 256 'konfiguracja Timer0 jako Timer
Enable Timer0 : On Timer0 Przertimer0
Enable Interrupts
Dim Dziel(4) As Byte
Dim Flaga100ms As Bit
Dim Flaga500ms As Bit
Dim Flaga1s As Bit
Dim Flaga5s As Bit
Config Portk = Output 'konfiguracja portu k jako wyjścia
Set Portk.0 'ustawienie portu k.0 w satn wysoki
Do
If Flaga100ms = 1 Then
Flaga100ms = 0
'Toggle Portk.0 ' tu na oko mruga co 1s
End If
If Flaga1s = 1 Then
Flaga1s = 0
Toggle Portk.0 'tu na oko mruga co 5s
End If
Loop
End
'--------------------------------------------------------------------
' podprogram przerwań Timer0
Przertimer0:
Timer0 = 6 'wstawienie do Timer0 wartości 6
Incr Dziel(1) 'zwiększ dzielnik 1
If Dziel(1) = 25 Then 'jeśli dzielnik 1 zwiększy się 25 razy
Dziel(1) = 0 'wyzeruj dzielnik 1
Set Flaga100ms 'ustaw flaga100ms
Incr Dziel(2) 'zwiększ dzielnik 2
If Dziel(2) = 5 Then 'jestli dzielnik 2 zwiększy się 5 razy
Dziel(2) = 0 'wyzeruj dzielnik 2
Set Flaga500ms 'ustaw flaga500ms
Incr Dziel(3) 'zwiększ dzielnik 3
If Dziel(3) = 2 Then 'jeśli dzielnik3 zwiększy się 2 razy
Dziel(3) = 0 'wyzeruj dzielnik 3
Set Flaga1s 'ustaw flaga1s
Incr Dziel(4) 'zwiększ dzielnik 4
If Dziel(4) = 5 Then 'jeśli dzielnik 4 zwiekszy się 5 razy
Dziel(4) = 0 'wyzeruj dzielnik 4
Set Flaga5s 'ustaw flaga5s
End If 'koniec warunku
End If 'koniec warunku
End If 'koniec warunku
End If 'koniec warunku
Return 'powrót
czy to jest poprawnie oby dioda led podłączona do portu k.0 mrugała co 1 sekunde
pozdrawiam Jacek.
Re: Atmega2560 timer'y
: 26 gru 2017, 13:47
autor: niveasoft
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.
$regfile = "m2560def.dat"
$crystal = 16000000
$hwstack = 128
$swstack = 128
$framesize = 255
'*****************************************************************
'* TIMER2 FOR TIME BASE *
'*****************************************************************
Config Timer2 = Timer , Prescale = 1024 , Compare_a = Disconnect , Compare_b = Disconnect , Clear_timer = 1
Compare2a = 155 '10ms @16MHz/1024
Do
'--[ TIMER2 10ms ]----------------------------
If Tifr2.ocf2a = 1 Then 'jeśli Timer ustawił flagę sprzetową
Tifr2.ocf2a = 1 'skasuj flagę przez wpisanie 1 (a nie 0)
'tu w środku IF`a program jest co 10ms bez użycia przerwań
End If
Loop
Re: Atmega2560 timer'y
: 26 gru 2017, 14:04
autor: niveasoft
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ę
$regfile = "m2560def.dat"
$crystal = 16000000
$hwstack = 128
$swstack = 128
$framesize = 255
Config Portb.7 = Output : Arduino_mega_led Alias Portb.7
'*****************************************************************
'* TIMER3 FOR TIME BASE *
'*****************************************************************
Config Timer3 = Timer , Prescale = 256 , Clear_timer = 1
Compare3a = 31249 '500ms @16MHz/256
'Compare3a = 62499 '1s @16MHz/256
Do
If Tifr3.ocf3a = 1 Then
Tifr3.ocf3a = 1
Toggle Arduino_mega_led
End If
Loop
Re: Atmega2560 timer'y
: 26 gru 2017, 14:19
autor: Jacek

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?
Re: Atmega2560 timer'y
: 26 gru 2017, 14:28
autor: niveasoft
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.
Re: Atmega2560 timer'y
: 26 gru 2017, 14:54
autor: Jacek
Wgrywam przez złącze 6 pin programatorem, programem wbudowanym w Bascom AVR - nigdy nie ustawiałem

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.