Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

wysłać na pin zawartość timer1

szuwar40 25 Cze 2015 09:31 1134 31
  • #1 25 Cze 2015 09:31
    szuwar40
    Poziom 7  

    Witam

    Przeszukałem google i elektrode i kompletny brak info , temat tabu.

    Już mi się mieszają te compare , ocr1 , oc1a , b itd.

    Proszę o podpowiedź co trzeba napisać w Bascom dla Atmega8 aby na któryś pin były impulsy Timer1 kiedy np. portd.3=0 i brak tych impulsów kiedy portd.3=1.

    Jest to w ogóle możliwe ?

    0 29
  • #2 25 Cze 2015 09:35
    Futrzaczek
    Admin Grupy Retro

    Co rozumiesz przez "impulsy Timer1"? Impulsy generowane po przepełnieniu, zawartość rejestru...?
    Napisz, czego dokładnie żądasz od programu.

    0
  • #3 25 Cze 2015 09:47
    szuwar40
    Poziom 7  

    Witam serdecznie

    Potrzebuję zmierzyć zewnętrznym licznikiem ile impulsów z timer1 mieści się w czasie kiedy portd.3=0. Kilka dni na googlach i nic , tak jakby to było niemożliwe.

    W pomocy bascom pisze

    'Możesz odczytywać i zapisywać dane z licznika TIMER1, za pomocą
    'specjalnej zmiennej systemowej:
    W = Timer1
    Timer1 = W

    No i brak info gdzie to wpisać

    0
  • #4 25 Cze 2015 09:57
    Futrzaczek
    Admin Grupy Retro

    Zmienna Timer1 ma 16 bitów, zaś 1 pin mikrokontrolera prezentuje sobą tylko jeden bit. Masz trzy opcje, aby wydobyć zawartość tej zmiennej z rdzenia:
    - użyć transmisji szeregowej (np. UART)
    - użyć transmisji równoległej (co zajmie dwa pełne porty mikrokontrolera)
    - skoro chcesz zawartość tej zmiennej "przeklikać" na zewnętrzny licznik, to zrobić prostą pętlę, która zmienia stan wybranego pinu (np. z 0 na 1 i z 1 na 0) tyle razy, jaka jest zawartość wysyłanej zmiennej. Pomijając już sensowność takiego rozwiązania...

    0
  • #5 25 Cze 2015 10:21
    szuwar40
    Poziom 7  

    No właśnie potrzebuję przeklikać na zewnętrzny licznik, możesz pomóc jak to zrobić ?

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #6 25 Cze 2015 10:28
    Futrzaczek
    Admin Grupy Retro

    szuwar40 napisał:
    If Portd.3 = 0 Then

    Do sprawdzania stanu wejść używaj rejestru PIND, PORTD zawiera opis wyjść.

    szuwar40 napisał:
    No właśnie potrzebuję przeklikać na zewnętrzny licznik, możesz pomóc jak to zrobić ?

    W BASCOMie nie pisałem już kilka lat, ale zarys wyglądać może tak:

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Musisz to obudować instrukcjami, które uniemożliwią np. rozpoczęcie odliczania kiedy nie zakończyło się wysyłanie poprzeniej serii.

    0
  • #7 25 Cze 2015 11:02
    szuwar40
    Poziom 7  

    Literówka z tym portd.3 a pind.3 , już poprawiłem

    Wkleiłem kod do pętli i na oscyloskopie cisza.

    Podpowiedź co jeszcze poprawić ?

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #8 25 Cze 2015 11:05
    Futrzaczek
    Admin Grupy Retro

    W jaki sposób Timer1 ma wiedzieć, że ma rozpocząć odliczanie? Kiedy je przerywasz i kiedy wznawiasz?
    Tutaj nie ma takich instrukcji, a są one konieczne.

    0
  • #9 25 Cze 2015 11:22
    szuwar40
    Poziom 7  

    No właśnie gdybym to wiedział to bym nie pytał.

    Portd.3 wiem że to jest przerwanie int1 , timer według pomocy bascoma startuje po wpisaniu preskaler..x a na oscyloscopie cisza.

    Teoretycznie podaję 0 na portd.3 wtedy następuje przerwanie ale brakuje chyba odblokowań.

    Możesz mi podać co mam jeszcze odblokować i ew. zmienną gdzie wpisać ?

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • Pomocny post
    #10 25 Cze 2015 11:30
    Futrzaczek
    Admin Grupy Retro

    szuwar40 napisał:
    Portd.3 wiem że to jest przerwanie int1 , timer według pomocy bascoma startuje po wpisaniu preskaler..x a na oscyloscopie cisza.

    Teoretycznie podaję 0 na portd.3 wtedy następuje przerwanie ale brakuje chyba odblokowań.

    Mnie tu brakuje Start Timer1 po zadeklarowaniu jego preskalera.
    Poza tym, obsługę przerwań trzeba umieścić poza pętlą główną. Oraz powiedzieć temu przerwaniu, na co i w jaki sposób ma reagować. A na to kodów przykładowych jest już dużo.

    1
  • #11 25 Cze 2015 11:44
    szuwar40
    Poziom 7  

    Przepraszam , kabelek nie łączył , wreszcie widzę impulsy timer1 na portd.0. po wgraniu do procka ostatniego listingu. Dziękuję za pomoc.

    Dodano po 11 [minuty]:

    Jeszcze jedno pytanie.

    Jest możliwe aby przy kwarcu 16Mghz i prescaler1 Timer1wysyłał na portd.0 impulsy o szerokości 100us ?

    Powinien chyba wysyłać impulsy o szerokości 62.5ns ?

    0
  • #12 25 Cze 2015 12:38
    szuwar40
    Poziom 7  

    Zdaje się że twój powyższy kod powoduje zliczanie ilości wciśnięć na pind.0 a tematem jest pytanie jak wysłać na pin procka impulsy Timer1.

    Twoja pierwsza wstawka pętli While/Wend ożywiła port ale impulsy na wyjściu są za szerokie jak na Timer1/16Mghz/prescale1 - recepta ?

    Z analizy kodu PWM myślę że te impulsy Timer1 powinny pojawić się na OC1A lub OC1B i może ktoś pomoże jak to powiedzieć prockowi ?

    Dodano po 4 [minuty]:

    Zapomniałem że od początku na pind.3 jest rezystor10k do plusa i kondensator 100nf do masy.

    Odblokowania podałem przykładowe i zapytałem co jeszcze odblokować lub/oraz gdzie dopisać zmienną aby na którymś porcie mieć impulsy z Timer1.

    0
  • #13 25 Cze 2015 12:59
    dondu
    Moderator Mikrokontrolery Projektowanie

    szuwar40 napisał:
    Jest możliwe aby przy kwarcu 16Mghz i prescaler1 Timer1wysyłał na portd.0 impulsy o szerokości 100us ?

    Timer1 nie wyśle żadnych impulsów na pin PD0.
    Można natomiast tak ustawić timer, by generował przerwanie co określony czas, a w nim odpowiednio sterować pinem PD0.

    I pytanie: Od kiedy programujesz w BASCOM?

    0
  • #14 25 Cze 2015 13:03
    373522
    Użytkownik usunął konto  
  • #15 25 Cze 2015 13:33
    szuwar40
    Poziom 7  

    Jestem już tym zmęczony , sorry że dopiero teraz zauważyłem że odzew jest od więcej użytkowników niż jeden.

    Do Niveasoft :

    potrzebuję na upragnionym pinie impulsy timer1 , kiedy pind.3=0

    Skompilowałem twój listing i w atmega8 na pb1(oc1a) i pb2 (oc1b) cisza , nie wspomnę że potrzebuję policzyć zewnetrznym licznikiem impulsy timer1 tylko wtedy kiedy pinb.3 =0

    Wie ktoś jak to powiedzieć prockowi ?

    0
  • #17 25 Cze 2015 14:02
    szuwar40
    Poziom 7  

    Dondu

    Właśnie do Ciebie pisałem.

    Jestem nowy w bascom , może ty wiesz jak to powiedzieć prockowi ?

    0
  • #18 25 Cze 2015 14:05
    dondu
    Moderator Mikrokontrolery Projektowanie

    szuwar40 napisał:
    Jestem nowy w bascom ...

    W takim układzie dam Ci dobrą radę: Odinstaluj Bascom i zacznij uczyć się języka C z tych powodów:
    http://mikrokontrolery.blogspot.com/2011/04/jaki-jezyk-wybrac.html

    Resztę znajdziesz w spisie treści tej strony. Poświęć parę dni, zobacz kursy, które tam są, poćwicz C w CManiaku (Kurs C), zobacz przykłady z Kursu AVR i dopiero wróć do swojego tematu.

    Problemem bowiem u Ciebie jest taki, że nie dość, że nie znasz języka, to jeszcze nie znasz mikrokontrolera nawet w stopniu podstawowym. Dlatego musisz nieco wiedzy poznać, a potem będzie z górki :)

    0
  • #19 25 Cze 2015 14:14
    szuwar40
    Poziom 7  

    Kilka dni już poświęciłem , google i elektroda brak info jak wysłać timer1 na pin uP. Chyba to jest zbyt skomplikowane , skoro nigdzie nie ma o tym informacji poza lakoniczną informacją pomocy bascom
    ==============
    ==========
    'Możesz odczytywać i zapisywać dane z licznika TIMER1, za pomocą
    'specjalnej zmiennej systemowej:
    W = Timer1
    Timer1 = W
    =============
    ======================
    Podszkolę się w C , zapytam jak wysłać Timer1 na pin kontrolera i zdaje się że dalej nie będzie pomocnej odpowiedzi.

    Jest tu jakiś kozak ?

    0
  • #20 25 Cze 2015 14:19
    dondu
    Moderator Mikrokontrolery Projektowanie

    szuwar40 napisał:
    Podszkolę się w C , zapytam jak wysłać Timer1 na pin kontrolera i zdaje się że dalej nie będzie pomocnej odpowiedzi.

    Dlaczego tak sądzisz?

    szuwar40 napisał:
    Jest tu jakiś kozak ?

    Wystarczy popatrzeć na liczniki POMÓGŁ, które znajdują się po lewej stronie każdego postu osoby odpowiadającej.

    Zrób to co radzę, a ruszysz do przodu i nie popełnisz błędu jakim jest BASCOM.

    0
  • #21 25 Cze 2015 14:23
    szuwar40
    Poziom 7  

    Świetny wynik.

    ew. mam kompilator microC w wersji 6.1.0 i podstawową wiedzę , może w C ktoś podpowie jak czytać Timer1 ?

    0
  • #22 25 Cze 2015 14:40
    tmf
    Moderator Mikrokontrolery Projektowanie

    szuwar40 napisał:
    Witam

    Przeszukałem google i elektrode i kompletny brak info , temat tabu.

    Już mi się mieszają te compare , ocr1 , oc1a , b itd.

    Proszę o podpowiedź co trzeba napisać w Bascom dla Atmega8 aby na któryś pin były impulsy Timer1 kiedy np. portd.3=0 i brak tych impulsów kiedy portd.3=1.

    Jest to w ogóle możliwe ?


    To można prosto zrobić hardwarowo dodając bramkę OR na pin np. 3 i wyjście PWM timera. Ale można to też zrobić sprzętowo przy pomocy dwóch timerów z połączonymi wyjściami - szczegóły są w dokumentacji MCU, nawet ładny rysunek wyjaśniający zasadę umieścili. Jeśli to nie musi być mega szybkie, to można zrobić to programowo - po prostu przełączać kierunek pinu na którym masz przebieg PWM (OC), lub wyłączać/włączać timer. Niestety bez poczytania noty procka nic nie ruszysz.

    0
  • #23 25 Cze 2015 14:44
    yokoon
    Poziom 28  

    szuwar40 napisał:
    Kilka dni już poświęciłem , google i elektroda brak info jak wysłać timer1 na pin uP. Chyba to jest zbyt skomplikowane , skoro nigdzie nie ma o tym informacji poza lakoniczną informacją pomocy bascom
    ==============
    ==========
    'Możesz odczytywać i zapisywać dane z licznika TIMER1, za pomocą
    'specjalnej zmiennej systemowej:
    W = Timer1
    Timer1 = W
    =============
    ======================
    Podszkolę się w C , zapytam jak wysłać Timer1 na pin kontrolera i zdaje się że dalej nie będzie pomocnej odpowiedzi.

    Jest tu jakiś kozak ?


    Witam.
    Podchodzisz do tematu trochę nerwowo. Na Twój problem odpowiedział kolega Niveasoft.

    Spróbuję i ja Ci podpowiedzieć. Jeżeli dobrze zrozumiałem to chcesz na pinie OC1a
    mieć przebieg generowany przez Timer1.
    Tak jak Ty piszesz to nie da rady przenieść zawartość Timer1 na dany pin, ale można przy pomocy Timer1 generować przebieg o danej częstotliwości np:

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    ' Na pinie OC1A powinien być przebieg o częstotliwości 25Hz.
    Wzór (OCR1a = F_cpu /2 * prescaler / F_m.cz )-1 wartość jaką należ wpisać do rejestru aby otrzymać daną F_m.cz na OC1A

    Pisałem na szybko może być jakiś błąd do Ciebie należy sprawdzenie.

    0
  • #24 25 Cze 2015 15:09
    szuwar40
    Poziom 7  

    Dzięki , działa.

    Zauważyłem że Niveasoft podesłał potrzebny listing ale nie dopisał przerwań , stąd nie działało.

    Potrzebuję max obroty Timer1 na wy. Skąd wziąłeś tą cyfrę 624 ?

    Dla kwarc 16Mghz i prescale=1 na porcie są impulsy około 700us , potrzebuję około 100ns. Help !!!

    ============

    Przepraszam Niveasoft i polecam porady tego fachowca.

    Listing działa. Mój oscyloskop zatkał sie z przedawkowania speed oscylacji z timer1 stąd widząc zero impulsów na oscyloskopie uznałem że jest ich brak.

    0
  • Pomocny post
    #25 25 Cze 2015 15:14
    yokoon
    Poziom 28  

    szuwar40 napisał:
    Dzięki , działa.

    Zauważyłem że Niveasoft podesłał potrzebny listing ale nie dopisał przerwań , stąd nie działało.

    Potrzebuję max obroty Timer1 na wy. Skąd wziąłeś tą cyfrę 624 ?

    Dla kwarc 16Mghz i prescale=1 na porcie są impulsy około 700us , potrzebuję około 100ns. Help !!!


    Z wzoru który Ci podałem.

    1
  • #26 25 Cze 2015 15:44
    szuwar40
    Poziom 7  

    Dzięki wszystkim , którzy pomagali.

    Max obroty Timer1 na wy OC1A uzyskane. Dzięki yokoon.

    Zapytałem się o tą cyfrę bo jak wpisałem 1 to na oscyloskopie nic nie było a okazało się że ocyloskop sie po prostu zatkał , mierzy do max. 30 , później sprawdzę ile to Hz.

    Szczególne podziękowania dla yokoon , który podał właściwy listing.

    Raz jeszcze dziekuję.

    0
  • Pomocny post
    #27 25 Cze 2015 16:37
    373522
    Użytkownik usunął konto  
  • #28 25 Cze 2015 16:55
    yokoon
    Poziom 28  

    niveasoft napisał:
    Mój kod również działa. Na wyjściu jest dokładnie 4MHz dla rezonatora 16MHz.

    Przerwania nie są potrzebne ponieważ wszystko robi sam Timer i nie musi zgłaszać przerwań.

    Polecenie End jest w programach po to by wyłączyć przerwania i uruchomić nieskończoną pętlę gdyby program się wysypał. Myślę więc że w programie kolegi polecenie End również wyłączyło "Enable Compare1a" ponieważ wyłączyło "Enable Inetrrupts"
    Timer sobie tam działa sam a mikrokontroler kręci się w pętli ;)


    A skąd się wzięło te 4MHz jeżeli można wiedzieć?

    0
  • Pomocny post
    #29 25 Cze 2015 17:10
    373522
    Użytkownik usunął konto  
  • #30 25 Cze 2015 17:32
    yokoon
    Poziom 28  

    A co będzie jeżeli zastosuję prescaler np. 256 ?
    Oj głupie pytanie.

    0