[BASCOM] najszybsza czestotliwość przerwania ?

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
kennyg
-
Posty: 2
Rejestracja: 14 lis 2009, 0:01
Lokalizacja: Warszawa

[BASCOM] najszybsza czestotliwość przerwania ?

Post autor: kennyg » 14 lis 2009, 0:29

Witam
Bardzo proszę o pomoc bo już trochę kończy mi się cierpliwosc.
Napisałem program obsługi encodera , działa na zasadzie cyklicznego sprawdzania
stanu dwóch wejść portu i prostego sprawdzenia stanu z tego cyklu i cyklu poprzedniego. Całość działa wspaniale , nie gubi impulsów i jest bardzo stabilna , ale po zmierzeniu czasów działania , zdziwiłem się że naszybszy czas działania procedury (nawet pustej)wynosi 7us. Używam kwarc 14745190 mhz.
Próbowałem w każdym przerwaniu ustawiać wartość timera na np 200 żeby wywołał przerwanie po 55 cyklach zegara , ale to nic nie daje , ten cza 7us stoi jak drut.
Wszelkie próby użycia compare1a też spoczeły na niczym - zawsze mam ten sam czas
przerwania (compare działa mi jakby dopiero od pewnych dużych wartośći).
Wiem jednak że może być szybciej , prosta pętla -

main:
portd.7 = not portd.7
go to main

generuje przebieg o okresie 500ns

Może ktos cos poradzi , bo wszystko co zrozumiałem po przeczytaniu not aplikacyjnych nie działa.

Pozdrawiam
Kenny

Awatar użytkownika
c4r0
Moderator
Posty: 2150
Rejestracja: 13 kwie 2004, 19:56
Lokalizacja: z lasu
Kontakt:

Post autor: c4r0 » 14 lis 2009, 11:30

Jeśli ważna jest szybkość działania to ja pierwsze co bym zrobił to przejście z bascoma na c. Ale nie wiem czy to do końca słuszne przekonanie.

kennyg
-
Posty: 2
Rejestracja: 14 lis 2009, 0:01
Lokalizacja: Warszawa

Sprawdzałem już w c

Post autor: kennyg » 14 lis 2009, 12:08

Wiadomo C , a szczególnie dobre kompilatory robia cuda. Jednak myśle że mój problem leży złym ustawieniu procesora. Nie wiem dlaczego nie działa mechanizm compare , który ma za zadanie sprawdzać wartość timera i generować przerwanie jesli jest równa wartości komparatora. Jesli zmieniam wartość kompare to od 1 do około 100 czas przerwania nie ulega zmianie , pózniej zaczyna się wydłużać.
Dzięki za odpowiedz.

Awatar użytkownika
Pikczu
Użytkownik
Posty: 754
Rejestracja: 18 lip 2005, 18:33
Lokalizacja: Dublin
Kontakt:

Post autor: Pikczu » 14 lis 2009, 17:43

Uzyj samych przerwań
masz tu przykład od razu dodam ze NIE jestem autorem kodu Autorem jest Luciano ze strony MSC electronic
Kod różni się troszkę od oryginału ale niewiele, zmieniłem na potrzeby własne.

Kod: Zaznacz cały

' The TTL encoder A signal is connected to PB1
' The TTL encoder B signal is connected to PB0
' If the count goes in the wrong direction swap A B.
'
' This code uses the pin change interrupt
'
$regfile = "ATtiny2313.DAT"
$crystal = 16000000
$baud = 9600

$hwstack = 32
$swstack = 16
$framesize = 32

'dimension variables
Dim New_value As Byte
Dim Old_value As Byte
Dim Direction As Byte
Dim Encoder_count As Word
 Config Portd = Output
 Portd = 0

'Set data direction of PORTB
'INPUTS = PB7,PB6,PB5,PB4,PB3,PB2,PB1,PB0
Ddrb = &B00000000

'Enable internal pull-up resistors on the inputs PB1,PB0.
Portb = &B00000011

'Wait that PORTB stabilizes before we enable the pin change interrupt
Waitms 10

'Set the mask of the Pin change interrupt on PB1,PB0
Pcmsk = &B00000011

'Set interrupt vector PCINT
On Pcint Pcint_isr

'Clear Pcint flag set while the PORTB was stabilizing.
Set Eifr.5

'Enable Pcint (Pin Change Interrupt)
Gimsk.5 = 1

'Global Interrupt Enable
Enable Interrupts


' ===================================================================

Waitms 100

