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



Teraz jest 29 mar 2024, o 01:36


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 31 ]  Przejdź na stronę 1, 2  Następna strona
Autor Wiadomość
PostNapisane: 25 lip 2014, o 01:25 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 cze 2013
Posty: 137
Lokalizacja: Kraków
Pomógł: 0

Hej!
Mam pozornie prostą rzecz do załatwienia - za pomocą timera Attiny13 muszę generować przebieg prostokątny w okolicach 36kHz, a jednocześnie mieć do dyspozycji przerwanie generowane z częstotliwością 1kHz. Wiem jak się za to zabrać i wiem jak powinno to wyglądać, ale nie mam pojęcia czemu mi nie działa :D. Takie coś wymodziłem:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Generowanie przebiegu działa w porządku - dioda podpięta pod OC0A faktycznie świeci nieco słabiej niż ta ze stałym zasilaniem (sprawdzałem jeszcze przy mniejszej częstotliwości i miga jak marzenie :D). Niestety nie mam pojęcia dlaczego nie wykonuje się linijka z przerwania TIM0_COMPB.
No mi osobiście wydaje się że kod raczej jest poprawny - gdzie tkwi kłopot? Uprzedzę pytanie: wszystkie diody i piny są sprawne, testowałem je już kilka razy zanim zacząłem pisać tego posta.
Proszę o jakąś podpowiedź, bo nie dam rady ruszyć z programem jak mi taka podstawowa rzecz nie chce działać ^^. Z góry dzięki!

_________________
Więcej dziwactw na: www.youtube.com/user/mopsiok



Ostatnio edytowano 28 lip 2014, o 11:59 przez mopsiok, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lip 2014, o 02:48 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Musisz zrobić odwrotnie. OCR0B = 1 a OCR0A = 149.

Rejestr A jest jakby ważniejszy, w tym sensie, że po tym jak wykonana się poprawne porównanie licznika z jego zawartością, licznik zostanie wyzerowany. Jeśli A jest mniejsze od B to licznik nigdy nie będzie miał okazji by osiągnąć wartość B.

Gdyby to był PWM to licznik liczyłby do 255, ale przy CTC jest zerowany gdy zrówna się OCR0A.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lip 2014, o 04:06 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27212
Lokalizacja: Szczecin
Pomógł: 1041

sq8dsr napisał(a):
Rejestr A jest jakby ważniejszy,


Dokładniej mówiąc - spójrz pan tutaj:

Obrazek

czyli do noty PDF, bo to bardzo częsty błąd początkujących z tym przerwaniem CompareB

Skoro Timer się resetuje przy doliczeniu MAX ustawionego w OCRA = 1, to jak może dojść zliczanie do wartości 149 ustawionej w OCRB ? żeby miało się przerwanie wykonać ?

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lip 2014, o 10:41 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 cze 2013
Posty: 137
Lokalizacja: Kraków
Pomógł: 0

Ha, wiedziałem że jak zwykle zepsułem coś prostego ^^. Mirku, właśnie ten zapis w tabelce mnie zastanawiał (w sensie - czemu akurat A, i czemu OCRA, a nie OCR0A). No ale nic, dzięki wielkie za uświadomienie. Wiedziałem że można na Was liczyć :D.

Pozdrawiam!

------------------------ [ Dodano po: 14 minutach ]

