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

ATmega8 i BASCOM - problem z odczytem stanu wejść na płytce ZL2AVR

rrx_manieq 12 Lis 2006 21:15 2386 10
REKLAMA
  • #1 3217660
    rrx_manieq
    Poziom 11  
    Posty: 6
    Pomógł: 1
    Ocena: 1
    Czołem,

    Od niedawna postanowiłem powalczyć z mikrokontrolerami. Zakupiłem płytkę do zestawu uruchomieniowego ZL2AVR, wszystko sobie zmontowałem i generalnie działa. To znaczy: działa, do momentu gdy próbuję odczytać stan któregokolwiek z wejść. Gdy tylko ustawiam wyjścia - wszystko działa ok. Napisałem sobie taki programik:
    ' No to tak:
    '
    ' * Port C będzie wejœciowym (bity 0..3)
    '   - C.0 - minimum (1)
    '   - C.1 - zmniejsz
    '   - C.2 - zwiększ
    '   - C.3 - maksimum (8)
    '
    ' * Port B - wyjœciowy (LED)
    '
    ' I sterujemy linijkš œwietlš, która się zwiększa/zmniejsza
    ' Stan linijki mamy w zmiennej LedBar
    '
    
    ' Ta procedura 'przetłumaczy' i wyœwietli właœciwy stan LEDów
    Declare Sub Leddriver(v As Byte)
    
    '
    ' ustawienia startowe
    '
    Config Portc = Input
    Config Pinc.0 = Input
    Config Pinc.1 = Input
    Config Pinc.2 = Input
    Config Pinc.3 = Input
    Config Portb = Output
    
    Ddrc = &B11110000
    
    Dim Ledbar As Byte
    
    Ledbar = 11
    Portb = Ledbar
    
    Do
       If Pinc.0 = 0 Then
          Ledbar = 1
       Elseif Pinc.1 = 0 Then
          If Ledbar > 1 Then
             Decr Ledbar
          End If
       Elseif Pinc.2 = 0 Then
          If Ledbar < 15 Then
             Incr Ledbar
          End If
       Elseif Pinc.3 = 0 Then
          Ledbar = 15
       End If
       Leddriver Ledbar
       Waitms 10
    
    Loop
    
    End                                                         'end program
    
    Sub Leddriver(v As Byte)
       Dim P As Byte
       Select Case V
          Case 1 : P = &B00000001
          Case 2 : P = &B00000011
          Case 3 : P = &B00000111
          Case 4 : P = &B00001111
          Case 5 : P = &B00011111
          Case 6 : P = &B00111111
          Case 7 : P = &B01111111
          Case 8 : P = &B11111111
          Case 9 : P = &B11111110
          Case 10 : P = &B11111100
          Case 11 : P = &B11111000
          Case 12 : P = &B11110000
          Case 13 : P = &B11100000
          Case 14 : P = &B11000000
          Case 15 : P = &B10000000
       End Select
       Portb = P
    End Sub Leddriver(v As Byte)

    No i nic się nie dzieje, tzn. nie reaguje na klawisze. Jeśli ktoś zna ten zestaw to okablowałem go następująco:
    * Złącza R1, R2 zwarte do masy,
    * Złącza C1..C4 podłączyłem do wejśc PC0..PC3
    (w ten sposób powinenem mieć na porcie C (0..3) te cztery przyciski do sterowania)
    * cały port PB podłączyłem do linijki diod ( D1..D8 )

    Aha, nie wiem czy to ważne, ale mam zwarte jumtery JP2 i JP3 do rezonatora i JP1 do resetu (chociaż sprawdzałem też otwartymi zworkami i bez podłączonego interfejsu SPI 0 nic się nie zmieniało).

    Czy ktoś może mi podpowiedzieć co generalnie robię nie tak? Wiem że jest książka do BASCOM-a ale na razie jej nie mam. Opierałem się na opisie w necie + przykłady, ale być może coś źle zrozumiałem :-(

    ________

    Kompilowane pod linuxem : wine + bascomp; kod wgrywany przy avrdude
  • REKLAMA
  • #2 3217997
    cyberdar
    Poziom 31  
    Posty: 1465
    Pomógł: 161
    Ocena: 73
    Witam

    Nie znam schematu dlatego trudno mi jest powiedzieć czy program jest napisany dobrze. Być może jest tam klawiatura matrycowa i obsługuje się ja nieco inaczej niż klawisz podpięty pod port. Druga sprawa to deklaracja portu na początku programu.
    Najpierw deklarujesz cały port jako wejście a następnie deklarujesz każdy pin z portu C osobno. Tak być nie powinno. Podwójna deklaracja nie jest potrzebna. W helpie opisane jest jak się konfiguruje porty.

    --
    pozdrawiam
  • #3 3218334
    M. S.
    Poziom 34  
    Posty: 2107
    Pomógł: 259
    Ocena: 680
    Config Portc = Input
    Config Pinc.0 = Input
    Config Pinc.1 = Input
    Config Pinc.2 = Input
    Config Pinc.3 = Input


    Skoro Config Portc = Input to po co
    Config Pinc.0 = Input
    Config Pinc.1 = Input
    Config Pinc.2 = Input
    Config Pinc.3 = Input

    Proponuję tak

    Config Pinc.0 = Input
    Config Pinc.1 = Input
    Config Pinc.2 = Input
    Config Pinc.3 = Input
    
    Portc.0 = 1
    Portc.1 = 1 'Musimy włączyć wewnętrzne podciąganie
    Portc.2 = 1 'Przyciski podłączamy pomiędzy masę a końcówkę uC
    Portc.3 = 1


    Bez Config Portc = Input
    no i bez tego
    Ddrc = &B11110000 - to to samo co Config Port - można stosować ale zamiennie. Inaczej robisz 2 x to samo.

    Ledbar = 11
    Portb = Ledbar

    Nie lepiej


    I poczytaj koniecznie na forum o portach w AVR'ach.
  • REKLAMA
  • #4 3226595
    jacynka84
    Poziom 26  
    Posty: 1170
    Pomógł: 13
    Ocena: 29
    Masz LCD? to wpisz

    Config portx.x = Output ' dla Przycisków

    Do
    Cls
    Lcd"" ;Pinx.x
    Waitms 100 'bez tego Lcd nie nadąża z wyświetlaniem
    Tak sprawdzisz czy uP reaguje na Przyciski ,też miałem podobny Problem.
  • #5 3227508
    M. S.
    Poziom 34  
    Posty: 2107
    Pomógł: 259
    Ocena: 680
    Jeśl chcecie żeby LCD się wyrabiał to nie stosujcie CLS.

    Wyświetlacz bedzie działał nawet tak:

    Do
    Locate 1 , 1
    LCD "WYSWIETLAM SOBIE"
    Loop
  • REKLAMA
  • #6 3227553
    jacynka84
    Poziom 26  
    Posty: 1170
    Pomógł: 13
    Ocena: 29
    Ale czy bez tego nie będzie przesuwał textu dalej dorzucając następny? teraz nie moge tego sprawdzić.
  • #7 3227871
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    jacynka84 napisał:
    Ale czy bez tego nie będzie przesuwał textu dalej dorzucając następny? teraz nie moge tego sprawdzić.

    Ale w helpie Bascoma możesz sprawdzić , co oznacza Locate y,x :D

    Piotrek
  • REKLAMA
  • #8 3228454
    jacynka84
    Poziom 26  
    Posty: 1170
    Pomógł: 13
    Ocena: 29
    Kurdemol ,gdzieś posiałem neseser z moim muzgjem.
    Locate x,y zapewne działa siłą rzeczy też jak Cls...
    I pomimo to nie będzie ściemniał ostatnich znaków?
  • #9 3228800
    M. S.
    Poziom 34  
    Posty: 2107
    Pomógł: 259
    Ocena: 680
    Jak znajdziesz neseser to pomyśl jak to zrobić, żeby kasowały się znaki, które nie będą nadpisane.
    P.S. Gdybyś jednak dłuższy czas nie mógł dojść do siebie to podpowiem, że zawsze można wyświetlić nic czyli spację.
  • #10 3326830
    Sind
    Poziom 16  
    Posty: 182
    Pomógł: 9
    Ocena: 3
    Witam

    A mozesz dokladnie opisac co maja robic poszczegolne przyciski i jak sie maja zachowywac ledy ??

    Czy to ma byc jakis waz swietlny, czy moze pasek rosnaco malejacy :) ?? Jak jeszcze Cie to interesuje to napisz postaram Ci sie pomoc
  • #11 3327059
    medicb
    Poziom 28  
    Posty: 1457
    Pomógł: 89
    Ocena: 64
    M. S. napisał:
    Jeśl chcecie żeby LCD się wyrabiał to nie stosujcie CLS.

    Wyświetlacz bedzie działał nawet tak:

    Do
    Locate 1 , 1
    LCD "WYSWIETLAM SOBIE"
    Loop

    I jeszcze moje trzy grosze co do CLS :D przesówając tekst po ekranie np w lewo można na jego końcu dawać " " spację :) czyści za sobą ekran bez użycia CLS

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy problemu z odczytem stanu wejść na płytce uruchomieniowej ZL2AVR z mikrokontrolerem ATmega8 programowanym w BASCOM. Autor zgłasza, że wyjścia działają poprawnie, natomiast odczyt wejść portu C (bity 0..3) nie przynosi oczekiwanych rezultatów. Wskazano, że nie należy deklarować portu jako wejścia globalnie i jednocześnie poszczególnych pinów osobno, gdyż powoduje to konflikt konfiguracji. Zalecane jest skonfigurowanie tylko poszczególnych pinów jako wejścia oraz włączenie wewnętrznych rezystorów podciągających (pull-up) przez ustawienie bitów portu na 1, co jest konieczne przy podłączaniu przycisków do masy. Podkreślono, że konfiguracja DDRC (rejestru kierunku portu) i użycie polecenia Config Portc = Input są wzajemnie zamienne i nie powinny być stosowane jednocześnie. Wskazano także na konieczność poprawnego sterowania wyświetlaczem LCD, unikając nadmiernego użycia polecenia CLS, które może spowalniać działanie. Dodatkowo zasugerowano, aby przy przesuwaniu tekstu na LCD stosować spacje do czyszczenia ekranu zamiast CLS. W odpowiedzi pojawiła się prośba o dokładniejsze opisanie funkcji przycisków i zachowania diod LED, aby lepiej dopasować pomoc.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA