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.

[ATMEGA32][BASCOM] zwarcie pinu do GND a możliwość upalenia

Antystatyczny 09 Cze 2012 22:33 1473 12
  • #1 09 Cze 2012 22:33
    Antystatyczny
    Poziom 16  

    Witam.

    Czy polecenie portb = %B11111111 powoduje, że mogę piny tegoż portu zwierać do GND bez rezystorów? (klawiatura). Oczywiście mam na myśli sytuację, w której wcześniej ustalę config portb = input. Chodzi mi o wewnętrzne rezystory pull up. Przegrzebuję help w bascomie, przegrzebuję google, ale nie bardzo dostrzegam jasną i jednoznaczną wypowiedź.

    Bardzo proszę o jakąś wskazówkę bądź link.

    Pozdrawiam

    PS. W bascomie nie jest opisana komenda ddr, proszę o kilka słów wyjaśnienia w sprawie działania tej komendy

    0 12
  • #2 09 Cze 2012 22:52
    kiclaw
    Poziom 16  

    Ja się bawię w C, ale myślę że to podobnie.

    Co do DDR to sprawa jest taka : DDRA = 0X00 - wszystkie piny portu A są wejściami
    DDRA = 0XFF - wszystkie piny portu A są wyjściami
    Czyli DDR ustawia czy dane piny portu są wejściami czy wyjściami
    Klik, link do kursu.

    A co do tego zwarcia.

    Rozumiem że te porty ustawiasz jako wejścia (czyli DDRB = 0X00), to wtedy swichem możesz zawrzeć to do GND i wtedy stan na PINB będzie 0, więc uC będzie wiedział że switch jest wciśnięty. Inna sprawa ma się jeśli było by to wyjście, wtedy z tego co wiem nie wolno tak sobie tego zwierać do GND.

    Zaznaczam że jestem dość początkujący w tym temacie ale wydaje mi się że wszystko opisałem poprawnie.

    0
  • #3 09 Cze 2012 22:57
    Antystatyczny
    Poziom 16  

    Równiez jestem bardzo początkujący, dlatego proszę o wypowiedź kogos bardzo doświadczonego, bo za tę kostkę dałem 24 złote :D
    ---
    Ok, kumam czaczę.
    config portb = input 'wejscie
    ddrb = &B00000000 ' tu nie bardzo wiem, o co chodzi
    portb = &B11111111 ' to powoduje włączenie wewnętrzych rezystorów pull up

    proszę o korektę jeśli źle to zrozumiałem

    0
  • Pomocny post
    #4 09 Cze 2012 23:25
    jacekk232
    Poziom 16  

    kiclaw napisał:
    Rozumiem że te porty ustawiasz jako wejścia (czyli DDRB = 0XFF),


    Drobna pomyłka bo powinno być DDRB = 0x00, czyli DDRB = 0b00000000.
    Niby drobiazg, ale początkującemu może namieszać.

    W procesorach AVR każda końcówka I/O powiązana jest z trzema rejestrami, które to decydują o przeznaczeniu tej końcówki. Te rejestry to:
    DDR - rejestr kierunku, ustala czy dana końcówka będzie wejściem czy wyjściem.
    PORT - rejestr wyjściowy
    PIN - rejestr wejściowy.

    Spróbuję to wytłumaczyć na przykładzie jakiejś końcówki np. PB1.
    Jeśli DDRB.1 = 0 końcówka pracuje jako wejście.
    Jeśli DDRB.1 = 1 końcówka pracuje jako wyjście.

    Jeśli końcówka pracuje jako wejście (DDRB.1 = 0) to:
    PORTB.1 = 1 włącza wewnętrzne rezystory podciągające do VCC (pull-up).
    PORTB.1 = 0 końcówka pracuje jako wejście pływające. Napięcie na wejściu "pływa" tzn. zmienia się swobodnie pomiędzy wartością GND a VCC.

    Jeśli końcówka pracuje jako wyjście (DDRB.1 = 1) to:
    PORTB.1 = 0 ustawia na tej końcówce stan niski
    PORTB.1 = 1 ustawia na tej końcówce stan wysoki.

    DDRB = &b00000000 to to samo co Config Portb = Input

    Jeśli coś będzie niezrozumiałe to pytaj.

    0
  • #5 09 Cze 2012 23:34
    Antystatyczny
    Poziom 16  

    Rozumiem więc, że w bascom wystarczy, gdy napiszę, że portb = input. Właśnie o to mi chodziło, by wiedzieć, która instrukcja włacza pull up w konkretnym porcie. Oczywiście wiem, że konkretne jedynki w zapisie binarnym odpowiadają pinom kofigurowanego portu. Bardzo, ale to bardzo dziękuję!

    Mam nadzieję, że się tu odwdzięczę mniej doświadczonym (ode mnie) forumowiczom :-)

    Drobny dodatek - portb = input, a następnie portb =&B11111111 - wtedy wszystkie piny mają właczony pull up
    Pozdrawiam.

    0
  • #6 10 Cze 2012 05:29
    emarcus
    Poziom 34  

    Antystatyczny napisał:
    Rozumiem więc, że w bascom wystarczy,......

    .


    Nie jest ważne czy to Bascom, lub inne środowisko w którym programujesz.
    Jeżeli port ma pracować jako wejście to można zupełnie pominąć wpis w configuracji kierunku portu np:
    config portx.y = input ' nie jest konieczny
    albo
    DDRx = &B00000000
    DDRx = &H00
    DDRx = 0x00 ' co oznacza to samo

    Atmel AVR z natury ma "by default" wszystkie porty wejściami.
    Jeżeli w programie dany port był używany jako wyjśce (np LCD display) i w dalszej częsci tego programu chcemy ten sam port używać jako wejście (np: keypad) to taką procedurę należy poprzedzić wpisem configuracji tego portu jako wejście. Niemniej jednak dla przejrzystości programu, configuracja portów wejściowych może być pozostawiona bez szkody dla wielkości programu.
    Należy zwrócić uwagę że edytując bezposrednio rejestr
    "DDRx= ...."
    mamy możliwość jednoczesnej mieszanej configuracji (wejścia lub wyjścia) pinów danego portu.

    e marcus

    0
  • #7 10 Cze 2012 09:02
    LordBlick
    VIP Zasłużony dla elektroda

    emarcus napisał:
    Atmel AVR z natury ma "by default" wszystkie porty wejściami.
    Co nie oznacza, żeby utrwalać złe praktyki programistyczne pozostawiania czegokolwiek przypadkowi. Inicjalizacja powinna być pełna i tyle.

    0
  • #8 10 Cze 2012 11:10
    Antystatyczny
    Poziom 16  

    Korzystając z powyższych wskazówek napisałem, co następuje:

    Kod:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Symulacja działania programu wskazuje, że program nie reaguje na zmiany stanu na pinie B0. Gwiazdki przez cały czas wyświetlają się w górnym wierszu. Znowu coś źle zrozumiałem?

    0
  • #9 10 Cze 2012 11:29
    landy13
    Poziom 29  

    Antystatyczny napisał:
    Gwiazdki przez cały czas wyświetlają się w górnym wierszu.

    Prawidłowo.

    Code:
    Locate 2 , 1

    oznacza pierwszy wiersz, drugi znak.

    0
  • #10 10 Cze 2012 11:32
    Antystatyczny
    Poziom 16  

    Niestety nie mogę się z tym zgodzić. Help wyraźnie "mówi":

    locate y , x

    Też mnie to zdziwiło, bo zwyczajowo pierwszą współrzędną jest x.

    ---
    Zmieniłem komendę pinb.0 na portb.0 w instrukcji warunkowej i teraz program działa.

    0
  • #11 10 Cze 2012 11:46
    landy13
    Poziom 29  

    Antystatyczny napisał:
    Niestety nie mogę się z tym zgodzić.

    Rzeczywiście, coś mi się pomieszało. Przepraszam.

    0
  • #12 10 Cze 2012 20:04
    kiclaw
    Poziom 16  

    Cytat:

    ddrb = &B00000000 ' tu nie bardzo wiem, o co chodzi


    Ustawiając tak DDRB, ustawiasz że wszystkie piny portu B są wejściami. Gdybyś dał
    ddrb = &B11111111 - to wszystkie piny były by wyjściami.

    Switche podłączasz do wejść.

    0
  • #13 10 Cze 2012 22:14
    emarcus
    Poziom 34  

    [quote="LordBlick"]

    emarcus napisał:
    o nie oznacza, żeby utrwalać złe praktyki programistyczne pozostawiania czegokolwiek przypadkowi. Inicjalizacja powinna być pełna i tyle.


    Zdaje sie że ten aspekt również w któryms zdaniu nadmieniłem. Nie zauważyleś?

    e marcus

    0