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

Jak podłączyć niestabilne wyłączniki do portu C w At90s8535 w Bascom AVR?

Asteroid 21 Mar 2006 11:12 1632 12
REKLAMA
  • #1 2439866
    Asteroid
    Poziom 20  
    Posty: 549
    Pomógł: 18
    Ocena: 188
    Witam piszę programik i chcę podpiąc wyłączniki niestabilne do portuc (At90s8535) ale jeżeli napiszę

    portc.1=input
    portc.2=input
    itd.

    to wyskakują mi błędy co może byc przyczyna i do jakich portów najlepiej podpiąc 5 wyłączników chodzi mi oto aby po pojawieniu się 0 na 1 końcówce załączył 1 diodę zaś gdy na 1i2 jest 0 wtedy drugą czemu nie działa to na portach c a na d działa ?
    Jeszcze jedno do czego są te zielone diody w Bascomie avr w symulacji?
    Które porty wykorzystywac do czego ?
  • REKLAMA
  • #2 2439880
    1ceman
    Poziom 12  
    Posty: 104
    Pomógł: 1
    Cześć
    Jeśli ustawiasz wybraną linie portu stosujesz komendę pinx.x.

    Czyli w Twoim przypadku:
    Pinc.1=input (Pinc.1=0 - równoznaczny zapis)
    Pinc.2=input (Pinc.2=0)


    Zielone diody pozwalają na obserwacje stanów portów przy przeprowadzaniu symulacji, ale żeby działały musisz wcisnąć ikonke z kartką i rączką (refresh variables) :)
  • REKLAMA
  • #3 2439900
    Asteroid
    Poziom 20  
    Posty: 549
    Pomógł: 18
    Ocena: 188
    Napisałem tak jak mówiłeś i bez zmian ? Zastanawia mnie tylko bo w symulacji przy czerwonych diodach jest tylko PB i PD a przy zielonych IB ID (co to jest IB ID)?

    Dodano po 12 [minuty]:

    już ustawiłem są wdzystkie porty tylko mam jeszcze jednoi pytanko
    PA PB PC PD -diody czerwone w symulacji pokazują stan portów
    IA IB IC ID -diody zielone niewiem co one pokazuja ???
    Do czego które pory wykorzystywac które porty do np. wyłączników ,do diodek, do sprawdzania napięcia a które do załączania przekażników ?
  • Pomocny post
    #4 2439964
    1ceman
    Poziom 12  
    Posty: 104
    Pomógł: 1
    Diody czerwone pokazują stan portów tak jak napisałeś. Diody zielone to wejścia, czyli symulujesz dzięki nim zmiany na wejściu danego portu.

    Wpisz sobie program:
    $regfile = "m8def.dat"   'tutaj zmieniasz wpis odpowiednio dla swojego mikrokontrolera
    
    Config Pinc.1 = 0       'ustawienie pc1 jako wejscia
    Config Pind.1 = 1     'ustawienie pd1 jako wyjscia
    
    Do
       If Pinc.1 = 1 Then   'sprawdzenie stanu pc1
          Portd.1 = 1         'jesli wlaczony to zaswieca diode na porcie pd1
       Else
          Portd.1 = 0         'jesli wylaczony gasi diode na pd1
       End If
    Loop
    End

    Włącz symulacje i zobacz jak działa. Zmieniaj zieloną diode na pc1 i bedziesz widzial jak odpowiada pd1 na te zmiany.

    Druga część pytania, których portów do czego używać wymaga chyba dokładnego poznania budowy mikrokontrolera. Ja też niedawno dopiero zacząłem zabawe z uC, także w tym temacie musi Ci pomóc ktoś bardziej zaawansowany :)
  • #5 2439970
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    jeśli stosujesz procesor at90s8515 i wyżuca ci błąd przy użyciu portu c to zanczy że nie poinformowałeś bascoma jakiego procka posiadasz.
    wejdz w opcje i tam wybież z listy.

    Pinc.1=input (Pinc.1=0 - równoznaczny zapis)

    nie wiem co to znaczy ale chba nie działa

    configuracja pinów odbywa się przez
    config portx = input / output

    lub dla poszczególnych pinów
    config pinx.y =input / output

    można też wpisać odpowiednią wartość do rejestru DDRx

    teraz tak jeśli chcesz wystewić na jakimś pinie stan to wpisujesz go to rejestru wyjściowego PORTx

    gdy chcesz odczytac stan portu czytasz go z rejestru wejściowego PINx

    rejestr DDRx jak juz pisałem jest do określania kierónku przesyłu na porcie (0 - wejście, 1 - wyjście)

    myśle że to koledze troche rozjaśni
  • REKLAMA
  • #6 2439996
    1ceman
    Poziom 12  
    Posty: 104
    Pomógł: 1
    hunterhouse napisał:
    Pinc.1=input (Pinc.1=0 - równoznaczny zapis)

    nie wiem co to znaczy ale chba nie działa

    Oznacza to, że zapis
    Config Pinc.1=input

    jest równoznaczny zapisowi
    Config Pinc.1=0

    U mnie to działa bez żadnych problemów.
  • #7 2441068
    Asteroid
    Poziom 20  
    Posty: 549
    Pomógł: 18
    Ocena: 188
    Czy ten zapis da sie jakoś uprościc ? Może jakaś zmienna tylko niemam pojecia jak to zrobic próbowałem ze zmiennymi ale mi to nie wychodziło !
    Sęk w tym że tych podprogramów jest około 20 ! Wiec niewiem czy mam to robic jak do tej pory czy zastosowac zmienną proszę o pomoc !

    Config Pinc.1 = Input
    Config Pinc.2 = Input
    Config Pinc.3 = Input
    Config Pinc.4 = Input
    Config Pinc.5 = Input



    Do

    If Pinc.1 = 0 And Pinc.2 = 1 And Pinc.3 = 1 And Pinc.4 = 1 And Pinc.5 = 1 Then Gosub Poczatek 'pozycja wyłączony

    If Pinc.1 = 0 And Pinc.2 = 1 And Pinc.3 = 1 And Pinc.4 = 0 And Pinc.5 = 0 Then Gosub Program1: 'zakres jasny niebieski

    If Pinc.1 = 0 And Pinc.2 = 0 And Pinc.3 = 1 And Pinc.4 = 0 And Pinc.5 = 1 Then Gosub Program2: 'zakres jasny niebieski

    If Pinc.1 = 0 And Pinc.2 = 0 And Pinc.3 = 1 And Pinc.4 = 1 And Pinc.5 = 0 Then Gosub Program3: 'zakres jasny niebieski

    If Pinc.1 = 0 And Pinc.2 = 0 And Pinc.3 = 1 And Pinc.4 = 1 And Pinc.5 = 1 Then Gosub Program4: 'zakres jasny niebieski

    If Pinc.1 = 0 And Pinc.2 = 1 And Pinc.3 = 0 And Pinc.4 = 1 And Pinc.5 = 0 Then Gosub Program5: 'zakres jasny niebieski

    If Pinc.1 = 0 And Pinc.2 = 0 And Pinc.3 = 0 And Pinc.4 = 0 And Pinc.5 = 1 Then Gosub Program6: 'zakres jasny niebieski

    If Pinc.1 = 0 And Pinc.2 = 0 And Pinc.3 = 0 And Pinc.4 = 1 And Pinc.5 = 1 Then Gosub Program7: 'zakres jasny niebieski




    Loop

    Dodano po 36 [minuty]:

    czy pisząc jak wyżej wystarczy mi 4 kilobajty pamięci procka?
  • #8 2441295
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    Config Pinc.1 = Input 
    Config Pinc.2 = Input 
    Config Pinc.3 = Input 
    Config Pinc.4 = Input 
    Config Pinc.5 = Input 
    to w sumie niepotrzebne bo standardowo po resecie wszystki piny są ustawione jako wejścia . gdy brakuje miejsca to każda linijka jest ważna.
    ja bym to usuną
    
    
    to to juz masakra jakaś hehe:)
    Do 
    If Pinc.1 = 0 And Pinc.2 = 1 And Pinc.3 = 1 And Pinc.4 = 1 And Pinc.5 = 1 Then Gosub Poczatek 'pozycja wyłączony 
    
    If Pinc.1 = 0 And Pinc.2 = 1 And Pinc.3 = 1 And Pinc.4 = 0 And Pinc.5 = 0 Then Gosub Program1: 'zakres jasny niebieski 
    
    If Pinc.1 = 0 And Pinc.2 = 0 And Pinc.3 = 1 And Pinc.4 = 0 And Pinc.5 = 1 Then Gosub Program2: 'zakres jasny niebieski 
    
    If Pinc.1 = 0 And Pinc.2 = 0 And Pinc.3 = 1 And Pinc.4 = 1 And Pinc.5 = 0 Then Gosub Program3: 'zakres jasny niebieski 
    
    If Pinc.1 = 0 And Pinc.2 = 0 And Pinc.3 = 1 And Pinc.4 = 1 And Pinc.5 = 1 Then Gosub Program4: 'zakres jasny niebieski 
    
    If Pinc.1 = 0 And Pinc.2 = 1 And Pinc.3 = 0 And Pinc.4 = 1 And Pinc.5 = 0 Then Gosub Program5: 'zakres jasny niebieski 
    
    If Pinc.1 = 0 And Pinc.2 = 0 And Pinc.3 = 0 And Pinc.4 = 0 And Pinc.5 = 1 Then Gosub Program6: 'zakres jasny niebieski 
    
    If Pinc.1 = 0 And Pinc.2 = 0 And Pinc.3 = 0 And Pinc.4 = 1 And Pinc.5 = 1 Then Gosub Program7: 'zakres jasny niebieski 
    
    Loop 
    


    zamiast tego poroponawał bym

    
    Dim Tmp As Byte
    
    Do
       Tmp = Pinc And &B00111110
       Shift Tmp , Right , 1
       If Tmp > 19 Then Tmp = 19                                'zapobiega przekroczeniu zakresu
       On Tmp Gosub Program1 , Program2 , Program3 , Program4 , Program5 , Program6 , Program7 , Program8 , Program9 , Program10 , Program11 , Program12 , Program13 , Program14 , Program15 , Program16 , Program17 , Program18 , Program19 , Program20
    Loop
    
    Program1:
    Return
    Program2:
    Return
    Program3:
    Return
    Program4:
    Return
    Program5:
    Return
    Program6:
    Return
    Program7:
    Return
    Program8:
    Return
    Program9:
    Return
    Program10:
    Return
    Program11:
    Return
    Program12:
    Return
    Program13:
    Return
    Program14:
    Return
    Program15:
    Return
    Program16:
    Return
    Program17:
    Return
    Program18:
    Return
    Program19:
    Return
    Program20:
    Return
    

    napewno będzie działać szybciej
  • #9 2441316
    greg_matrix
    Poziom 17  
    Posty: 163
    Pomógł: 28
    Ocena: 3
    Można sobie troche uprościć życie :-) Z tego co się zorientowałem masz tu 5 wejść, można zamienić konfigurację wejść na liczbę i dalej operować już tylko liczbą. Tak jest prościej. Wygodnie jest napisać podprogram, który to robi. Kiedy w programie będziesz potrzebował odczytać stan wejść po prostu wywołasz podprogram- zmienna "Stan" przyjmie odpowiednią wartość i załatwione.

    Odczyt:
    Stan=0
    
    If Pinc.1=1 then 
    Stan=Stan+1
    End if
    
    If Pinc.2=1 then 
    Stan=Stan+2
    end if
    
    If Pinc.3=1 then 
    Stan=Stan+4
    End if
    
    If Pinc.4=1 then 
    Stan=Stan+8
    End if
    
    If Pinc.5=1 then 
    Stan=Stan+16
    End if
    
    Return


    Teraz stan wszystkich wejść jest reprezentowany przez jedną zmienną "Stan". Można użyć instrukcji "Select Case"- to poprawi przejrzystość i na pewno skróci zapis w dalszej części programu.

    PS.
    Nie wiem co dokładnie robisz w swoim programie- proponuję wymyśleć na własny użytek najwygodniejszy sposób konstruowania liczbt "Stan" żeby było jej łatwo używać. To powyżej to pierwsze co przychodzi do głowy, czyli system dwojkowy.
  • #11 2441347
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    jaki błąd ???? może niezdeklarowałeś zmiennej tmp??
    albo nieprzestawiłeś na twojego procka (w opcjach) , domyślnie jest at90s2313 a on niema portc.
  • REKLAMA
  • Pomocny post
    #13 2442815
    greg_matrix
    Poziom 17  
    Posty: 163
    Pomógł: 28
    Ocena: 3
    Tak dla sprostowania na początek: zasadniczo to co ja napisałem jest bardzo podobne do pomysłu kolegi "hunterhouse"- napisaliśmy odpowiedź prawie w jednym czasie :-) Nie żebym się tu powtarzał czy coś w tym rodzaju.

    Powiedzmy dla przykładu, że masz 1 na Pinach 2 i 3 a na pozostałych 0, wtedy zmienna "Stan" wyniesie 2+4=6 (dla każdej konfoguracji jest inna liczba). Czyli program, który wywołujesz przy warunku Pin2=1 And Pin3=1 (piszę skrótowo) możesz wywołać kiedy zmienna "Stan" wynosi 6. Ten sam efekt ale krótszy zapis i bardziej intuicyjnie. I tak dalej- możesz sobie rozpisać przy jakich stanach na wejściu jakie masz wartości zmiennej. Dalej robisz dosyć podobnie jak zasugerował hunterhouse:
    Select Case Stan
       Case 1:
       Instrukcje1
       Case 2:
       Instrukcje2
       ...
       ...
       ...
    End Select

    To co wyżej się nazywa "Case 1" "Case 2" itd to są właśnie wartości zmiennej Stan. Wykonywaną instrukcją może być skok do podprogramu, czyli:
    Select Case Stan
       Case 1:
       Gosub Podprogram1
       Case 2:
       Gosub Podprogram2
       ...
       ...
       ...
    End Select

