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

[AVR] [bascom] Uzywanie jednego pinu IO do switcha i LED.

26 Lis 2009 21:02 3926 19
  • Użytkownik usunął konto  
  • Tektronix
  • Poziom 33  
    schemat masz moprawny z tym że dołożyłbym rezystor np 470R dla ograniczenia prądu diody LED

    dalej w programie wystarczy że zadeklarujesz pin jako wejście i możesz od czytać z niego stan

    a aby sterować LED deklarujesz jako wyjście i ustawiasz 0 na pinie co objawi się zapaleniem diody ;)
  • Tektronix
  • Użytkownik usunął konto  
  • Pomocny post
    Poziom 21  
    Zrób tak żeby ci się dioda nie spaliła:
    [AVR] [bascom] Uzywanie jednego pinu IO do switcha i LED.

    Natomiast żeby się "mocno świeciła" przy sterowaniu procesorem,
    to w programie zrób w pętli:
    - odczyt (kilka taktów procesora),
    - ustaw 0 na pinie i delay 500 czy 200 ms.

    ps. ustawianie rezystora pull-up na porcie jest zbędne,
    i tak ci dioda na nóżkę podaje napięcie VCC.

    I tak ten układ nie jest całkiem bezpieczny, bo przypuśćmy
    że program da 1 na port (VCC na nóżce) i się "zawiesi" (albo np. będzie błąd w kodzie),
    a w tym momencie ktoś naciśnie przycisk na 5 sekund,
    i z procesora zrobi się smażalnia jajek.
  • Użytkownik usunął konto  
  • Użytkownik usunął konto  
  • Poziom 29  
    Kolego jak często wchodzisz w tą procedure obsługi przycisku? Wydaje mi się że za często i dla tego dioda słabo świeci. Wywołuj to co jakieś 200ms, powinno wystarczyć. Między przestawieniem typu pinu na wejście i podciągnięciem go, a odczytem jego stanu, daj przerwe kilka us na ustalenie się stanu.

    Zobacz tutaj https://www.elektroda.pl/rtvforum/viewtopic.php?t=1448112 taka sama idea, 4 linie obsługują 4 przyciski i 4 diody. Z przerwania timera wywołuje podprogram który odczytuje przyciski (3 na porcie D i jeden na porcie B)
    Code:

    '__________________sprawdzanie_stanów_przycisków________________________________
    Przyciski:

    Config Portd = &B00011111
    Config Portb.7 = Input

    Portd = &B11100000
    Portb.7 = 1
    '10us na ustalenie się stanu na pinach (wystarczy 5us ale z zapasem 10)
    Waitus 10

    P1 = Pinb.7
    P2 = Pind.5
    P3 = Pind.6
    P4 = Pind.7

    Config Portd = &B11111111
    Config Portb.7 = Output
    Portd.2 = 1

    Return

    Zauważ że stan przycisków przepisuje tylko do zmiennych bitowych P1..P4 i informacje te wykorzystuje sobie w "wolnym czasie". W twoim przypadku możesz dać if p1 = 0 then toggle portb.0 i dioda będzie zmieniań stan po każdym przyciśnięciu. Chodzi o to aby ta przerwa w nie-świeceniu była jak najkrótsza, a samo wywołanie tego podprogramu jak najrzadziej. Żadnych if-then. Xury dobrze ci radzi, w szereg z przyciskiem koniecznie daj rezystor. Bez niego, jak natrafisz na wysoki na wyjściu, to zrobisz sobie zwarcie i w najlepszym przypadku będzie tylko reset.
  • Użytkownik usunął konto  
  • Pomocny post
    Poziom 29  
    Tak, zmieniłem na toggle bo tamto co napisałem wcześniej było całkowicie błędne. A ty to wykorzystałeś :) Zamiast
    Portb.1 = Sw
    daj
    If Sw = 0 then toggle portb.1

    Dodano po 58 [sekundy]:

    Pomyśl logicznie, za 100ms program odczyta stan pinu, i jeśli będzie wynosił 1 to i taki stan dostanie dioda - zgaśnie po 100ms.
  • Użytkownik usunął konto  
  • Pomocny post
    Poziom 15  
    Witam sprawdź ten kod co prawda są inne numery portów i inny procek ale jak zmienisz powinno działać.
    Problem jest jeden w momencie jak naciskasz przycisk i zmieniasz końcówkę na WYJŚCIE to stan tego pinu Musi być (0) Niski , żeby nie zrobić zwarcia.
    Code:

    '$sim
    $regfile = "attiny2313.dat"
    $crystal = 11059200
    $baud = 9600

    enable interrupts                                           'włącz przerwania
    dim flag1 as bit                                            'zmienna pomocnicza flaga
    config timer1 = TIMER , PRESCALE = 1024                     'timer1
    config Portd.3 = output                                     'tu miałem podpiętego leda żeby widziec jak długo liczył timer i jak długo portb.7 był wyjściem
    portd.3 = 0                                                 ' stan niski na początek

    config PinB.7 = input                                       ' pin b.7 jako wejście
    portb.7 = 1                                                 'pull up
    on timer1 czas                                              'przerwanie od  timer 1

    Do
    portd.3 = ddrb.7                                            'to jest tylko do testów żeby można było zobaczyć jak długo port B jest wyjściem



    if pinb.7 = 0 then                                          ' sprawdzenie stanu   przycisku (ośla łączka ćwiczenie 3a)
    if flag1 = 1 then                                           ' flaga pomocnicza
    enable timer1                                               ' włącz timer1
    timer1 = 35000                                              ' wpisz do rejestru wartość początkową
    gosub PRZYCISK                                              'skok do pod programu przycisk
    flag1 = 0                                                   ' zmień flagę czyli zablokuj możliwość przełączania jak przycisk jest już wciśnięty
    end if
    else
     flag1 = 1
    end if


    Loop

    end



    przycisk:                                                   'teraz zmiana z wejścia na wyjście
    config portb.7 = output


    '************************
    reset portb.7                                               'WAŻNE stan niski na wyjściu jeśli będzie wysoki a ty wciśniesz przycisk to będzie zwarcie

    '************************
    return


    czas:                                                       'przerwanie od timera1 po upłynięciu czasu zładowanego wyzej
    config pinb.7 = input                                       'zmiana na wejście po odmierzeniu czasu z timera1
    set portb.7                                                 ' i znowu pull up jak by czasem

    return
  • Użytkownik usunął konto  
  • Poziom 15  
    Cześć. Z tego co widzę tak na szybko twój timer jest włączony cały czas wywal z 6 lini kodu to enable timer0, druga sprawa nie widzę tam nigdzie ładowania wartości początkowej do timera, chyba że miałeś taki cel. Timer będzie liczył w kółko.
    A na koniec po co Ci ta zmienna sekunda w obsłudze przerwania od timera jeśli ona nic nie robi ???

    Aha i myślę(czasem mi się zdarza) że właśnie w obsługa przerwania od timera jest dobrym miejscem na zmianę kierunku portu z wyjścia na wejście tak jak jest to w moim przykładzie w pod programie CZAS.

    _____________________Po chwili_____________________________________

    Powiedz mi a masz jakie plany dla ADC??? wpadł mi do głowy pomysł może całkiem głup a może nie.
    Jak by zrobić drabinkę rezystorów i każdy z rezystorów miał by inna wartość którą byś podpinał do jednego kanału ADC mógł byś zrobić całą klawiaturę na jednym pinie procka, do tego zrobić tabelę i w zależności od wartość pobranej z ADC zapalać ledy itp.
    Jelśi pomysł jest kretyński proszę moderatora o edycję i usunięcie herezji.
  • Użytkownik usunął konto  
  • Poziom 43  
    Pikczu napisał:

    ...
    Powiedz mi a masz jakie plany dla ADC??? wpadł mi do głowy pomysł może całkiem głup a może nie.
    Jak by zrobić drabinkę rezystorów i każdy z rezystorów miał by inna wartość którą byś podpinał do jednego kanału ADC mógł byś zrobić całą klawiaturę na jednym pinie procka, do tego zrobić tabelę i w zależności od wartość pobranej z ADC zapalać ledy itp.
    Jelśi pomysł jest kretyński proszę moderatora o edycję i usunięcie herezji.

    Pomysł nie jest wcale głupi, stosuje go od dawna wiele firm, np. Sony w swoich przewodowych zdalnych sterowaniach do Walkmanów, Discmanów i innych temu podobnych. Również inne firmy to wykorzystują, aby "zmniejszyć" liczbę przewodów od klawiatury.
    Są specjalistyczne układy scalone, np. MAX11041, rozpoznaje do 30 różnych przycisków, a jego wyjście to magistrala I2C.
  • Poziom 15  
    Microtronic sęk w tym, że tam nigdzie nie widać INCR sekunda w obsłudze przerwania.
    Więc jak (gdzie) Ty ją inkrementujesz?
  • Użytkownik usunął konto  
  • Użytkownik usunął konto  
  • Poziom 43  
    Czemu wyważacie otwarte drzwi. Wystarczy spojrzeć do dokumentacji Atmela Link i podejrzeć rozwiązanie. Co prawda tam jest na jednym porcie jest klawiatura matrycowa i 4 wyświetlacze siedmiosegmentowe, ale zasada jest taka sama, a i kod programu jest w dokumentacji.