Timer-y i tryby

Rodzina procesorów bogatszych w wiele nowych rozwiązań i dlatego warto po nie sięgnąć.
ODPOWIEDZ
Awatar użytkownika
tomaszdko
Posty: 72
Rejestracja: 06 gru 2018, 19:58

Timer-y i tryby

Post autor: tomaszdko » 29 kwie 2020, 14:51

Witam panowie .

Tak jak pisałem ostatnio że przenoszę się na Xmegi chodź topornie ruszyło na płytce XM64 . Zmieniłem na X3-DIL64 i od razu inna bajka (może tamta była walnięta).
Procek kreci się na 50Mhz , uart bauder testowałem do 256000 i bez problemów (nie wszystkie obsługuje 3,4 i 8 nie ruszyły ale na stronie bascom pisali że tak ma być aż poprawią , 5 uartow to i tak sporo),karty SD 32gb też ładnie czyta i zapisuje , i2c z dwóch jeden mi chodził , do adc to jak najdalej bo używam ads1115 (może kiedyś ruszę ale z tego co widzę to wielu ludzi przeklina to rozwiązanie xmeg),spi śmiga.
Timery ruszyłem tyle ile mogłem czyli to co można w bascom znaleźć czyli mało (przepełnienie i pwm) :/ . Pytanie , ma ktoś opis trybów z , konfiguracji i jakieś sample by potestować ?

Dzięki
Awatar użytkownika
niveasoft
Posty: 1213
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Timer-y i tryby

Post autor: niveasoft » 29 kwie 2020, 16:31

W X3-DIL Usarty testowałem wszystkie bo przenoszone były niektóre funkcjonalności przy projektowaniu płytki i działały na pewno. Masz na pewno nowy Bascom 2082?
Te Usarty moga nawet pracowac w trybie SPI i mieć zamieniane miejscami piny MOSI<>MISO i takie tam :P I2C tez przenosiłem dla RTC - to działało. Gdyby coś nie działało to bym walił jak w dym do supportu i w ciagu paru godzin zawsze coś poradzą. Np potrzebowałem ściagnąć z zewnetrznej pamieci Flash 700Bajtów za jednym razem to dorobili dyrektywę do Config SPI = Extended i tam zamiast 256 bajtów można już poprosić układ o Word danych :D

Co byś od tych timerów potrzebował? Timer jak Timer.

Z ADC najprościej jest zrobić tak, że jeden pin poświecić i zewrzeć do masy. Offset jest dla całego ADC więc jak zmierzysz ile odczytuje na tym pinie np. 600 to potem te 600 odejmujesz od pomiarów na innych pinach. Ot cała filozofia, chyba że zależy Tobie na jego dobrej liniowości to jeszcze trzeba by odczytać z sygnatury bajty kalibracyjne i jednorazowo wpisać je przy starcie do ADC.
Awatar użytkownika
tomaszdko
Posty: 72
Rejestracja: 06 gru 2018, 19:58

Re: Timer-y i tryby

Post autor: tomaszdko » 04 maja 2020, 14:00

Witam
Mam dwa dni urlopu to trochę pomęczę z xmega :) . Na chwilę timery odstawmy a przejdźmy do ADC .
Mówisz że jest proste do ogarnięcia (jak już się wie to na pewno ) ale niestety człowiek ma stare przyzwyczajenia z ATmega .
Typowo na ATmega ustawiałem ADC w taki sposób :

Kod: Zaznacz cały

$regfile = "m32def.dat"
$crystal = 16000000
Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0
$baud = 9600

Dim Aa(6) As Word

Config Adc = Single , Prescaler = Auto , Reference = Avcc
Enable Adc
Enable Interrupts
Start Adc
Cls
Do
Aa(1) = Getadc(0)
Aa(2) = Getadc(1)
Aa(3) = Getadc(2)
Aa(4) = Getadc(3)
Aa(5) = Getadc(4)
Aa(6) = Getadc(5)
....
Skala pomiaru w zakresie od 0 do 5V / 10bit ..dla amatora bajka , nic dodać nic ująć .
W Xmega jest trochę inaczej troche mieszania :/ .
Chcąc używać ADC jak z przykładu jak na ATmege wybrałem dla Xmega tryb - Single , Convmode = unSigned . Czyli pomiar napięcia (moje zasilanie jest 3,276V ) podzielonego przez 1,6 a to wychodzi ze max napięcie wyniecie 2,0475V (szkoda że nie ma jak w ATmega cały zakres zasilania). Te 2,0475V musze przeliczyć na rozdzielczość 12bit , 2,0475/4095=0,0005V .
Po podłączeniu ADC do masy wychodzi mi że mam wartość przesunięcia = 188 , by pozbyć się przesunięcia to muszę odjąć od wyniku całego pomiaru wartość 188*0,0005=0,094V .
Napisałem prosty program do testów :

