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

[ATmega16a][BASCOM]Dziwne, niestabilne zachowanie pinów jako wejścia

fliper_katrill 03 Kwi 2021 13:17 633 12
REKLAMA
  • #1 19357578
    fliper_katrill
    Poziom 20  
    Dzień dobry, może na początku przedstawię kod testowy:
    
    $regfile = "m16adef.dat"
    $crystal = 8000000
    
    Config Pina.7 = Input
    Config Pinc.5 = Input
    Config Pinc.4 = Output
    
    
    Poziom Alias Pina.7
    Obudowa Alias Pinc.5
    Led_p Alias Portc.4
    
    Obudowa = 1
    Poziom = 1
    Led_p = 0
    
    Do
    If Obudowa = 0 Then
       Led_p = 1
       Else
       Led_p = 0
    End If
    Loop
    

    Bardzo prosty, ale ma tylko uzmysłowić/pokazać niewłaściwe/dziwne działanie pinów mikrokontrolera. Problem powstaje gdy chcę sprawdzić stan pinów jak w kodzie. W przypadku pinu Pinc.5 ustawiam na nim stan wysoki a jego zwarcie do GND ma powodować włączenie diody Led_p. Po włączeniu układu dioda świeci non stop jakby na tym pinie było zwarcie do masy, chociaż nie jest. JTAG mam wyłączony, fusebit KLA987 na wartości 010100 wew. osc. RC 8MHz. Jakby to jeszcze tak działało to pół biedy, znaczy coś niewłaściwie skonfigurowałem itd., ale...... no właśnie. Dotknę ten pin śrubokrętem gaśnie, sam się włącza, puknę znowu to się włącza i czasem sam gaśnie. Coś jakby sam uC nie mógł się zdecydować jaki na tym pinie jest stan, lub może zimny lut, poprawiłem. To samo.
    Co do Pina.7 jest ciut lepiej. Zwieram go do masy dioda świeci, puszczam zwarcie i teraz.....dioda nadal świeci a po jakiejś sekundzie się wyłącza i to jest akurat powtarzalne na tym pinie. Tutaj jakby dziwna pojemność nie pozwalała rozłączyć pinu ze zwarcia od razu (taka moja obserwacja).
    Próbowałem zmienić definicję pliku uC i testowałem w wariantach m16adef.dat i m16def.dat cały czas jest to samo. Czytałem forum i Bascomowicze mają rozterki z wersjami ATmega16 i ATmega16A, w większości radzono im przejście na C. Ja spróbuję Was zapytać, może akurat, ktoś spotkał się z taką sytuacją, na pewno ktoś z Was ma większe doświadczenie. Czy uC jest oryginalny nie wiem, czy może być uszkodzony? Mam jeszcze jeden...pytanie czy nie warto przelutować go na wersję 16 bez A. Niby A jest bardziej energooszczędny i w innej technologii, być może to wpływa na dziwne pływanie pinów. Proszę o pomoc i wskazówki.
    Dziękuję z góry.
    PS. w przypadku pinu C.5 jest on bezpośrednio podłączony do włącznika zwiernego i do GND, w przypadku A.7 pin jest podłączony przez zworę (otwieraną i zamykaną do testów) i szeregowy rezystor 1K do GND.
  • REKLAMA
  • Pomocny post
    #2 19357695
    BlueDraco
    Specjalista - Mikrokontrolery
    A w jaki sposób masz te linie podciągnięte do plusa? Nie widzę włączenia wewnętrznych rezystorów, schematu nie pokazałeś. Z opisu zgaduję, że linie albo zwierasz do masy, albo pozwalasz im łapać duchy z powietrza - i właśnie te duchy oglądasz.
  • REKLAMA
  • Pomocny post
    #3 19357874
    Kuniarz
    Moderator Projektowanie
    Daj :
    SET PORTC.5
    SET PORTA.7

    w tym momencie podciągniesz wejścia do plusa zasilania. Zwierając teraz je do masy powinno działać lepiej.
    Pomogłem? Kup mi kawę.
  • #4 19357930
    fliper_katrill
    Poziom 20  
    Dziękuję za odpowiedzi. Obaj mieliście rację idąc w kierunku podciągania pinu do plusa. Ja nie wiem skąd, coś pomyliłem i wydawało mi się, że pisząc :
    
    Obudowa = 1
    Poziom = 1
    Led_p = 0
    

    ustalam w ten sposób podciąganie pinu do stanów wysokich i niskiego. Zakładałem, że po to jest alias (zawiera nazwę pinu), który sprawę rozwiąże. Co gorsza przyznam się, że taka była moja praktyka więc nie wiem jakim cudem błędy wyszły dopiero teraz. Podsumowując, właściwe jest podciąganie do VCC i GND poprzez SET i RESET a nie jak ja to zrobiłem.
    PS Poprawne jest SET Obudowa, Reset Led_p ?

    Moderowany przez Madrik:

    Temat odblokowany na prośbę autora.

  • REKLAMA
  • #6 19358782
    Kuniarz
    Moderator Projektowanie
    fliper_katrill napisał:
    PS Poprawne jest SET Obudowa, Reset Led_p ?

    Osobiście przy podciąganiu do VCC nie używam aliasów. Może to i działa, ale ja tam mam swoje utarte ścieżki ;-)
    Pomogłem? Kup mi kawę.
  • Pomocny post
    #7 19358989
    Konto nie istnieje
    Poziom 1  
  • #8 19370829
    fliper_katrill
    Poziom 20  
    Dzień dobry, nie wyczuwam jednak kiedy PORTD.5=1 a kiedy SET PORTD.5, trudno. Wiem na pewno, że dodanie SET PORT pomogło a stosowanie przeze mnie Zmienna =1 czy 0 nie daje właściwych rezultatów nawet jak zmienna jest aliasem portu docelowego. Tyle mogę stwierdzić ja :)
  • #9 19371609
    miroskop
    Poziom 23  
    A może "Obudowa Alias Pinc.5" to nie to samo co "Obudowa Alias Portc.5" :)
  • REKLAMA
  • #10 19373073
    Konto nie istnieje
    Poziom 1  
  • #11 19373172
    linuxtorpeda
    Poziom 26  
    emarcus napisał:
    Ignorowanie zapoznania sie z dokumentacją prowadzi do pozostania na poziomie :
    „Dumber than a stump”, równym z analfabetą.

    Niestety, odnosi się to też do Pana, gdyż stwierdzenie:
    emarcus napisał:
    Z POZIOMU PROGRAMU NIE MOŻESZ EDYTOWAĆ REJESTRU ‘PIN.x’ .

    jest fałszywe.

    Dokumentacja mikrokontrolera ATmega168 stwierdza bardzo wyraźnie:
    "Writing a logic one to PINxn toggles the value of PORTxn, independent on the value of DDRxn. Note that the SBI instruction can be used to toggle one single bit in a port."
    Nie jest to co prawda ATmega16A ani ATmega16, ale są to często mikrokontrolery stosowane zamiennie, kompatybilne ze sobą na poziomie binarnym w 99%, więc warto mieć to na uwadze.
  • #12 19374246
    Konto nie istnieje
    Poziom 1  
  • #13 19374272
    bart-projects
    Poziom 29  
    JanBrzechwa napisał:
    Moi drodzy, po co kłótnie, Po co wasze swary głupie, Wnet i tak zginiemy w zupie!


    Może krótko i merytorycznie wyjaśnię Bascom`owe podstawy a zacznę od komend Set i Reset.
    Otóż potrafią one ustawiać tylko jeden bit na raz. Jeśli numer bitu nie jest wskazany to zawsze będzie to bit numer 0. Dlatego wskazane piny portów PINx, PORTx, DDRx i inne ustawiają "intuicyjnie".
    Można nimi także ustawiać poszczególne bity w zmiennych. Haczyk jest tam gdzie wskazałem wcześniej. Jeśli napiszemy "Set Zmienna" nie podając numeru bitu to będzie ona wyglądać tak "&B0000_0001" czyli będzie miała wartość 1.
    Jeśli w Zmiennej będzie wartość 255 a napiszemy "Reset Zmienna" to jej wartość wyniesie "&B1111_1110" czyli 254.

    Następna sprawa to polecenie "Config Pin/Port". Dla Bascom nie ma znaczenia Czy konfigurujemy Pin czy Port więc obydwie notacje (na razie) są poprawne i będą się odnosiły do korespondującego rejestru DDRx.

    Aliasy w Bascom można nadawać dowolnemu bitowi. Czy to PORT`u, czy to "PIN`owi, czy to dowolnemu bitowi w dowolnym rejestrze - w tym DDRx.
    Chcąc więc dynamicznie zmieniać to czy pin ma być wejściem czy wyjściem (co przydaje się, na przykład, przy komunikacji 1wire lub DHT22 itp.) możemy nadać Alias w DDRx i poprzez komendy Set i Reset sterować kierunkiem.
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod

    Podając numer bitu Aliasem nie ma znaczenia czy używamy Set/Reset czy piszemy:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Ostatnia sprawa to domyślne stany rejestrów.
    Domyślnie każdy pin jest wejściem. Teoretycznie nie trzeba więc go konfigurować jako wejście jeśli ma być wejściem. Nadajemy więc Alias dla rejestru PINx, ale podciąganie musimy włączyć "ręcznie" w rejestrze PORTx. Po prostu do rejestru PINx możemy wpisywać, ale nic to nie zmieni. Podciąganie włącza się w PORT.
    Prawidłowo więc:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Z wyjściami jest prościej. Nadajemy Alias i Alias możemy skonfigurować jako wyjście po czym ewentualnie zmienić domyślny stan niski na wysoki.
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    I to tyle a tu cała strona postów :D

Podsumowanie tematu

Dyskusja dotyczy problemów z niestabilnym działaniem pinów mikrokontrolera ATmega16A w kodzie napisanym w BASCOM. Użytkownik zauważa, że pin Pinc.5, skonfigurowany jako wejście, nie działa poprawnie, co prowadzi do nieoczekiwanych efektów, takich jak ciągłe świecenie diody LED. Uczestnicy sugerują, że problem może wynikać z braku podciągania pinów do VCC, co jest kluczowe dla stabilności sygnałów. Wskazują na konieczność użycia komend SET i RESET do prawidłowego podciągania pinów oraz wyjaśniają różnice między rejestrami DDR, PORT i PIN. Użytkownik przyznaje, że jego wcześniejsze podejście do podciągania pinów było błędne i potwierdza, że zastosowanie SET poprawiło działanie układu.
Podsumowanie wygenerowane przez model językowy.
REKLAMA