Podsumowanie tematu

✨ Dyskusja dotyczy problemów z podłączeniem niestabilnych wyłączników do portu C mikrokontrolera At90s8535 w Bascom AVR. Podstawowym błędem jest nieprawidłowa konfiguracja portów – w Bascomie do ustawiania kierunku pinów używa się polecenia "Config Pinc.x = Input/Output", a nie bezpośredniego przypisywania wartości do portu. Po resecie piny są domyślnie wejściami, więc konfiguracja może być zbędna. Zielone diody w symulacji Bascom AVR reprezentują stany wejść (PINx), a czerwone stany portów wyjściowych (PORTx). Aby uprościć obsługę wielu wyłączników, proponowano odczyt stanów pinów do jednej zmiennej liczbowej, gdzie każdy bit odpowiada jednemu pinowi, co pozwala na użycie instrukcji Select Case do sterowania programem. Problemy z błędami mogą wynikać z nieustawienia właściwego modelu mikrokontrolera w opcjach Bascom (domyślnie jest at90s2313, który nie posiada portu C). Zalecane jest użycie polecenia "Config" do ustawiania kierunku pinów oraz deklarowanie zmiennych przed ich użyciem. Wskazano również, że porty D działają poprawnie, a port C wymaga odpowiedniej konfiguracji i wyboru właściwego modelu procesora.
Wygenerowane przez model językowy.
REKLAMA