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.

Atmega 16 - jak odczytać PIN'y?

MichGX 23 Wrz 2013 12:21 1860 12
  • #1 23 Wrz 2013 12:21
    MichGX
    Poziom 11  

    Witam,
    Jestem początkujący w dziedzinie programowania mikrokontrolerów AVR i pracuję obecnie na Amtegach 8A/16A i napotkałem następujący problem:

    Do atmegi 16A podłączyłem prosty mulitiplekser sterowany za pomocą 2 pinów PD4,PD5 wyjście tego multipleksera podłączyłem do PINU PD2 odpowiedzialnego za przerwania zewnętrzne (INT0). W procedurze obsługi przerwania potrzebuję odczytać stan pinów PD4 i PD5 abym dowiedział się która nóżka muxa została wybrana

    Kod: cpp-qt
    Zaloguj się, aby zobaczyć kod

    następujący kod niestety nie działa, próbowałem już sprawdzać za pomocą rejestru PIN też nie działa. Za pomoc z góry dzięki.

    0 12
  • #2 23 Wrz 2013 13:02
    dzielik
    Poziom 15  

    Ja odczytuję stan pinu w taki sposób:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Problem może nie leżeć w samym ifie - sprawdź najpierw czy w ogóle uC wchodzi do obsługi przerwania...

    0
  • #3 23 Wrz 2013 13:07
    MichGX
    Poziom 11  

    Sprawdzałem czy wchodzi do przerwania podpinając do PD2 po prostu masę i działa

    0
  • #4 23 Wrz 2013 13:17
    dzielik
    Poziom 15  

    Skąd wiesz, że działa? Masz jakiś wyświetlacz, diodkę?

    0
  • #5 23 Wrz 2013 13:27
    MichGX
    Poziom 11  

    Zrobiłem prosty test przerwań zanim podłączyłem MUXA że jeśli zgłosi się przerwanie to mi zamiga 5 razy diodką po podłączeniu muxa też przerwanie zgłasza ok, ale już nie umiem rozpoznać dla jakiej kombinacji

    0
  • #6 23 Wrz 2013 13:33
    dzielik
    Poziom 15  

    Chyba się dobrze nie wczytałem - sygnał podajesz z Atmegi na MUXA (piny PD4 i PD5) i teraz chcesz dowiedzieć się w przerwaniu (INT0), czy sygnał pochodzi z PD4 czy PD5?

    0
  • #7 23 Wrz 2013 13:44
    MichGX
    Poziom 11  

    Sytuacja jest taka MUX ma konfigurowane 4 wyjścia i sterowanie nimi wygląda następująco za pomocą PD4 i PD5 ustawiam poprzez kombinację 00,01,10,11 które wyjście jest aktualnie wybrane, następnie pin oznaczony jako wspólne wyjście/wejście podłączam do PD2 (zaprogramowany jako INT0) i w obsłudze przerwania chcę sprawdzić stany PD4 i PD5 aby wiedzieć które wyjście MUXa zostało wybrane

    0
  • #8 23 Wrz 2013 13:59
    dzielik
    Poziom 15  

    Możesz zrobić sobie np. dwie zmienne (jedna dla PD4 i druga dla PD5) i przypisywać im jakąś wartość (np 0 1) w momencie ustawiania 00,01,10,11 na PD4 i PD5. I w przerwaniu sprawdzasz sobie, jaką wartość ma zmienna - wiesz z którego pinu poszedł sygnał.

    Dodano po 7 [minuty]:

    Zobacz tu:
    http://mikrokontrolery.blogspot.com/2011/04/jak-mikrokontroler-widzi-sygnal-cyfrowy.html

    jest akapit: Przypadek 2 - Odczyt pinu ustawionego jako wyjście.
    asm volatile ("nop"); //niezbędne opóźnienie dzięki instrukcji NOP

    0
  • #9 23 Wrz 2013 14:19
    MichGX
    Poziom 11  

    Super dzięki za poświęcenie, ostatnie rozwiązanie z tymi 2 intami pomogło o synchronizatorze oczywiście wiem i użyłem go już wcześniej, nareszcie program działa poprawnie jeszcze muszę go zrobić jako funkcję atomową gdyż czasami przerwanie mi zdąży przerwać ustawianie tych 2 zmiennych pomocniczych.

    0
  • #10 23 Wrz 2013 14:54
    johnny99
    Poziom 17  

    Na czas ustawiania tych zmiennych pomocniczych wyłącz obsługę przerwań.

    0
  • #11 23 Wrz 2013 15:00
    dzielik
    Poziom 15  

    Jestem ciekawy co kolega MichGX ma na myśli pisząc o funkcji atomowej?
    Ja też bym wyłączył obsługę przerwań na czas ustawienia zmiennych.

    0
  • #13 30 Mar 2016 10:48
    MichGX
    Poziom 11  

    Program po Waszych uwagach zaczął działać poprawnie. Pozdrawiam i dziękuję za pomoc. Temat do zamknięcia.

    0