Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 28 paź 2024, o 22:25


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 27 ] 
Autor Wiadomość
PostNapisane: 5 sie 2012, o 16:24 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2011
Posty: 401
Lokalizacja: Siedlce
Pomógł: 7

Próbuję zrobić 4 programowe liczniki które będą zliczać impulsy cyfrowe.
Wejściami są piny PA0..PA3 ATMegi644PA taktowanej 16MHz. Piny podciągnięte do VCC jak należy.
Zwarłem piny wejściowe ze sobą i podaję impulsy ręcznie przyciskiem. Teoretycznie wszystkie 4 liczniki powinny zliczyć tę samą wartość jednak tak się nie dzieje. Jak bym nie kombinował to po jakimś czasie liczniki się rozjeżdżają. Gdzie robię błąd?
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
Czekamy na RedBook'a!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sie 2012, o 16:35 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2012
Posty: 598
Lokalizacja: Warszawa
Pomógł: 13

I pewnie to są microswiche .......... a to znaczy żę mają efekt drgań styków i błąd może wynikać z tego faktu

------------------------ [ Dodano po: 5 minutach ]

A czy ty czasem nie masz zamiaru zliczać impulsów z wiatraczka ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sie 2012, o 16:56 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2011
Posty: 401
Lokalizacja: Siedlce
Pomógł: 7

Na 4 piny procesora fizycznie i jednocześnie wchodzą te same sygnały, więc co tu mają drgania styków? I nie - to nie będzie do wentylatorów akurat...

_________________
Czekamy na RedBook'a!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sie 2012, o 17:09 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2012
Posty: 598
Lokalizacja: Warszawa
Pomógł: 13

A tak mi przyszło do głowy ..........
Co do wentylatorów bardzo podobną technikę stosuję się przy kilku wentylatorach komputerowych jeżeli się chce odczytywać ich prędkości obrotowe.

------------------------ [ Dodano po: 16 minutach ]

A czasem funkcja obsługa pulsów nie powinna być wywołana zamiast tak obsluga_pulsow((~PINA & 0b00001111)); np tak obsluga_pulsow((PINA & 0b00001111));

Nie bardzo wiem jak to powinno wyglądać w tym przypadku ...... ale jakoś wzrokowo nie bardzo mi to pasuje

------------------------ [ Dodano po: 18 minutach ]

A nawet na pewno ..... przecież chcesz odczytać wartość na PINA więc używasz maskowania żeby uzuskać wartości, więc na pewno ta tylda nie jest potzreba



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sie 2012, o 17:33 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2011
Posty: 401
Lokalizacja: Siedlce
Pomógł: 7

Domyślnie na pinach jest stan wysoki więc (PINA & 0b00001111) daje gdy nic się nie dzieje wynik 0b1111 = 15 natomiast (~PINA & 0b00001111) da 0b0000 = 0. Różnica niewielka, moim zdaniem bez wpływu na działanie całości.

_________________
Czekamy na RedBook'a!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sie 2012, o 17:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2012
Posty: 598
Lokalizacja: Warszawa
Pomógł: 13

A raczej duża.
ponieważ nie negujesz całego wyrażenia, a tylko sam port i zamiast czytać rejestr 0x19 (PINA) dzięki tyldzie czytasz i maskujesz rejestr 0xE6 ( nawet nie wiem co to jest), innaczej by było gdyby tylda była przed nawiasem czyli ~(PINA&0b00001111)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sie 2012, o 17:50 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2011
Posty: 401
Lokalizacja: Siedlce
Pomógł: 7

Uh... a myślałem, że to neguje wartość.

_________________
Czekamy na RedBook'a!



Ostatnio edytowano 5 sie 2012, o 17:56 przez szopler, łącznie edytowano 2 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sie 2012, o 17:55 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2012
Posty: 598
Lokalizacja: Warszawa
Pomógł: 13

A jeżeli użyjesz tyldy w ten sposób jak napisałem to powinieneś wykorzystać maskowanie jeszcze raz w samej funkcji żeby ukryć wyższe bity.

Na przykłąd wartość portu przed negacją będzie np:

00001001
teraz negacja
11110110
i taka wartość jest przekazywana, żeby teraz była dobra dla ciebie powinieneś jeszcze raz ją zamaskować czyli:
11110110&b00001111 i dopiero teraz będziesz miał prawidłową wartość dla instrukcji switch czyli:
00000110



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sie 2012, o 17:59 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2011
Posty: 401
Lokalizacja: Siedlce
Pomógł: 7

