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

[Attiny2313][Bascom]Zapalanie i gaszenie diody przyciskiem

Boldar 24 Sty 2012 00:06 7235 16
REKLAMA
  • #1 10440309
    Boldar
    Poziom 9  
    Witam Wszystkich

    Próbuję zrobić najprostszy przykład z możliwych.

    Bazuję na poście kolegi xamrex https://www.elektroda.pl/rtvforum/topic1788626.html

    Kod, który wgrałem do procka jest następujący :

    
    $regfile = "attiny2313.dat"                                 'najpierw określamy typ proca
    $crystal = 1000000                          'definiujemy z jakim taktowaniem będzie pracował
    
    
    config portb=input                          'port b  jako wejścia
           portb=&B00000000                     'wszędzie stan spoczynkowy-0
    config portd=output                         'pprt d jako wyjścia
           portd=&B0000000                      'wszędzie stan spoczynkowy-0
    
    
    
    Do                                                          'pętla nieskończona
    
       if pinb.0=1 then                         'jeżeli przycisk 1 wciśnięty
       portd.0=1                                'zapal diode
       Elseif Pinb.0 = 0 Then                                   'jeżeli przycisk 1 puszczony
       portd.0=0                                'zgaś diodę
       endif                                    'koniec bloku warunkowego
    
     Loop                                                       'koniec pętli
    End
    


    Wydaje mi się, że jest prawidłowy, zmodyfikowałem go nieco w stosunku do kodu kolegi z posta powyżej. Używam jednego przycisku.
    Przycisk podłączam do zasilania a potem do pinu Pinb.0.
    Diodę podłączam do Pind.0 a potem do masy.
    Układ zasilam napięciem 5,7 V, napięcie podłączam do vcc a kontrolera a pin GND do masy.

    Po naciśnięciu na przycisk dioda się zapala i o to chodziło, po puszczeniu gaśnie ale dopiero po 3ech sekundach.

    Zdaje sobie sprawę, że pewnie potrzebne sę regulatory napięcia , filtry itp lecz nie mogąc znaleźć kondensatora 100nF dałem elektrolit 100uF co pewnie powoduje błedne filtrowanie.

    CO ciekawe jak multimetr podłączę do masy a kablem zasilania multimertu dotknę pinu pinb.0 to układ działa prawidłowo.

    Zdaje sobie sprawę, że coś schrzaniłem tylko mimo 2 dni poszukiwań nie mogę dociec co dokładnie :)

    Prosił bym o ew. wskazówki czego tu brakuje ( albo jest w nadmiarze ).

    Załączam zdjęcie podłączenia układu na płytce stykowej
    [Attiny2313][Bascom]Zapalanie i gaszenie diody przyciskiem

    Czerwony kabelek z lewej strony do zasilanie a zielony z prawej to masa

    Obstawiam na zakłócenia.
    Wczoraj zdesperowany westchnąłem nad moim układem i nagle dioda się sama zapałiła. Potem się okazało, że jak dmucham na układ albo przykładam rękę to przycisk sam sie aktywuje :) ( of kors jest to pewnie naturalne powodowane jakimiś zakłóceniami )

    Dziękuję i pozdrawiam
  • REKLAMA
  • Pomocny post
    #2 10440441
    sk700
    Poziom 31  
    Witam
    Podciągnij pinb.0 rezystorem 10k do masy, powinno pomóc.
    A jeszcze lepiej przycisk podłącz do masy a pinb.0 pociągnij rezystorem do 5v i odpowiednio zmień program, ponieważ uC lepiej radzą sobie z wykrywaniem stanu niskiego.
    No i dodaj rezystor ograniczający prąd leda :D
    Pozdrawiam
  • Pomocny post
    #3 10440566
    Fredy
    Poziom 27  
    Daj rezystor 10k pomiędzy wejściem czyli Pinb.0 a masą - powinno pomóc.
  • #4 10441898
    Boldar
    Poziom 9  
    Hej

    Dzięki za odzew.

    Spróbuję podłączyć pinb.0 do masy za pomocą rezystora i dam znać ale pewnie dopiero jutro :)

    Tylko mam do Was Panowie takie pytanie.

    Do tej pory rozumiałem to tak, że jeżeli mamy np. wejście w procesorze to
    stan wysoki to napięcie dodatnie na nóżce
    a stan niski to brak napięcia

    Z tego co piszecie wnioskuję, ze stan niski to doprowadzenie pinu do masy i dlatego standardowo dołącza się ten pin do masy aby po zwolnieniu przycisku nastąpiło rozładowanie napięcia poprzez rezystor. Dobrze rozumuję ?

    Myślałem, że kontroler sam jakoś rozładowuje napięcie na pinie w momencie braku zasilania, zreszta pewnie to robi skoro po ok. 3 sekundach dioda gaśnie.

    A czy podłączanie pinu do masy jest dobrą praktyką na przyszłość czy nie lepiej tak jak pisze kolega sk700 lepiej zawsze robić odwrotnie czyli przycisk rozładowuje pin poprzez zwarcie go do masy w momencie naciśnięcia ?

    Pytam dość wnikliwie bo od razu chcę się nauczyć dobrych nawyków.
  • Pomocny post
    #5 10443350
    Fredy
    Poziom 27  
    W AVRach masz mozliwość dołączenia wewnętrznego rezystora o wartości około 50k do Vcc. Dlatego łatwiej po prostu programowo podłaczyć ten rezystor wewnętrzny, a switch dać pomiędzy nózkę a masę. Tak jest po prostu wygodniej.
    Oczywiście inne rozwiązanie ,polegające na użyciu switcha do Vcc z rezystorem podciągającym do masy też jest prawidłowe, tylko że w tym przypadku musisz ten rezystor fizycznie wlutować.
  • REKLAMA
  • Pomocny post
    #6 10443608
    arktik1
    Poziom 27  
    Zobacz to:
    
    $regfile = "attiny2313.dat"                                 'najpierw określamy typ proca
    $crystal = 1000000                          'definiujemy z jakim taktowaniem będzie pracował
    
    
    config portb=input                          'port b  jako wejścia
           portb=&B11111111                     'wszędzie stan spoczynkowy-1
    config portd=output                         'pprt d jako wyjścia
           portd=&B0000000                      'wszędzie stan spoczynkowy-0
    
    
    
    Do                                                          'pętla nieskończona
    Debounce Pinb.0 , 0 , Dioda , Sub
    
     Loop                                                       'koniec pętli
    
    Dioda:
    Toggle Portd.0
    Return
     
    

    Tak będzie fajniej... :D
    I podłącz przycisk z jednej strony do masy a z drugiej do Pinb.0.
  • Pomocny post
    #7 10443675
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • Pomocny post
    #8 10444552
    Bartek.k.k
    Poziom 21  
    Tak, apropo zdjęcia, to czy nie należałoby podłączyć filtrowanie zasilania jak na poniższym schemacie? Odkąd przez jego brak nic mi nie działało, stosuje się zawszę to poniższego schematu:

    [Attiny2313][Bascom]Zapalanie i gaszenie diody przyciskiem
  • REKLAMA
  • #9 10450211
    Boldar
    Poziom 9  
    Hej

    Podłączenie pinb.0 do masy za pomocą rezystora 10k pomogło.

    Przycisk zachowuje się tak jak powinien.

    @sk700,@arktik1,@Fredy :
    Spróbuję zrobić właśnie zrobić odwrotnie czyli wykrywanie stanu niskiego. Co do rezystora do led to racja. Z tym wewnetrznym rezystorem tez pokombinuję

    @Saabotaz:
    1)ok
    2)racja, na razie na szybko testuje i staram się nie pomylić bo przyklad jest dosc prosty ale wiadomo, jak bedzie wiecej pinow w uzyciu to ryzyko wzrasta :)
    3)dalem pinb.0=(1 | 0) bo tak bylo w przykladzie, ktory ponoć działał. Chciałem zrobić identycznie ale i tak nie działało bez tego R10K. Właśnie zastanawiałem się ostatnio czym różni się powyższy zapis od reset i set, ale teraz już wiem :)

    @bartek.k.k :
    Filtrowanie to podstawa, znam tą stronkę, z której wziąłeś ten schemat i fajnie jest wszystko tam opisane. Poprostu ja bazowałem na schematach bez filtrowania i te schematy ludziom działały i skoro im działały to chciałem osiągnąć podobny efekt. Pozatym nie mam poki co odpowiednich kondensatorów ale to wiadomo, nie problem zdobyć...


    Teraz kombinuje jak sterować czasem migania diody

    Mam jedną diodę na pind.0 i 2 przyciski , jeden na pinb.0 a drugi na pinb.1.
    Dioda sobie miga ( nie na waitms ) wykorzystując timer0 w moj wlasny ( nie wiem czy dobry ) wymyślony sposób.

    Przycisk ( nazwijmy go sw0 ) zwieksza po kazdym kliku czas w jakim dioda ma byc zapalona a drugi przycisk ( nazwijmy go sw1 ) zwieksza czas w jakim dioda ma byc zgaszona.

    Kazdorazowe nacisniecie zwieksza czas o krok dajmy na to 100 ms ( milisekund ) , gdy przekroczona zostanie wartosc 1000ms to wartosc czasu ustawiamy na 100ms i tak w kolko.

    Jako, ze nie powinno sie w ogole uzywac wait'ów i waitms'ów robie to na taimerze i w petli do loop.

    Napotkałem już pare problemów ale póki co sobie jakoś radzę.

    Jak skończę to zamieszczę kod do wglądu bo pewnie będzie co poprawiać :D

    Dzieki za pomoc wszystkim.
  • #10 10468954
    KRZAG
    Poziom 12  
    Prawdopodobnie będziesz się męczyć z drganiami styków (jak wiele początkujących osób) więc użyj komendy Debounce lub odczekuj chwilę podczas detekcji wciśnięcia.
  • #11 10472069
    Boldar
    Poziom 9  
    Witam ponownie

    Właśnie teraz mi się jaja dzieją.

    Na attiny2313 udało się zrobić to co opisałem w moim poście wyżej.

    Stwierdziłem, że attiny13 też udźwignie ten temat lecz myliłem się.

    Po wielu próbach zacząłem od początku, od najprostszego przykładu.
    Poniższe próby i kod dotyczą attiny13, mam nadzieję, że mogę pisać w tym wątku

    Podłączenie zrobiłem takie, że na nóżce pinb.0 podłączony jest przycisk do masy( z rezystorem 10k i czasem testowo bez żadnego rezystora ), zasilania do niego nie podłączam.
    Na pinb.4 podłączona jest dioda.( dioda bez rezystora, moje ryzyko ;) ).

    Dioda na starcie tli się lekko, włączam przycisk to się rozjaśnia.
    Eksperymentalnie stwierdziłem, że jak podłączę rezystor do pinu który daje prąd na diode ( pinb.4 ) to wszystko działa cacy. Chociaż zdarzają się momenty gdy bardzo szybko klikam przyciskiem, że dioda się zapala i potem nie gaśnie ( jakby blokuje ).
    Co robię źle i czy to kwestia drgań styków?
    Debounce tu nie rozwiązuje sprawy bo w przykładach od Was, debounce służy przełączaniu diody toggle on/of a ja potrzebuję zwykłe działanie przycisku.

    Oto kodzik
    $regfile = "attiny13.dat"
    $crystal = 1000000                                          'częstotliwość taktowania
    $hwstack = 20
    $swstack = 10
    $framesize = 10
    
    
    Config Portb = &B010000
    Portb = &B101111
    
    Sw1 Alias Pinb.0
    Led Alias Pinb.4
    
    Do
    
    
    If Sw1 = 0 Then
    Gosub Zapal
    Else
    Gosub Zgas
    End If
    
    
    
    Loop
    
    
    End
    
    Zapal:
    Set Led
    Return
    
    Zgas:
    Reset Led
    Return
    
  • #12 10473025
    Konto nie istnieje
    Poziom 1  
  • #13 10473302
    Boldar
    Poziom 9  
    Hej emarcus

    No zawsze mnie zastanawiało czemu raz piszą PIN a raz PORT lecz zapominałem dopytać :)

    Zrobiłem tak jak napisałeś ale nadal się świeci bez przycisku.

    1. Włączam zasilanie - dioda lekko świeci
    2. Naciskam przycisk - dioda się rozjaśnia mocno
    3. puszczam - Wraca do punktu 1

    :/

    Mierzylem napiecie na portb.4 ( juz nie pinb.4 ;) ) i jest tam około 2V w stanie nie naciśnietym
  • #14 10477900
    Konto nie istnieje
    Poziom 1  
  • #15 10478811
    Boldar
    Poziom 9  
    Ok dzieki, rozumiem aluzję ;), sprawdze na innych portach.
    Czyli teoretycznie takie zjawisko nie powinno mieć miejsca, że na porcie wyjścia w momencie gdy daliśmy mu reset płynie prąd?
  • #16 10481938
    arktik1
    Poziom 27  
    "że na porcie wyjścia w momencie gdy daliśmy mu reset płynie prąd?"
    Gdy dajesz RESET powinien być stan 0 = 0V
    Gdy dajesz SET powinien być stan 1 = 5V
    Przy zasilaniu 5V
  • #17 10483295
    Boldar
    Poziom 9  
    No tak właśnie założyłem :)


    Problem rozwiązany, dałem większy opornik na vcc i zaczęło działać wszystko... moją winą było złe (za duże) zasilanie. Może jakieś przebicie było.... dzięki za pomoc wszystkim
REKLAMA