Niestety jest kolejny problem :(. Zamieniłem to tak jak radziliście:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Tym razem na stałe świecić ma dioda na PB0, na PB1 ma być częstotliwość 2.5kHz (5kHz/2, bo generujemy prostokąt), a na PB2 ma być 500Hz (1kHz/2). Niestety zarówno na PB2 jak i PB1 (OC0B) generuje się 500Hz. Tak jakby w ogóle nie brał pod uwagę że OCR0B jest mniejszy, i cały czas zliczał do OCR0A dla obu kanałów... Wiecie może z czego to może wynikać?

_________________
Więcej dziwactw na: www.youtube.com/user/mopsiok



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lip 2014, o 12:59 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 gru 2011
Posty: 450
Pomógł: 4

Popraw jeszcze tą linijkę
8. PORTB = 1<<0;



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lip 2014, o 14:43 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 cze 2013
Posty: 137
Lokalizacja: Kraków
Pomógł: 0

Przyznam że nie do końca rozumiem o co Ci chodzi... co z nią nie tak?
Bardzo byłbym wdzięczny za pomoc z tym timerkiem. Już i tak Attiny będzie miała kupę rzeczy do roboty (m.in. obsługę kilkunastu klawiszy i nadawanie danych), a nie chcę jeszcze się zajmować ręcznym generowaniem sygnału rzędu 40 kHz. :cry:

_________________
Więcej dziwactw na: www.youtube.com/user/mopsiok



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lip 2014, o 16:11 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 gru 2011
Posty: 450
Pomógł: 4

No brakuje chyba nawiasów (1<<0) i znaku OR | przez =


Doczytałem ,że PB0 ma świecić na stałe, więc powinno chyba być tak

PORTB &= ~(1<<0);



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lip 2014, o 16:53 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27212
Lokalizacja: Szczecin
Pomógł: 1041

worner napisał(a):
Doczytałem ,że PB0 ma świecić na stałe, więc powinno chyba być tak

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


jeśli dioda podłączona jest KATODĄ do pinu to tak, ale jeśli autor podłączył anodą do pinu to jest dobrze tak jak przedtem

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


1. nawiasów nie musi być - choć ładniej wygląda z nawiasami
2. OR przed = nie musi być - jeśli autor zakłada że stany na pozostałych pinach PORB mogą być = 0
3. po prostu to co wyżej jest równoważne:

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


bo wartością wyrażenia

(1<<0) jest właśnie liczba = 1 ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lip 2014, o 17:42 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 cze 2013
Posty: 137
Lokalizacja: Kraków
Pomógł: 0

Panowie, ta linijka jest tylko tymczasowo (jak cały kod, zresztą) żeby widzieć jak dioda świeci "na pełnej mocy". Oczywiście zazwyczaj piszę w nawiasach żeby uniknąć ewentualnych błędów, tu jakoś tak wyszło że jest bez. Niemniej nie ma to znaczenia, bo timer jak nie działał tak nie działa :D. Może ktoś ma jakieś sugestie czym to może być spowodowane?

_________________
Więcej dziwactw na: www.youtube.com/user/mopsiok



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lip 2014, o 18:19 
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

Sprzętowo nie wygenerujesz jednym timerem 2 różnych częstotliwości. Timer przy ustawieniu w tryb CTC zlicza od 0 do OCR0A. Przy porównaniu z mniejszą wartością (OCR0B) zmienia sprzętowo stan OC0B, ale na kolejną zmianę stanu musisz czekać, aż timer doliczy do OCR0A (ale to jeszcze nie ten moment) potem zacznie liczyć od 0 i dojdzie do takiej wartości jaka jest wpisana do OCR0B. Częstotliwość zależy od OCR0A.

Zrób tak, że większą częstotliwość generuj w trybie CTC sprzętowo (OCR0A = 29)
Okres mniejszej częstotliwości będzie musiał być wielokrotnością okresu wyższej częstotliwości. Do skonfigurowane wcześniej trybu dokłada się przerwanie i w tym przerwaniu definiuje się zmienną statyczną, która zlicza przerwania i jak dojdzie do określonej wartości to ją zerujesz i wykonujesz akcję lub ustawiasz flagę.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lip 2014, o 19:14 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27212
Lokalizacja: Szczecin
Pomógł: 1041

Krauser napisał(a):
Sprzętowo nie wygenerujesz jednym timerem 2 różnych częstotliwości. Timer przy ustawieniu w tryb CTC zlicza od 0 do OCR0A. Przy porównaniu z mniejszą wartością (OCR0B) zmienia sprzętowo stan OC0B, ale na kolejną zmianę stanu musisz czekać, aż timer doliczy do OCR0A (ale to jeszcze nie ten moment) potem zacznie liczyć od 0 i dojdzie do takiej wartości jaka jest wpisana do OCR0B. Częstotliwość zależy od OCR0A


Dokładnie - sam się teraz z ciekawości bliżej temu przyjrzałem testując w międzyczasie na m32 ;) i po chwili ... no tak... właśnie to samo mnie naszło co napisał Krauser ...

Krauser napisał(a):
Okres mniejszej częstotliwości będzie musiał być wielokrotnością okresu wyższej częstotliwości. Do skonfigurowane wcześniej trybu dokłada się przerwanie i w tym przerwaniu definiuje się zmienną statyczną, która zlicza przerwania i jak dojdzie do określonej wartości to ją zerujesz i wykonujesz akcję lub ustawiasz flagę.


Tylko że przy tak dużych częstotliwościach o jakich mowa wyżej może się okazać że w przerwaniu może być za mało czasu aby próbować tam banglować tą zmienną dodatkową - no ale to już warto sprawdzić na żywym organizmie ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lip 2014, o 19:53 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Tak częstotliwość na jednym i na drugim będzie taka sama, wypełnienie będzie tylko inne...

Ale z tymi przerwaniami nie jest tak tragicznie. np. 16MHz. Teoretycznie 0,1 ms to będzie 1600 taktów. Więc króciutkie przerwanko powinno się wyrobić. Nawet 400 taktów powinno wystarczyć, a można zwiększyć taktowanie do 20 MHz w takim przypadku. Tylko oczywiście program główny nie może być zbyt czasożerny. Bo niewiele miejsca może zostać :P

W sumie nikt nie powiedział, że większość programu nie może się wykonywać w przerwaniu :lol:

Ale lepiej oczywiście, przy takich potrzebach dać dwa timery, w sumie po to są.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lip 2014, o 20:09 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 cze 2013
Posty: 137
Lokalizacja: Kraków
Pomógł: 0

Ojej, fatalnie... tego się obawiałem :(.
Zaraz będę jeszcze testował, ale szczerze wątpię żebym się wyrobił. To ma być coś w rodzaju pilota RC5, zasilanie bateryjne 3V. Stąd też nie mogę sobie pozwolić na takie wysokie częstotliwości (zresztą i tak nie mam miejsca na zewnętrzny zegar, używam wszystkich pinów). Potrzebuję czytać stan 12 przycisków (przez ADC) i generować kod Manchester zmodulowany częstotliwością 36-38kHz. Gdybym tylko miał drugi timer to byłaby szansa że się z tym wszystkim wyrobię na 1.2MHz. Niestety widzę że poniżej 4.8Mhz nie ma co liczyć (a prąd rośnie...). Mam co prawda pomysł na zaoszczędzenie energii gdy pilot nie jest używany (usypianie po jakimś czasie bezczynności i przycisk na PCINT wybudzający attiny z trybu power down), ale i tak trzeba na nią uważać.
Oczywiście mógłbym zrobić to wszystko na Atmedze88 - każdy przycisk na osobnym pinie, dużo timerów itp. Ale wtedy nie byłoby takiej frajdy :mrgreen:.

No nic, rozmarzyłem się troszeczkę. Dzięki Wam Panowie za nakierowanie, przyznam że jestem trochę rozczarowany tą Attiny13 (4 kanały ADC, 6 PCINTów, a tylko 1 timer :) ), ale zobaczymy. Jakbym się jednak zmieścił przy 4.8MHz i pojawią się jakieś kłopoty, to pozwolę sobie tu jeszcze napisać.

Pozdrowienia!

_________________
Więcej dziwactw na: www.youtube.com/user/mopsiok



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lip 2014, o 20:18 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Zawsze można inaczej podejść do generowania tej nieszczęsnej nośnej. Np. dać ne555 aby ją generował. A jej kluczowanie zrzucić na procesor.
Są jeszcze mniejsze proce niż at13, np. at10 :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lip 2014, o 21:01 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 cze 2013
Posty: 137
Lokalizacja: Kraków
Pomógł: 0

No można i tak, tylko szkoda mi miejsca na płytce na takie starocie ^^. Cena za attiny13 i typową aplikację na ne555 wyjdzie podobnie jak za atmegę88, a tylko 4 razy więcej miejsca zajmie.

Przetestowałem proponowane przez Was rozwiązanie. Działać - działa, ale przyznam że ze zgrozą patrzę na długość wygenerowanego kodu przerwania. Nawet na 4.8MHz ledwo się to mieści.
W sumie tak sobie przypomniałem, że wcale nie muszę zachowywać koniecznie standardu RC5 - zarówno nadajnik jak i odbiornik robię samemu (chciałem zachować kompatybilność z typowymi pilotami, ale cóż - nie jest to najważniejszy cel). Skoro tak, to zamiast 889us na "półbit" mógłbym przeznaczyć np. 16ms :). Wtedy cała ramka wysyłać się będzie jakieś pół sekundy, więc całkiem znośnie. Tak sobie pomyślałem, że skoro nie potrzebuję aż takiej częstotliwości, to może by wykorzystać watchdoga? ;) Wg noty przy najmniejszym preskalerze generuje on przerwanie właśnie co 16ms.

Co o tym myślicie? Ma to w ogóle jakiś sens? Pytam, bo nie chcę żeby się skończyło tak że zacznę szukać informacji, projektować, kodować, testować, naprawiać, a potem się okaże tak jak wcześniej że to nie ma sensu :D.
Dzięki za wszelką pomoc!

_________________
Więcej dziwactw na: www.youtube.com/user/mopsiok



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lip 2014, o 21:12 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Pomysł fajny. Tylko że ramka przez 0,5 sekundy... A jak część ramki się uszkodzi, trzeba będzie powtarzać, to się zrobi już ponad seknda.
Skoro już mówimy o własnym standardzie to przecież nie musisz nadawać takiej długiej ramki. Ile ma być komend ?
Dwa bity to już 4 komendy + plus jakiś nagłowek prosty.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lip 2014, o 21:27 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27212
Lokalizacja: Szczecin
Pomógł: 1041

mopsiok napisał(a):
. Skoro tak, to zamiast 889us na "półbit" mógłbym przeznaczyć np. 16ms


Nie kombinuj za mocno, sprawdź w nocie odbiornika TFMS - bo może się zatykać i wszystko ci padnie ...

ja się zawsze dziwię po co robić taką gimnastykę jak można wziąć chociażby ATtiny25/48/85 i nie dość że masz kupę pamięci każdej więcej to i jeszcze dwa timery a obudowa ta sama - zamiast na siłę wciskać się w tiny13 ? ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lip 2014, o 22:09 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 cze 2013
Posty: 137
Lokalizacja: Kraków
Pomógł: 0

Ech... chciałem jakoś inaczej podejść do problemu pilota IR, ale chyba jednak Mirku wbiłeś gwóźdź do trumny mojego rozwiązania. Fajnie by było zrobić to tylko na Attiny13, szczególnie że odczyt 12 przycisków i modulowanie nośnej 36kHz mam już obmyślone i względnie napisane. Niemniej nie będę ryzykować komunikacji, bo pilot to będzie jedyna przyjemna opcja rozmawiania z odbiornikiem (no, będzie też UART, ale komu by się chciało z kablem latać :) ).
Co prawda w datasheecie mojego TSOPa nie znalazłem konkretnej maksymalnej wartości, ale nie będę ryzykował. Już i tak to rozwiązanie ma za dużo uproszczeń i kombinacji. No nic, pozostaje mi zrobić kolejny nudny nadajnik RC5 na Atmedze168 ;) (to najmniejsze co mam - poza attiny13 i 10).

Dzięki Wam za wyjaśnienie mi moich wątpliwości, ale jak widać takie rozwiązanie ma niewiele sensu. Być może kiedyś wykonam pilocik oparty na zasadach opisywanych w tym temacie, ale na pewno nie będę go stosował do niczego istotnego :lol:. Dzięki raz jeszcze i przepraszam za zawracanie głowy.

_________________
Więcej dziwactw na: www.youtube.com/user/mopsiok



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lip 2014, o 00:59 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Są ludzie którzy uwielbiają ATtiny :)
Mam kolegę, który na at10 napisałem obsługę pomiarów na zewnętrznym ADC (I2C) oraz wsadził w to jeszcze własny protokół transmisji szeregowej. Oczywiście napisane w całości w ASM.

Mnie na razie udało się zmusić AT10 do wysterowania paska WS-ek. :) Ale oczywiście te 32B ramu uniemożliwiają bardziej normalne sterowanie z buforem, trzeba robić w locie. Fakt że MCU jest wielkości praktycznie tranzystora SMD może czymś takim fajnym :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lip 2014, o 06:18 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27212
Lokalizacja: Szczecin
Pomógł: 1041

Tak ja też na Tiny10 bawiłem się Magic LED'ami, nawet optymalizując jeszcze bardziej wstawkę ASM, buforowanie jak mówisz wtedy odpada praktycznie i trzeba w locie to robić ... ale efekt jest o tyle fajny, że wygląda to tak jakby jakaś mała mucha przysiadła sobie na brzegu taśmy i nią sterowała :lol:

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lip 2014, o 09: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

mopsiok napisał(a):
Ech... chciałem jakoś inaczej podejść do problemu pilota IR, ale chyba jednak Mirku wbiłeś gwóźdź do trumny mojego rozwiązania. Fajnie by było zrobić to tylko na Attiny13, szczególnie że odczyt 12 przycisków i modulowanie nośnej 36kHz mam już obmyślone i względnie napisane.
Możesz to zrobić na Attiny13... tylko zapomnij to co obmyśliłeś :lol:
Z tego co wyczytałem marzy ci się pilot z analogową klawiaturą. Generuj nośną timerem i nie włączaj przerwania. Masz przecież przerwanie po zakończeniu konwersji. Obudź sobie procesor ze stanu PowerDown przerwaniem od zmiany stanu. Włącz przetwornik i wykorzystaj to cykliczne przerwanie do skanowania klawiatury i po okresie bezczynności przejdź do PowerDown. Możesz też wysyłać jakiś znak w kosmos, aby wykorzystać przerwanie modułu UART( często UART wykorzystuje się do generowania sygnału prostokątnego jeśli nie ma timera z PWM). Częstotliwość taktowania watchdoga jest podawana tylko orientacyjnie. Nie nadaje się on do precyzyjnego odmierzania czasu.


Autor postu otrzymał pochwałę

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lip 2014, o 11:00 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 cze 2013
Posty: 137
Lokalizacja: Kraków
Pomógł: 0

Łał, widzę że temat się przyjął :D. Czyli proponujesz żeby nośną generować tak jak chciałem, a przetwornik ADC ustawić w tryb free running mode tak żeby generował przerwanie 1kHz? Wewnątrz dać licznik i sprawdzać odczyt tylko co 100 przerwań (co 100ms), a gdy już wyłapie wciśnięty przycisk to ustawić flagę wysyłania znaku, która w kolejnych przerwaniach będzie powodować odpowiednie modulowanie pinem OC0A przez ustawianie/zerowanie flagi COM0A0 w rejestrze TCCR0A. No, przyznam szczerze że nawet bym to widział ;). Dzięki wielkie za koncept, rzeczywiście ma to o wiele większy sens. Akurat w tym przypadku zrobię już pilot na atmedze (siedziałem do 4 rano i robiłem PCB, więc już mi się nie opłaca tego zmieniać ^^), ale na pewno zapamiętam Twój pomysł na wypadek gdybym kiedyś chciał takiego dziwoląga zrobić :D.

_________________
Więcej dziwactw na: www.youtube.com/user/mopsiok



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lip 2014, o 11:42 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

A skoro już jesteśmy przy IR oraz małych prockach. To może ktoś wpadł na fajny pomysł rozwiązania odbioru IR bez używania ICP ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lip 2014, o 11:54 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 cze 2013
Posty: 137
Lokalizacja: Kraków
Pomógł: 0

Jak procek nie ma ICP to zawsze można używać przerwania PCINT i programowego licznika do zliczania czasu, ale zasada jest podobna. Właśnie wczoraj szukałem informacji na ten temat i znalazłem też dość ciekawą notę Atmela na temat dekodowania RC5: http://www.inforeg.lt/handbooks/Atmel/a ... oc2817.pdf .

_________________
Więcej dziwactw na: www.youtube.com/user/mopsiok



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lip 2014, o 13:44 
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

mopsiok napisał(a):
Akurat w tym przypadku zrobię już pilot na atmedze (siedziałem do 4 rano i robiłem PCB, więc już mi się nie opłaca tego zmieniać ^^)
I po premii :lol:
Radzę przemyśleć tą decyzję. Jak firma sprzeda 1 mln pilotów w ciągu roku i dzięki użyciu powiedzmy attiny5 zaoszczędzisz 10 groszy to chyba dostaniesz te marne 10%. A to wychodzi:
1 mln*0,1zł*10%= 10k
Ile atmeg można za to kupić ;)

Pozostaje jeszcze kwestia omówienia przerwania od zmiany stanu przy użyciu klawiatury analogowej. Nie pokazałeś schematu :( Czy zamierzasz wykorzystać jeden pin? Wtedy według moich obliczeń wypadałoby, aby każdy klawisz generował napięcie poniżej 3V*0.3 = 0,9V. Tylko wtedy procesor rozpozna to jako stan niski i wygeneruje przerwanie od zmiany stanu. A może lepiej klawisze dać do plusa, bo stan wysoki ma nieco szerszy zakres napięć (od 0,6*3V).

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lip 2014, o 14:18 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 cze 2013
Posty: 137
Lokalizacja: Kraków
Pomógł: 0

Hah :D Projekt jest raczej prywatny, nie planuję produkować miliona sztuk :mrgreen:.
Przyznam że temat jest tak ciekawy że chyba jednak spróbuję w nim swoich sił. Płytkę pod megę88 mam już przygotowaną, niech sobie czeka na swoją kolej, a na chwilę obecną zabiorę się za prototyp na attiny i zobaczymy czy coś z tego wyjdzie.
Jeszcze wracając do przerwania ADC, to widzę że maksymalny preskaler ma 128, co przy 1.2MHz daje 9375Hz. Zatem trzeba jeszcze dać kolejny "programowy preskaler" wewnątrz przerwania, o wartości np. 9 (wtedy wyjdzie 1042 Hz). Mam już zarys przerwania, idę kodzić bo normalnie taka mnie wzięła chętka że nie ma słów :D.

Odnośnie analogowych przycisków, to planowałem zrobić taką jakby drabinkę przyciskowo-rezystorową.... Takie coś wymodziłem:
Obrazek
Co prawda w takim rozwiązaniu ciężko obsłużyć przypadek gdy wciśnięte zostało wiele przycisków naraz, ale akurat na pilocie raczej się tego nie robi :).
Oczywiście w przerwaniu ADC na zmianę ustawiać będę kanał na ADC2 i ADC3, żeby móc odczytywać każdy z 12 przycisków.

_________________
Więcej dziwactw na: www.youtube.com/user/mopsiok



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lip 2014, o 17:31 
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

Patrząc ekonomicznie to używanie, aż tylu wartości rezystorów powoduje znaczne koszty wdrożenia podnosząc jednocześnie koszt magazynowania. Zaopatrzeniowiec będzie jęczał: "5 wagonów rezystorów". Tak wiem
mopsiok napisał(a):
Hah Projekt jest raczej prywatny, nie planuję produkować miliona sztuk .

ale Mirek chyba kiedyś też tak mówił ;)
No i co z tym wybudzeniem z PowerDown po wciśnięciu jednego z klawiszy?
Podam Ci inne rozwiązanie znalezione gdzieś na krańcach internetu:
Obrazek
Wartości rezystorów są tak dobrane, aby wybudzić mirokontroler i jednocześnie, aby poszczególne klawisze dawały w miarę równomierny rozkład pomiarów. Przykładowo dla klawisz SW1 na wyjściu jest: 3V*(3*240R+3*1k)/(3*240R+3*1k +10k)=0,81V, a dla SW2 mamy: 3V*(2*240R+3*1k)/(2*240R+3*1k +10k) = 0,77V.


Autor postu otrzymał pochwałę

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lip 2014, o 18:06 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 cze 2013
Posty: 137
Lokalizacja: Kraków
Pomógł: 0

Santa Maria, toż to jest genialne :D. No nie mogę się napatrzeć normalnie! Tak liczę i faktycznie rozkład jest równomierny, ale różnica między przyciskami jest na poziomie 60mV, a maksymalna wartość do uzyskania to właśnie 0.81V. Naprawdę układ jest świetny, ale boję się że attiny nie starczy dokładności i będzie wysyłać nie te komendy co trzeba. Nawet jak użyję 10-bitowej rozdzielczości, to i tak przecież w grę wchodzą błędy przetwornika ADC (nieliniowość, przesunięcie, itp. - pełno ich w nocie). Ale oczywiście jak najbardziej sprawdzę to rozwiązanie, bo jestem nim dosłownie urzeczony :). Szczególnie że automatyczne wybudzanie to też łakomy kąsek. Na chwilę obecną planowałem po prostu kolejny przycisk podpięty pod PCINT, który włączałby pilot (i dioda sygnalizacyjna czy pilot działa - po jakimś czasie bezczynności po prostu by się wyłączała, a procek się usypiał).

P.S.
No by Cię licho Krauser - to już któryś mój temat, w którym przy okazji pokazujesz mi tego typu perełkę... jak Ty to robisz? :mrgreen:.

_________________
Więcej dziwactw na: www.youtube.com/user/mopsiok



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lip 2014, o 19:31 
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

mopsiok napisał(a):
Naprawdę układ jest świetny, ale boję się że attiny nie starczy dokładności i będzie wysyłać nie te komendy co trzeba. Nawet jak użyję 10-bitowej rozdzielczości, to i tak przecież w grę wchodzą błędy przetwornika ADC (nieliniowość, przesunięcie, itp. - pełno ich w nocie).
i na dodatek skoro używa ADC to jest... drogi. Jakby zamiast attiny 5 zastosować attiny 4 to zaoszczędzi się 5 groszy (kolejne 5k premii). Klasyczny układ z rezystorem podciągającym czy ten wyżej opisany ma jeszcze taką wadę, że jak kot siądzie na pilocie to szybko rozładuje baterię. Podam jeszcze taki przykład:
Obrazek
Wciśnięcie klawisza w końcu naładuje pojemności, ale nim się to stanie będzie na nich 0V co procesor wykryje jako stan niski i wybudzi się. Musi on teraz włączyć tryb przechwytywania i zmierzyć czas do naładowania pojemności czyli do osiągnięcia stanu wysokiego. Mając te dane timer należy skonfigurować w tryb CTC na 36kHz i używając _delay_us(889); nadać ramkę z kodem klawisza.
W zależności od pojemności możliwe, że trzeba będzie dodać klikumegowe rezystory równolegle do każdego kondensatora. Wracając do kota ;) to w takim układzie wciśnięty klawisz nie powoduje przepływu prądu, bo kondensator się naładował i stanowi przerwę w obwodzie. Oczywiście należy użyć kondensatorów z dielektykiem COG lub X7R. Najlepsze będą 22pF i 100pF z dielektrykiem COG, bo są dodatkowo stabilne w całym zakresie temperatur. Z tego powodu najlepiej użyć układu z jednym kondensatorem łącząc 2 powyższe:
Obrazek

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lip 2014, o 23:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 cze 2013
Posty: 137
Lokalizacja: Kraków
Pomógł: 0

Hej, wróciłem! :)
Zaprojektowałem płytkę testową dla 12 przycisków. W kwestii połączeń zmieniłem tylko ilość kolumn na 3, żeby łatwiej było mi to rozmieścić na docelowej płytce. Oczywiście odpadł jeden rezystor "poziomy", a pozostałym zmieniłem wartości z 240 na 330. W efekcie rozkład wciąż jest prawie idealnie liniowy.
W każdym razie, jestem świeżo po teście na żywym organizmie i jestem bardzo pozytywnie zaskoczony ;). Całość ruszyła od kopa, a przy odczycie nie ma żadnych przekłamań.
Nurtuje mnie jednak jedna kwestia. W zaproponowanym przez Krausera rozwiązaniu chyba najprościej by było odczytywać ADC i nadawać ramkę bezpośrednio w pętli głównej przy pomocy delayów. A co później? Chciałbym nadawać ramkę tak długo jak przycisk jest wciśnięty (co jakieś 100-200ms). Pomyślałem o czymś takim:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Tylko właśnie trochę się martwię drganiami styków przy puszczaniu przycisku. Jeśli procesor się uśpi za wcześnie, może się zaraz wybudzić właśnie przez drgania i nadać niepotrzebnie komendę. Tak myślałem, że gdyby tak dać kolejnego delay'a za pętlą while, to mogłoby to rozwiązać problem. Tylko nie wiem jak długi czas musiałby to być - np. przy 500ms miałbym już pewność że jest okej, ale boję się że nadajnik w odpowiednich warunkach sprawiałby wrażenie nieco "opóźnionego" ;). I niezbyt wiem co z tym fantem teraz zrobić...

Oczywiście jestem otwarty na propozycje - jeśli ktoś ma jakiś fajniejszy pomysł na rozwiązanie tego, to piszcie śmiało!

_________________
Więcej dziwactw na: www.youtube.com/user/mopsiok



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: 31 ]  Przejdź na stronę 1, 2  Następna strona

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 5 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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO