[Bascom] Pomiar czasu trwania stanu niskiego

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!
Awatar użytkownika
Pikczu
Użytkownik
Posty: 754
Rejestracja: 18 lip 2005, 18:33
Lokalizacja: Dublin
Kontakt:

Post autor: Pikczu » 22 sty 2011, 11:38

Matrix w twoim kodzie jest poważny błąd.
Aż się dziwie że nikt nie reagował wcześniej :shock:
I pomiar wykonywany to są bzdury.
Żeby to zrobić poprawnie musi byc użyte przerwanie zewnętrzne.
np tak INT0 jako zbocze opadające i połączyć razem nogę INT1 jako narastające.
Albo przerwanie PINchagne interrupt.
agrala-twój pomysł był bardzo dobry ale przekombinowałeś z tą zmianą ustawień przerwania.
Połącz nogę INT0 z INT1 i ustaw pierwszą jako falling a int1 jako rising.
Potem tylko startujesz timer z int0 a zatrzymujesz INt1 po tym odczytujesz czas naliczony z timera.

keruseykaryu

Post autor: keruseykaryu » 22 sty 2011, 13:08

Pikczu pisze:Żeby to zrobić poprawnie musi byc użyte przerwanie zewnętrzne.
np tak INT0 jako zbocze opadające i połączyć razem nogę INT1 jako narastające.
I pamiętać o wyłączeniu prologu i epilogu przerwań jaki dodaje Bejzik.

agrala
-
Posty: 34
Rejestracja: 17 sty 2011, 21:20
Lokalizacja: Kalisz

Post autor: agrala » 22 sty 2011, 14:27

keruseykaryu pisze:I pamiętać o wyłączeniu prologu i epilogu przerwań jaki dodaje Bejzik.
Możesz napisać jaśniej o co chodzi?
Pikczu idąc po Twoich wskazówkach napisałem coś takiego

Kod: Zaznacz cały

$regfile = "m8def.dat" 
$crystal = 16000000 
Config Lcd = 16 * 2 

Enable Interrupts 

Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5 
Config Timer1 = Timer , Prescale = 64       'maks=0,261s, min=0,000004s 
Enable Timer1 

Config Int0 = Falling 
On Int0 Poczatek 
Enable Int0 

config int1 = rising
on int1 koniec
enable int1

Stop Timer1 
Timer1 = 0 

Dim Wynik As Word 

Dim Flaga As Bit 

Dim Wynikczas As Single 

Cls 
Cursor Off 

Do 
Wynikczas = Wynik * 0.000004 
Locate 1 , 1 
Lcd Wynikczas ; Spc(6) 

Waitms 100 

Loop 
End 

Poczatek: 
Load Timer1 , 0 
Start Timer1 
Return

koniec: 
Stop Timer1 
Wynik = Timer1 
Load Timer1 , 0 
Return
Wygląda na to że dobrze działa, na wyświetlaczu nie przebija mi żadna wartość, wynik pomiaru też jest poprawny.
Sprawdzam To moim generatorkiem (kod w pierwszym poście). Tyle że na wyświetlaczu jest stały wynik (0,0002; 0,0004; 0,0006; 0,0008 lub 0,0001s w zależności którą opcję wybiorę). Boję się żeby nie okazało się że wynik się nie zmienia. Bedę musiał przerobić kod w generatorku żeby to sprawdzić.
Dziekuję Ci bardzo Pikczu za pomoc.

keruseykaryu

Post autor: keruseykaryu » 22 sty 2011, 14:36

Możesz napisać jaśniej o co chodzi?
Oj. Zagadnienia podstawowe z programowania mikrokontrolerów się kłaniają. Poczytaj o No Save i co to zmienia.
No i ten Load Timer1, 0. Co to ma być? Przeczytałeś co to robi wogóle?

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 22 sty 2011, 14:41