Kod: Zaznacz cały

$regfile = "xm128a3udef.dat"
$crystal = 60000000 '60MHz
$hwstack = 128
$swstack = 128
$framesize = 128
$lib "xmega.lib"
Config Osc = Enabled , Pllosc = Enabled , Pllmul = 30
Config Sysclock = pll
Config Priority = Static , Vector = Application , Lo = Enabled
'-------------------------------------------------------------------------------------------------------------------------------------------
Config Com2 = 19200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
Open "COM2:" For Binary As #1
'-------------------------------------------------------------------------------------------------------------------------------------------
Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portf.5 , Db5 = Portf.4 , Db6 = Portf.3 , Db7 = Portf.2 , E = Portf.1 , Rs = Portf.0
Cursor Off
Cls
'-------------------------------------------------------------------------------------------------------------------------------------------
Config Adca = Single , Convmode = unSigned , Resolution = 12bit , Dma = Off , Reference = Intvcc , Event_mode = None , Prescaler = 512 , _
Ch0_gain = 1 , Ch0_inp = Single_ended , Mux0 = &B00000000
'-------------------------------------------------------------------------------------------------------------------------------------------

dim usrednianie as dword  , wynik_usredniony as word
Dim pomiar_ADC As Word
Dim napiecie As Single
Dim I As Byte

'napiecie zasilania= 3,276V
'napiecie odniesienia 3,276/1,6=2,0475
'rozdzielczosc=4095
'napiecie rozdzielczosci = 2,0475/4095=0,0005V
'pomiar przesuniecia =188
'napiecie przesuniecia =188*0,0005=0,094V

dim napiecie_rozdzielczosci as single
napiecie_rozdzielczosci =0.0005
dim napiecie_przesuniecia as single
napiecie_przesuniecia = 0.094
'-------------------------------------------------------------------------------------------------------------------------------------------
do

for i=1 to 10
pomiar_ADC = Getadc(adca , 0 )
usrednianie = usrednianie + pomiar_ADC
next i

wynik_usredniony = usrednianie / 10
usrednianie=0

locate 1,1
lcd  "ADC krok = " ; wynik_usredniony               'usredniona wartosc ADC

napiecie = wynik_usredniony * napiecie_rozdzielczosci
napiecie = napiecie - napiecie_przesuniecia

locate 2,1
lcd "napiecie - " ;Fusing  (napiecie , "##.###") ; "V"

Waitms 200
cls
loop
End
Wyniki wychodzą bardzo bliskie wedle pomiaru z miernika np miernik 1,955V a na lcd xmega mam 1,954V , 1,952V
Wyniki są poprawne z dokładnością 0,002V co mnie zadowala licząc że zasilanie to chińska przetwornica + stykówka+kupa kabli.
Czy dobrze to rozkminiłem ? Chyba że są lepsze metody pozbycia się offsetu .
Interesuje mnie też jak ustawić knfig ADC by móc w taki sposób obsłużyć 8 kanałów jak przy ATmega .

Co do timerów to widzę że są 3 tryby , przepełnienia (wykonanie procedury przerwania po przepełnieniu) , tryb FREQ i PWM ...no chyba że są inne bo mnie by interesowało np: COUNTER jak przy ATmega . Jeśli są inne to jak je skonfigurować .

Dzięki

ps: wiem że nudzę ale zapewne będzie więcej pytań
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Re: Timer-y i tryby

Post autor: Jacek » 04 maja 2020, 16:55

Kolego wstaw te programy w posty tak jak być powinny wstawione.
pozdr. Jacek.
Awatar użytkownika
tomaszdko
Posty: 72
Rejestracja: 06 gru 2018, 19:58

Re: Timer-y i tryby

Post autor: tomaszdko » 04 maja 2020, 21:02

Ok już wiem jak ustawić kanały (dobrze że są rosyjskie strony :) ) ...ale dalej mnie interesują tryby timerów .
Awatar użytkownika
niveasoft
Posty: 1213
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Timer-y i tryby

Post autor: niveasoft » 05 maja 2020, 9:46

Już raz prosiłem byś zaznajomił się z tym tematem. To nie jest skomplikowane.

viewtopic.php?f=3&t=107

Trochę brak czasu na umieszczanie przykładów, ale może coś o trybie counter na dysku w projektach znajdę to wykroję ;)
ODPOWIEDZ