OK. To zmieniłem. Nie miało wpływu na błędy zliczania, które nadal występują.

_________________
Czekamy na RedBook'a!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sie 2012, o 18:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2012
Posty: 598
Lokalizacja: Warszawa
Pomógł: 13

No to ja nie mardzo mam pomysł .... co jest nie tak....

Jedynie ja osobiście bym jeszcze zrezygnował z odczytu stanu portów w funkcji na rzecz przerwania.
np: if (!(PINA&(1<<0))) PULSE.A++;



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sie 2012, o 19:38 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

To pewnie działanie sił nieczystych :twisted: = stanów nieustalonych. Bo w końcu odczyt wszystkich linii występuje w tym samym momencie.
Duża prędkość taktowania nie jest tutaj bez winy.
Jaka ma być częstotliwość impulsów, które chcesz zliczać? Może dobrym testem byłoby wygenerowanie tej częstotliwości na wolnym kanale PWM i podanie na wejścia przez pewien czas.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sie 2012, o 20:05 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2011
Posty: 401
Lokalizacja: Siedlce
Pomógł: 7

No właśnie - odczyt jest w tym samym momencie. Jak mam zwarte piny wejściowe to cały czas powinien wykonywać się ten sam "case", ale jednak coś się krzaczy.
Maksymalna częstotliwość przychodzących impulsów to 5kHz, ale zwykle jest to nawet 100x mniej.

_________________
Czekamy na RedBook'a!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sie 2012, o 23:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2011
Posty: 401
Lokalizacja: Siedlce
Pomógł: 7

Wracając jednak do meritum... ?

_________________
Czekamy na RedBook'a!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sie 2012, o 23:36 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2012
Posty: 598
Lokalizacja: Warszawa
Pomógł: 13

Z tym draganiem to chodzi o to że; pomiedzy odczytem stanu jedengo pinu a drugiego mija pewien czas i mimo wciśniętego przycisku może zmienić się stan jednego z pinów. Ja bym to sprawdził za pomocą dwóch zwieranych przewodów, bo tam raczej nie występują drgania styków

------------------------ [ Dodano po: 7 minutach ]

Co do tego czy mam rację z negacją bitową możesz zrobić prosty eksperyment wartość zamiast wrzucać do funkcji wyrzuć na wyświetlacz i wszystko będzie jasne. np tak lcd_int(PINA) oraz lcd_int(~PINA) znając stan portów będziesz wiedział co uzyskałeś.
Ja dzisiaj raczej nie ma takiej możliwości, ale jutro nawet tak dla siebie to sprawdzę

------------------------ [ Dodano po: 13 minutach ]

I całkiem rozsądna jest podpowieź kol Krauser żeby zrobić programowy PWM. Timer i tak masz już odpalony to czemu nie podłączyć tych pinów od przerwania do jakiegość pinu i nie zmieniać jego stanu poprzez timer.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sie 2012, o 00:01 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2011
Posty: 401
Lokalizacja: Siedlce
Pomógł: 7

Tyle, że nawet przy podłączeniu generatora wzorcowego z oscyloskopu - 1kHz 0.5V (przez wzmacniacz operacyjny naturalnie) problem zliczania występuje.

_________________
Czekamy na RedBook'a!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sie 2012, o 08:05 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2012
Posty: 598
Lokalizacja: Warszawa
Pomógł: 13

Hmmmm, więc tak ...... wgrałem Twój programik u siebie na płytkę i zasuwa jak ta lala. Nawet się nie chce pomylić o jeden, a robi już jakieś 20 okrążenie.
Jedyna różnica jest taka że ja akurat w tej chwili popędzam atmegę kwarcem 11 MHz, jak wygrzebię jakiś szybszy to zmienię i sprawdzę jeszcze raz . Powiedz mi jeszcze tylko jak mam rozumieć "stwierdzenie w dłuższym okresie czasu"



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sie 2012, o 08:09 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

1. Inny prosty test. Piny Porta.0..4 nadal masz połączone razem i do generatora.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

skoro piny są spięte razem to LED nigdy się nie powinien zapalić.
2. Spróbuj zmniejszyć częstotliwość taktowania (linie wyłączone poprzez komentarz)

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sie 2012, o 09:20 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2012
Posty: 598
Lokalizacja: Warszawa
Pomógł: 13