Może się nie znam, albo źle odczytuję ale na obrazku wszystko widać.
Załączniki
przerwanie.JPG

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

Post autor: Pikczu » 22 sty 2011, 14:55

Ustawienie timera które tu pokazujesz a przerwania zewnętrzne to dwie różne sprawy.
Kod zaproponowany przez Ciebie miał złe wyzwalanie.

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 22 sty 2011, 15:05

Pikczu pisze:Ustawienie timera które tu pokazujesz a przerwania zewnętrzne to dwie różne sprawy.
Kod zaproponowany przez Ciebie miał złe wyzwalanie.
Wiem jaka jest różnica między przerwaniami zewnętrznymi a przerwaniami od timera. W kodzie nie wykorzystałem żadnego przerwania zewnętrznego.

W kodzie jest odesłanie do etykiety w przypadku wykrycia poziomu niskiego na jednym z wejść i nie wypuszczenie z bezcelowej pętli póki stan niski na tym pinie trwa. Wątpliwości mam tylko co do samego czasu przerwań. Jakoś to dziwnie wygląda, ale tak pokazał kalkulator, sam tego nie liczyłem.

[ Dodano: 2011-01-22, 15:14 ]
Pikczu pisze:Matrix w twoim kodzie jest poważny błąd.
Nie rozumiem czemu? Przecież w chwili gdy procek sprawdzi stan na danym pinie przeskoczy do etykiety i tam już nie wyjdzie z pętli póki na danym pinie będzie panował stan niski. W trakcie tej bezużytecznej krzątaniny w pętli while..wend wyskakuje z niej za pomocą przerwań.

Proszę o wyjaśnienie czemu to nie działa jak założyłem? Czy moje rozumowanie jest błędne?

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

Post autor: Pikczu » 22 sty 2011, 15:25

matrix pisze: Wiem jaka jest różnica między przerwaniami zewnętrznymi a przerwaniami od timera. W kodzie nie wykorzystałem żadnego przerwania zewnętrznego.

W kodzie jest odesłanie do etykiety w przypadku wykrycia poziomu niskiego na jednym z wejść
Przecież nie powiedziałem że nie wiesz tylko akurat my tu mówimy o przerwaniu zewnętrznym a ty jakiś screen z timerem dajesz.
Chodzi o to że twój kod za wolno reaguje na ten sygnał startu. i tak naprawdę mierzy czas nie od momentu pojawienia się sygnały na pind.0 tylko od momentu jak np skończy łaskawie wyświetlać pomiar poczeka sobie np o zgrozo te 3s łaskawie wróci do pętli do loop i sprawdzi o :?: pind0=0 to skoczy znowu i zacznie mierzyć.

Więc pomiary będą złe chyba ze jakimś cudem uda ci się trafić ze stanem nikim w moment jak program wchodzi akurat do pętli DO i sprawdzi stan pinu

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 22 sty 2011, 15:45

Pikczu pisze:Przecież nie powiedziałem że nie wiesz tylko akurat my tu mówimy o przerwaniu zewnętrznym a ty jakiś screen z timerem dajesz
Nie czytałem Waszych postów bo mi forum ich nie pokazało a od razu rzuciło do postu powyżej mojego, dlatego powstało nieporozumienie.


Pawełku i szanowni koledzy, to wait 3 jest po to by tylko pokazać wynik po skończonym pomiarze i służy do wykrycia i zmierzenia tylko jednego stanu niskiego a nie szeregu następujących po sobie.

Jedyne co mi nadal nie pasuje w moim kodzie to mimo że ustawiłem timer o tak krótkim czasie to to nie jest chyba to powinno być.

keruseykaryu

Post autor: keruseykaryu » 22 sty 2011, 18:29

matrix pisze:Może się nie znam, albo źle odczytuję ale na obrazku wszystko widać.
Na obrazku widać, że licznik zasypie program przerwaniami. Bo kto ustawia licznik tak, że co rozkaz maszynowy zgłasza on przerwania? Prescale = 1, licznik zlicza tylko jeden impuls... Rence opadają.

[ Dodano: 2011-01-22, 18:47 ]
A kolega agrala to w ogóle z jaką rozdzielczością, chce ten czas impulsów mierzyć? 0,1ms 0,05ms 0,01ms?

agrala
-
Posty: 34
Rejestracja: 17 sty 2011, 21:20
Lokalizacja: Kalisz

Post autor: agrala » 22 sty 2011, 19:17

Czym dokładniej tym lepiej.
Jeżeli chodzi Ci o mój prescaler to nie wiem jakich dokładnie czasów się spodziewac więc jest ustawione tak jak jest.
Jestem początkującym jeżeli chodzi o bascoma więc bez kozaczenia :grin:
W pomocy bascoma nic nie ma o SAVE, w oślej łączce też mi się w oczy nie rzuciło, tak samo w książce M. Wiązani.

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 22 sty 2011, 19:29

keruseykaryu pisze:Na obrazku widać, że licznik zasypie program przerwaniami. Bo kto ustawia licznik tak, że co rozkaz maszynowy zgłasza on przerwania? Prescale = 1, licznik zlicza tylko jeden impuls... Rence opadają.
Nie zrobilem tego po to by wywołać tak często przerwanie ale dlatego że wcześniej przy większym prescale program nie zliczał z odpowiednią szybkością i zrobiłem tylko po to by zobaczyć jaki będzie efekt. Na marginesie, nigdy nie stosuję tak częstych przerwań w swoich programach.

keruseykaryu

Post autor: keruseykaryu » 22 sty 2011, 20:43

agrala pisze:W pomocy bascoma nic nie ma o SAVE, w oślej łączce też mi się w oczy nie rzuciło, tak samo w książce M. Wiązani.
Coś słabiutko kolega szukał. Książka od str. 77.
agrala pisze:Jeżeli chodzi Ci o mój prescaler to nie wiem jakich dokładnie czasów się spodziewac więc jest ustawione tak jak jest.
Każdy program bez założeń wstępnych jest do bani. Musisz się na coś zdecydować.

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

Post autor: kayron » 22 sty 2011, 22:49

Nie żebym chciał was zbijać z waszych interesujących wywodów, zresztą nie czytałem ich całych, ale Timer1 ma taki rejestr jak ICRn i fajny tryb Input Capture Noise Canceler i a procesor końcówkę ICP1
( portB.0) która właśnie służy do pomiaru czasu trwania impulsu, bo pozwala przechwytywać wartość z Timera 1 do wymienionego rejestru.

agrala
-
Posty: 34
Rejestracja: 17 sty 2011, 21:20
Lokalizacja: Kalisz

Post autor: agrala » 23 sty 2011, 7:49

kayron pisze:Nie żebym chciał was zbijać z waszych interesujących wywodów, zresztą nie czytałem ich całych, ale Timer1 ma taki rejestr jak ICRn i fajny tryb Input Capture Noise Canceler i a procesor końcówkę ICP1
( portB.0) która właśnie służy do pomiaru czasu trwania impulsu, bo pozwala przechwytywać wartość z Timera 1 do wymienionego rejestru.
Próbowałem to wcześniej wykorzystać ale jak pisałem jestem początkującym i nie wychodziło mi nic z tego.
Kolego keruseykaryu, założenia wstępne byly takie że program ma działać. Nie wiedziałem jakich czasów się spodziewać więc zrobiłem tak jak jest. Nie mam oscyloskopu więc nie mam jak tych czasów pomierzyć. Układ ma służyć do pomiaru czasu wtrysku. Sprawdzenie układu odbędzie się w innym aucie gdzie mogę połączyć sie z ECU i odczytać czasy wtrysku i porównać z tym co pokaże mi ATmega.

ODPOWIEDZ