Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

odczyt pinu gdy jest on ustawiony jako wyjście-Atmega

panbosman 22 Apr 2010 10:42 2146 20
  • #1
    panbosman
    Level 12  
    witam.
    czy możemy odczytać pin gdy jest on ustawiony jako wyjście.
    np.
    przy porównaniu pomiędzy OCR1x a TCNT1 na wyjściu ustawiany jest jakiś poziom a ja chcę go odczytać.
    Czy jest to poprawna metoda?

    albo może ktoś podpowie jak generować przerwanie w trybie PWM w momencie zrównania się OCR1x a TCNT1.
  • Helpful post
    #2
    tadzik85
    Level 38  
    Tak można sprawdzać stan wyjścia ustawionego jako wyjście.

    Istnieje przerwania COMPA. ale nie mam pojęcia jak to jest w trybie PWM. Musiałbyś doczytać w dokumentacji . Jeśli twój tryb PWM wykorzystuje porównanie z compA zapewne da się to zrobić.
  • #3
    panbosman
    Level 12  
    TIMER1 COMPA Timer / Licznik 1 dopasowanie porównania A

    Masz chyba rację ale jak to jest w szczegółach?
    Kiedy następuje przerwanie w PWM -korekcja fazy, przy odliczaniu w dół czy górę?

    Potrzebne mi jest rozróżnienie by PWM był poprawny fazowo.
    Jednak chyba zdecyduję się na czytanie pinu OC1A/ OC1B.
  • #4
    rpal
    Level 27  
    tadzik85 wrote:
    Tak można sprawdzać stan wyjścia ustawionego jako wyjście.
    Tylko co z tego że sprawdzisz kolego stan tego pinu i co ci to da ? Zobaczysz mniej więcej to samo co jest akurat wpisane w port.
  • #5
    tadzik85
    Level 38  
    Tylko, że kolega chce sprawdzać stan wyjścia które sterowane jest sprzętowo przez licznik. Poza tym zdarzyć się może ze stan któregoś piny zmieniany jest np. w przerwaniu a ty chcesz w pętli głównej sprawdzić jego stan. Sam to stosuje dość często. Np. sterując buzzer, który włączany jest podczas przyciskania klawisza klawiatury 4x4 i innych akcjach, wobec czego nie chce by przy obsłudze klawiatury buzzer był wyłączany. A w tym celu nie jest potrzebna jakaś flaga po prostu odczytujesz stan portu.
  • #6
    rpal
    Level 27  
    tak czy inaczej odczytanie z pinu a odczytanie z portu niczym się nie różni bo odwzorowuje te same informacje z tą tylko różnicą ze z pinu jest minimalnie później :)
  • #7
    janbernat
    Level 38  
    Coś mi się tu nie zgadza.
    Odczytanie rejestru Pin- tak.
    Ale odczytanie rejestru Port- to jest odczytanie tego co było ustawione w tym rejestrze.
    A kierunek jest ustawiony w DDR.
  • #9
    rpal
    Level 27  
    a co się Panu nie zgadza ? port jest wyjściem, w PORTx jest wpisana dana a na PINx ta dana jest odwzorowana. No chyba że akurat pin będąc wyjściem ktoś zewrze do masy albo do zasilania to może być coś innego niż się spodziewano :)
    Jak będę miał wolną chwile to sprawdzę to jednak jtag-iem :)
  • #10
    atom1477
    Level 43  
    Chodzi o to że co byś nie wpisał do PORTx to na pinie (w znaczeniu nóżce układu) i tak będzie to co wystawi Timer. I to bez żadnych zwarć czy czegoś takiego.
    Po prostu odpowiednio skonfigurowany Timer odłączy rejestr PORTx od nóżek scalaka.
  • #11
    panbosman
    Level 12  
    Panowie.
    wracając do sedna sprawy:
    czy możliwe jest w trybie PWM poprawnym fazowo użycie przerwania
    TIMER1 COMPB?
  • #13
    panbosman
    Level 12  
    Myślałem o tym ale to mało elegancko (wg mnie:D).
    Masz kolego pomysł jak odróżniać w przerwaniu czy jest z odliczania w dół czy w górę?
  • #16
    tadzik85
    Level 38  
    A jak chcesz zrobić to programowo?
  • #18
    panbosman
    Level 12  
    programowo mogę np. sprawdzać Bit przepełnienia TOV1 i ustawiać flagę ale może są prostsze sposoby

    Dodano po 1 [minuty]:

    timer liczy do top a potem w dół do 0. To jest PWM poprawny fazowo
  • #19
    tadzik85
    Level 38  
    Od przepełnienia tez jest przerwanie. atom wszystko wina przecinka którego połknąłeś.
  • #20
    atom1477
    Level 43  
    panbosman wrote:
    programowo mogę np. sprawdzać Bit przepełnienia TOV1 i ustawiać flagę ale może są prostsze sposoby

    No są i dlatego napisałem że zamiast robić to programowo to można złączyć piny OCRxx i INTx i skorzystać z przerwania INTx.
    A jeszcze lepiej normalnie wygenerować przerwane od TOV1. Myślałem że chcesz wygenerować jakieś przerwanie od którego nie ma flagi. Ale jeżeli ona jest (TOV1) to nie wiem jaki masz problem.
    tadzik85: Faktycznie ;) Chodziło o przecinek ;)
  • #21
    panbosman
    Level 12  
    Dzięki Panowie za dysputę.
    Zamykam temacik.