Więc tak ..... udało mi się wywyołać taki przypadek jak u ciebie. U mnie powodem takiej sytuacji było to że nie było prawidłowego styku do portów.

Postaram się to w miarę przejrzyście opisać.
Test zrobiłem na timerze który masz odpalony zmieniając stan jednego z wyjść co 2ms, wejście podpiełem pod nózki od przerwań PCINT.

I tak, jeżeli nie odłączałem nóżki "mojego generatora" to się kręciło jak należy, ale w momencie jak zacząłem podłączać i odłączać w miarę szybko kabelek to liczniki sie rozjechały jak siemasz.
Dla mnie wniosek jest taki że w przypadku microswicha jednak dużą rolę odgrywają drgania styków ponieważ uC nie ma na tyle dużo czasu aby prawidłowo odczytać stany na nóżkach od przerwań. Skoro u ciebie rozjeżdżają się za każdym razem to myślę że jest problem gdzieś z jakością połączeń lub z zakłóceniami.
Jeżeli się mylę to bardzo proszę o naprostowanie mojego rozumowania ;) za co będę bardzo wdzięczny :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sie 2012, o 13:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2011
Posty: 401
Lokalizacja: Siedlce
Pomógł: 7

Zabieram się zatem za testy...
Krauser napisał(a):
1. Inny prosty test. Piny Porta.0..4 nadal masz połączone razem i do generatora.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

skoro piny są spięte razem to LED nigdy się nie powinien zapalić.
2. Spróbuj zmniejszyć częstotliwość taktowania (linie wyłączone poprzez komentarz)


Led zapala się natychmiast :P

_________________
Czekamy na RedBook'a!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sie 2012, o 13:58 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2012
Posty: 598
Lokalizacja: Warszawa
Pomógł: 13

Przed chwilką sprawdziłem jeszcze raz i nadal nie ma róznicy pomiędzy poszczególnymi licznikami, a kręci się już chyba od 10 rano



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sie 2012, o 14:34 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

szopler napisał(a):
Led zapala się natychmiast :P

Led powinna być wpięta pomiędzy wyjście a masę. Mam nadzieję, że kod jest dobry.
A co jak nie podasz sygnału?
A jak się zachowuje przy obniżonym taktowaniu?

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sie 2012, o 14:57 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2011
Posty: 401
Lokalizacja: Siedlce
Pomógł: 7

Podłączenie jest takie: PB0 -->|-- rezystor - GND
Od razu po wgraniu programu zapala się LED niezależnie od taktowania nawet jak do portu PA nie jest nic podłączone.
W kodzie chyba zabrakło '&' ;).

Jest PORTB = ~(1<<PB0);
Powinno być PORTB &= ~(1<<PB0);

I tak led od razu ON.

Faktycznie jak generuję prostokąt na jednym z pinów i podłączę do wejść to liczy poprawnie.

_________________
Czekamy na RedBook'a!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sie 2012, o 18:10 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

W programie dałem błędny warunek, bo powinno być
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sie 2012, o 18:56 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2011
Posty: 401
Lokalizacja: Siedlce
Pomógł: 7

OK.

Jest jeszcze jeden poważny babool nad którym pracuję ;).
Jak pod jeden pin podłączę generator a pod drugi przycisk i wcisnę przycisk to licznik do niego przypisany liczy w tempie generatora zamiast wykonać jedno zliczenie i stop.

_________________
Czekamy na RedBook'a!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sie 2012, o 19:17 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

To musisz przebudować program, bo zmiana stanu powoduje odczyt. Ciągłe zero jest traktowane jako zmiana stanu również pod warunkiem, że inne wejście wyzwoliło przerwanie od zmiany stanu. Musisz zapamiętać ostatni stan każdego bitu i jak się nie zmienił to usunąć go przed instrukcją switch. Do tego celu dobrze nadaje się XOR (^).

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sie 2012, o 20:54 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2011
Posty: 401
Lokalizacja: Siedlce
Pomógł: 7

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Mam dziwne wrażenie, że teraz zlicza oba zbocza...

_________________
Czekamy na RedBook'a!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 sie 2012, o 08:00 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Tak. Zlicza oba zbocza, ale można to poprawić.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Teraz port musi i się zmienić i zmienić się na 0 (po zanegowaniu 1).


Autor postu otrzymał pochwałę

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 27 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Majestic-12 [Bot] i 0 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO