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][Bascom][LCD] Wyłączanie i włączanie podświetlania

keermiit 22 Cze 2010 18:12 2767 7
REKLAMA
  • #1 8218905
    keermiit
    Poziom 10  
    Witam
    Chcę napisać program który wyświetlał by tekst na lcd (program do samego wyświetlania txt działał) ale teraz chciałem zrobić taki co wyświetla tekst i za pomocą przycisku zapala podświetlenie i po ponownym przyciśnięciu by go gasił.

    Pojawiły mi się błędy których wczesniej nie miałem ( kody błędów na screenie)

    [Atmega8][Bascom][LCD] Wyłączanie i włączanie podświetlania

    Tutaj załączam sam kod

    $regfile = "m8def.dat"
    $crystal = 1000000
    
    
    Config Portb.4 = Output                                     'pinb.4 jako wyjście = config Portb = &B00110000 (piny b.3 i b.4 jako output)
    Config Portb.3 = Output                                     'pinb.3 jako wyjscie
    Config Portb.2 = Output
    
    Reset Portb.4                                               'wartość poczatkowa pinb.4 = 0
    Reset Portb.3                                               'wartosc poczatkowa pinb.3 = 0
    Reset Portb.2
    
    
    
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5       'połączenie atmegi z LCD
    
    
    
    If Portb.4 = 1                                              'jeśli na porcie portb.4 pojawi sięnapięcie ( czyli logiczne 1 ) to
     Then
       Do                                                       'pentla DO
       Portb.2 = 1                                              ' na porcie portb.2 zostaje ustawiony bit ( pojawia się napięcie +5V i LCD zostaje podświetlony
       Loop Until Portb.3 = 1                                   'wyjdz z pętli Do..Loop gdy na porcie Portb.3 pojawi sięnapięcie
      Else                                                      'gdy na porcie Portb.4 nie ma napięcia (portb.4 = 0) to...
       Do
       Portb.2 = 0                                              'na porcie Portb.2 ma być brak napięcia ( portb.2 = 0 )
       Loop Until Portb.4 = 1                                   'wyskocz z pętli jezeli na porcie Portb.4 pojawi sięnapięcie
    End If
    
    
    
    
    
    End
    


    Wydaje mi się że problem leży w konfiguracji pinów.

    Czy ktoś mógłby go poprawić i wytłumaczyć mi jak te porty się konfiguruje.
    Czytałem na forum troche o tym i w książce " Mikrokontrolery dla początkujących " ale powiem szczerze że mi troche się już namieszało.

    Wiem że jak chcemy nadać pinowi wartość (0 albo 1) to używamy polecenia
    Set PortX.X a nie Set PinX.X

    Polecenie PinX.X możemy sprawdzić jaki jest stan logiczny danego pinu.
    np: if pinb.4 = 1 then ....

    Dobrze myślę ?

    A początkowa konfiguracja portów/pinów Config portb = output
    to wiem że wszystkie piny portu b jako wyjście czyli stan logiczny 1
    i teraz nie wiem czyli co jest na nich +5V czy jak.

    czy to znaczy że z tak skonfigurowanego portub mogę wysyłąć bity danych
    czy jak ?
  • REKLAMA
  • Pomocny post
    #2 8218996
    comer3
    Poziom 27  
    Instrukcja Pinx.y służy do odczytu stanu portu natomiast Portx.y do ustawienia stanu na porcie. Jeśli sprawdzasz, czy został naciśnięty przycisk to za pomocą instrukcji Pinx.y (wcześniej musisz ustawić Config Pinx.y=Input).
    Poza tym jeśli chcesz włączać/wyłączać podświetlenie LCD to lepiej zrób to przez jakiś tranzystor, a nie bezpośrednio z portu Atmegi, gdyż wydajność prądowa jednego pinu portu to 20mA, co może być za mało do podświetlenia LCD (istnieje ryzyko upalenia pinu na porcie)...
  • REKLAMA
  • #3 8219051
    keermiit
    Poziom 10  
    Comer3 Nic to nie dało po zmianie z portx.y na pinx.y przy sprawdzaniu stanów portu tak jak i cofig portx.y = input

    tu kod po korekcie


    $regfile = "m8def.dat"
    $crystal = 1000000
    
    
    Config Pinb.4 = Input                                       'pinb.4 jako wyjście = config Portb = &B00110000 (piny b.3 i b.4 jako output)
    Config Pinb.3 = Input                                       'pinb.3 jako wyjscie
    Config Portb.2 = Output
    
    Reset Portb.4                                               'wartość poczatkowa pinb.4 = 0
    Reset Portb.3                                               'wartosc poczatkowa pinb.3 = 0
    Reset Portb.2
    
    
    
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5       'połączenie atmegi z LCD
    
    
    
    If Pinb.4 = 1                                               'jeśli na porcie portb.4 pojawi sięnapięcie ( czyli logiczne 1 ) to
     Then
       Do                                                       'pentla DO
       Portb.2 = 1                                              ' na porcie portb.2 zostaje ustawiony bit ( pojawia się napięcie +5V i LCD zostaje podświetlony
       Loop Until Pinb.3 = 1                                    'wyjdz z pętli Do..Loop gdy na porcie Portb.3 pojawi sięnapięcie
      Else                                                      'gdy na porcie Portb.4 nie ma napięcia (portb.4 = 0) to...
       Do
       Portb.2 = 0                                              'na porcie Portb.2 ma być brak napięcia ( portb.2 = 0 )
       Loop Until Pinb.4 = 1                                    'wyskocz z pętli jezeli na porcie Portb.4 pojawi sięnapięcie
    End If
    
    
    
    
    
    End
  • REKLAMA
  • #5 8219211
    comer3
    Poziom 27  
    Poprawiłem Twój kod - działa (zamiast LCD testowałem na diodzie LED) - wciśnięcie przycisku podaje masę na pin procka:
    $regfile = "m8def.dat"
    $crystal = 1000000
    
    
    Config Pinb.4 = Input
    Config Pinb.3 = Input
    Config Portb.2 = Output
    
    
    
    
    Reset Portb.2
    
    
    
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
    
    
    
    If Pinb.4 = 0 Then
       Do
       Portb.2 = 0
       Loop Until Pinb.3 = 0
      Else
       Do
       Portb.2 = 1
       Loop Until Pinb.4 = 0
    End If


    Do wykrywania stanu przycisków użyj lepiej instrukcji Debounce.
  • REKLAMA
  • #6 8219324
    keermiit
    Poziom 10  
    Dziękuje Wam za pomoc ( każdemu kliknąłem Pomógł )

    Mam jeszcze jedno pytanie

    Jak skonfiguruje port PortB jako output to zanczy ze procek bedzie mógł jedynie wysyłać dane przez ten skonfigurowany port (np: na wyświetlacz) ??

    analogicznie jak skofiguruje port PortC jako input to znaczy że piny portu B będą w stanie jedynie odbierać danie np: z kabla podpiętego pod COM

    Dobrze myślę ? jeśli nie to porsze poprawcie mnie
  • Pomocny post
    #7 8219445
    comer3
    Poziom 27  
    W zasadzie tak, ale można też programowo zrealizować port dwukierunkowy (poprzez modyfikację rejestru DDRx), czyli np. po wysłaniu jakiejś danej z linii portu B, te same linie przechodzą w stan odczytu.. :)
  • #8 8219490
    keermiit
    Poziom 10  
    Ok dzięki wielkie comer3 ! :D
REKLAMA