logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

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

26 Lis 2009 21:02 4250 19
REKLAMA
  • #1 7312852
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #2 7313258
    gothye
    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 ;)
  • REKLAMA
  • #3 7313362
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #4 7313666
    kordirko
    Poziom 22  
    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.
  • #5 7314330
    Konto nie istnieje
    Konto nie istnieje  
  • #6 7314537
    xury
    Specjalista automatyka domowa
    Można przecież dać rezystor pull-down do masy (w szereg ze switchem) ograniczający prąd i nawet kiedy na pinie będzie cały czas jedynka, to się nic nie spali. Ja stosuję takie rozwiązanie. Rezystor około 1 do 2 kOhm
  • #7 7319125
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #8 7319325
    manekinen
    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/topic1448112.html 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)
    
    '__________________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.
  • #9 7319754
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • Pomocny post
    #10 7320049
    manekinen
    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.
  • #11 7320774
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #12 7324892
    Pikczu
    Poziom 16  
    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.
    
    '$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
  • #13 7325819
    Konto nie istnieje
    Konto nie istnieje  
  • #14 7328937
    Pikczu
    Poziom 16  
    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.
  • #15 7330778
    Konto nie istnieje
    Konto nie istnieje  
  • #16 7330981
    Freddy
    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.
  • #17 7333046
    Pikczu
    Poziom 16  
    Microtronic sęk w tym, że tam nigdzie nie widać INCR sekunda w obsłudze przerwania.
    Więc jak (gdzie) Ty ją inkrementujesz?
  • #18 7333515
    Konto nie istnieje
    Konto nie istnieje  
  • #19 7341997
    Konto nie istnieje
    Konto nie istnieje  
  • #20 7342231
    Freddy
    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.
REKLAMA