New_value = Pinb
Old_value = New_value
Encoder_count = 0


Do
Reset Portd.4
Reset Portd.3
   Print Encoder_count

Loop


End

' =============================================
' Interrupt routine
Pcint_isr:

New_value = Pinb

Direction = Old_value.0 Xor New_value.1

If Direction = 1 Then
  Set Portd.3
  Reset Portd.4
  Incr Encoder_count
Else
 Set Portd.4
 Reset Portd.3
   Decr Encoder_count
End If

Old_value = New_value

' Clear Pcint flag (Pin Change Interrupt flag)
Set Eifr.5


Return

Link do tematu na forum MCS
http://www.mcselec.com/index2.php?optio ... pic&t=2695

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 14 lis 2009, 17:58

Widocznie wygenerowany przez kompilator kod nie może się wykonać szybciej niż 7us. Z drugiej strony wykorzystywanie do budowy pętli instrukcji Go To to raczej brak wiedzy. Jak już chcesz robić pętlę to do .. loop albo while ... wend w zależności od potrzeb. Ostatecznie napisać wstawkę asemblerową.

kszumek
-
Posty: 7
Rejestracja: 16 sty 2007, 0:08
Lokalizacja: Białystok

Post autor: kszumek » 15 lis 2009, 14:16

Witam
ponieważ też zmagam się z enkoderem podłączonym do AVRka
mam pytanie do autora
czy twój program rozpoznaje wszystkie 4 zbocza sygnałów z enkodera?
i czy mógłbyś podrzucić fragment kodu obsługi enkodera?
pozdrawiam i z góry dzięki

Awatar użytkownika
Pikczu
Użytkownik
Posty: 754
Rejestracja: 18 lip 2005, 18:33
Lokalizacja: Dublin
Kontakt:

Post autor: Pikczu » 15 lis 2009, 18:00

kszumek, jednym z lepiej działających programów jest ten który ja dodałem autora Luciano z MCS forum, Uzuwa samych przerwań jest bardzo szybkie, zobacz jeszcze na stronę: http://mirley.firlej.org/obsluga_impulsatora
Jego rozwiązanie tez jest dobre, ale dużo wolniejsze warte jednak sprawdzenia.
Jelsi możesz wklej swoją wersie kodu

Widze ze autor dawno zapomniał o swoim problemie i o poście na forum.

kszumek
-
Posty: 7
Rejestracja: 16 sty 2007, 0:08
Lokalizacja: Białystok

Post autor: kszumek » 18 lis 2009, 13:19

Witam
najważniejszą dla mnie sprawą w tym programie jest
szybkość działania i dekodowanie wszystkich 4 zboczy x4
ponieważ będzie to służyło do odczytu położenia wału silnika dc
na razie działa to na zmodyfikowanej wersji tego:
http://www.mcselec.com/index.php?option ... &Itemid=57
jednak tu tracę na rozdzielczości ponieważ tu mam x2
(program działa tylko na 2 zboczach jednego kanału)
chciałbym coś wykombinować aby działało to dalej na przerwaniach (choć niekoniecznie ) jednak dekodowało wszytkie 4 zbocza
choć myślę że dobrze napisany algorytm dekodowania programowo
też powinien zdążyć to obsłużyć
maxymalna częstotliwość impulsów z enkodera to około 50 khz
czy ten algorytm Luciano potrafi zdekodować wszystkie 4 zbocza?
pozdrawiam

Awatar użytkownika
Pikczu
Użytkownik
Posty: 754
Rejestracja: 18 lip 2005, 18:33
Lokalizacja: Dublin
Kontakt:

Post autor: Pikczu » 18 lis 2009, 20:07

Najlepiej jest użyć przerwań, problemy sprawiają natomiast drgania styków w enkoderach mechanicznych, duzo lepiej jest juz z optycznymi ale myślę że czujnik halla w twoim wypadku będzie najlepszym rozwiązaniem.

kszumek
-
Posty: 7
Rejestracja: 16 sty 2007, 0:08
Lokalizacja: Białystok

Post autor: kszumek » 18 lis 2009, 22:18

enkoder optyczny już jest na wale silnika 250 szczelin na obrót
jedyne co chciałbym zrobić to napisać algorytm dekodujący x4
aby uzyskać 1000imp/obr

snow
Użytkownik
Posty: 794
Rejestracja: 16 sty 2007, 3:44
Lokalizacja: lubelskie
Kontakt:

Post autor: snow » 18 lis 2009, 22:24

Jedyna możliwość to raczej wymiana enkodera niż jakieś sztuczne dorabianie mnożnika. Przerwanie można uzyskać max co ok. 0.5*f_cpu
If edge or toggle interrupt is selected, pulses that last longer than one clock period will generate an interrupt. Shorter pulses are not guaranteed to generate an interrupt.
Poza tym ja nie rozumiem do końca czy mierzymy prędkość + kierunek czy tylko prędkość, bo jak tylko prędkość to wystarczy wykorzystać jedno wyjście enkodera kwadraturowego i liczyć ilość impulsów w ciągu sekundy i z tego wyjdzie prędkość wału. Podpinamy się pod wejście przerwania i zliczamy. Nie wydaje mi się żeby była to kwestia kompilatora że się nie da szybciej zliczyć iż 7us (o ile nas zegar nie ogranicza)

Co do idei sztucznego pomnażania impulsów którą autor wątku próbuje tutaj zastosować to tak samo jak z ideą mikrokroku w silniku krokowym - w zasadzie to oszustwo i nie ma nic wspólnego z rzeczywistością ;) Jedyną poprawną metodą zwiększenia dokładności jest wymiana enkodera. Rozdzielczość można sobie zrobić i milion impulsów na obrót.

kszumek
-
Posty: 7
Rejestracja: 16 sty 2007, 0:08
Lokalizacja: Białystok

Post autor: kszumek » 18 lis 2009, 23:20

Witam
właśnie odwrotnie
tu prostsze będzie napisanie odpowiedniego algorytmu
niż wymiana enkoderów oryginalnie osadzonych na silniku
pozatym to nie jest żadne sztuczne dorabianie mnożnkia
wszystkie fabryczne sprzęty rozpoznają 4 zbocza
a max częstotliwość impulsów to jakieś 50 Khz
czyli mamy z 200 rozkazów na obsługę przerwania
ja nie mierzę prędkości tylko przemieszczenie poprzez zliczanie obrotów
czyli pomiar odbywa się w 2 kierunkach

a co do sinika krokowego to masz racje ale tylko w połowie
sterowniki z mikrokrokiem po prostu kulturalniej pracują
nie mają takich drgań momentu przy niskich obrotach
tu nie chodzi o zwiększenie rozdzielczości tylko kulturę pracy silnika

no i jeszcze jedno nie ja jestem autorem tematu tylko się podpiąłem
pozdrawiam

snow
Użytkownik
Posty: 794
Rejestracja: 16 sty 2007, 3:44
Lokalizacja: lubelskie
Kontakt:

Post autor: snow » 18 lis 2009, 23:29

kszumek pisze:wszystkie fabryczne sprzęty rozpoznają 4 zbocza
Zapodaj jakiś link ;) Chętnie się zapoznam z takimi rozwiązaniami.

Jak chcesz rozpoznawać x4 to musisz jeden podpiąć pod INT0, drugi pod INT1 i na początek ustawić na zbocze narastające, po nadejściu przerwania przerzucić się na opadające i tak dla obu wejść (pod warunkiem że w momencie zboczy na drugim wejściu przerwania otrzymasz stały poziom logiczny). Lub w momencie nadejścia przerwania od jakiegoś zbocza na pierwszym wejściu przestawić wykrywanie zbocza w drugim wejściu na przeciwne zbocze niż do tej pory. Ponieważ masz zawsze stan ustalony na INT0 gdy nadchodzi zbocze na INT1 to możesz tą właściwość wykorzystać do wykrywania momentu kiedy trzeba zmieniać na które zbocze ma przerwanie reagować.

Wtedy powinieneś uzyskać swoje x4

kszumek
-
Posty: 7
Rejestracja: 16 sty 2007, 0:08
Lokalizacja: Białystok

Post autor: kszumek » 19 lis 2009, 18:08

proszę bardzo
http://www.allegro.pl/item819966672_ste ... kazja.html
"Rozdzielczość enkodera - min. 2x max. 4x 1"
wklep w google servonapęd i zobacz jakikolwiek fabryczny sprzęt a się przekonasz
pozdrawiam

Awatar użytkownika
Pikczu
Użytkownik
Posty: 754
Rejestracja: 18 lip 2005, 18:33
Lokalizacja: Dublin
Kontakt:

Post autor: Pikczu » 19 lis 2009, 20:38

Ja nie kumam poco Ci te 4 zbocza.
Możesz skonfigurować przerwanie jako CHANGE czyli jakakolwiek zmiana będzie wywoływała przerwanie.

ODPOWIEDZ