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

AT90S2313: Programowanie przycisku z debounce i wyświetlaniem na LCD

Sław1980 22 Sty 2008 20:05 2508 17
REKLAMA
  • #1 4723544
    Sław1980
    Poziom 17  
    Posty: 370
    Pomógł: 6
    Ocena: 128
    Wiatm mam mały problem.
    Może krótko. Chcę napisać program na at90s2313 który wyświetli mi jakis napis na lcd przy naciśniętym przycisku (pind.0 = 0) i wyświetli inny napis na lcd kiedy puszczę ten sam przycisk (pin.0 = 1) oczywiscie chcialbym wyelimionować drgania może za pomocą funkcji DEBOUNCE... ponieważ później w układzie chcę zastosować przekaźniki. chciałbym wykorzystać w ten sposób 4 wejścia procka np - PD.0, PD.1 PD.2, PD.3 Jak to zrobic? Próbowałem wielu sposobów i albo nie działało jak trzeba alebo napisy mrógały bardzo szybko na wyświetlaczu.
    Za każdą pomoc dziękuję
  • REKLAMA
  • #2 4723888
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    Niektóre LCD w trakcie zapisu mają zakłócenia w wyświetlaniu. Żeby teki coś poprawnie działało musisz po pojawieniu się odpowiedniego zbocza (oczywiście tę kontrolę zbocza robisz programowo) raz tylko wykonujesz transmisją do LCD, wtedy wyświetlacz nie będzie ci mrugał.
  • #3 4724153
    Sław1980
    Poziom 17  
    Posty: 370
    Pomógł: 6
    Ocena: 128
    a może ktoś pomoże przerobić ten kawałek
    Portd =&B0000011
    Do
    If Pind.0 = 0 Then
    Cls
    Lcd "Pierwszy napis"
    Waitms 300
    End If
    If Pind.0 = 1 Then
    Cls
    End If
    Loop
    End

    taki sobie napisałem i działa (po naciśnieciu przycisku i przytrzymaniu wyświetlany jest napis a po zwolnieniu czyszczony jest ekran) ale chciałbym zamiast czyszczeenia ekranu wstawić "drugi napis" niestety nie działa wtedy, może ma to związek z wait...
  • #5 4724299
    Marczeli_P
    Poziom 20  
    Posty: 290
    Pomógł: 35
    Ocena: 12
    Niedziala bo nic nie kazesz wyswietlic sprobuj tego.

    cls
    Do
    If Pind.0 = 0 Then
    Cls
    Lcd "Pierwszy napis"
    Waitms 300
    End If
    If Pind.0 = 1 Then
    Cls
    Lcd "Drugi napis"
    Waitms 300
    End If
    Loop
    End


    mozna to bardziej zgrabnie napisac przy pomocy if else, druga sprawa ze napisany przez ciebie kod nie eliminuje drgan stykow. Uzyj lepiej wbudowanej funkcji Debounce.
  • REKLAMA
  • #6 4724357
    Sław1980
    Poziom 17  
    Posty: 370
    Pomógł: 6
    Ocena: 128
    Ta procedura :

    Do
    If Pind.0 = 0 Then
    Cls
    Lcd "Pierwszy napis"
    Else
    Cls
    LCD "Drugi napis"
    End If

    Loop
    End

    działa (napis 1 pojawia aię przy nacisnieciu a napis 2 po zwolnieniu) ale napisy nie wyświetlają się do końca
    Po wstawieniu wait 200 wszystko działa ok

    Portd =&B0000011
    Do
    If Pind.0 = 0 Then
    Cls
    Lcd "Pierwszy napis"
    Waitms 200
    Else
    Cls
    Lcd "Drugi napis"
    Waitms 200
    End If

    Loop
    End

    tylko pytanie czemu i jak to bedzie wpływać na inne napisy?
  • #7 4724451
    Charly
    Poziom 19  
    Posty: 241
    Pomógł: 27
    Ocena: 19
    Nie wiedziałem że trzeba Ci aż tak dokładnie napisać:
    
    Portd =&B0000011
    Cursor Off Noblink
    Do 
    If Pind.0 = 0 Then 
    Cls 
    Lcd "Pierwszy napis" 
    Wait 1
    Else 
    Cls 
    Lcd "Drugi napis" 
    Wait 1
    End If 
    
    Loop 
    End

    Działa bo musi.
  • #8 4724806
    Marczeli_P
    Poziom 20  
    Posty: 290
    Pomógł: 35
    Ocena: 12
    Twój program też jest jak najbardziej poprawny ale po puszczeniu przycisku to następne "if" kasuje ci to co napisałeś dlatego też nie zabardzo możesz zobaczyć co napisał wcześniej. Nie jest to wina opóźnienia,ono utrzymuje tylko przez chwile twój napis na LCD a następnie przechodzi do następnego if które go kasuje (instrukcja "cls").
  • REKLAMA
  • #10 4725744
    Charly
    Poziom 19  
    Posty: 241
    Pomógł: 27
    Ocena: 19
    Chłopy nie ma już co kombinować, można Locate, można Home itd..., itp... to co ja mu zapodałem działa wyśmienicie, a resztę gość musi sobie w helpie poczytać i samemu pokombinować żeby widział jak które instrukcje i na co wpływają.
  • REKLAMA
  • #12 4990134
    Sław1980
    Poziom 17  
    Posty: 370
    Pomógł: 6
    Ocena: 128
    Witam ponownie mam pytanie trochę z innej beczki czy ktoś nie wie czasem jak ustawić symulator AVR żeby działał mniej więcej z prędkością bliską procesora? Bo w tym momencie symulator działa bardzo powoli np zrealizowanie funkcji "waitms 100" zajmuje mu około 2 sekund....
  • #13 4990630
    Bęben
    Poziom 16  
    Posty: 180
    Pomógł: 12
    Ocena: 13
    W symulatorze Bascom AVR chyba takiej opcji nie ma, ja bynajmniej sie jej nie doszukałem. W Bascom 8051 natomiast jest.
    Problem ten rozwiązałem po prostu nie włączając Play, lecz uruchamiając instrukcje po instrukcji (step).
  • #15 4991786
    Balu
    Poziom 38  
    Posty: 4397
    Pomógł: 323
    Ocena: 48
    Dodawało się dyrektywę dla kompilatora.

    Cytat:

    Syntax

    $SIM





    Remarks

    Simulation of a WAIT statement can take a long time especially when memory view windows are opened.

    The $SIM compiler directive instructs the compiler to not generate code for WAITMS and WAIT. This will of course allows faster simulation.



    When your application is ready you must remark the $SIM directive or otherwise the WAIT and WAITMS statements will not work as expected.

    When you forget to remove the $SIM option and you try to program a chip you will receive a warning that $SIM was used.
  • #17 4992818
    Balu
    Poziom 38  
    Posty: 4397
    Pomógł: 323
    Ocena: 48
    Paaanie w czasie rzeczywistym to tylko w erze;)
    Ale serio, to w tak szybkim symulatorze nie byłbyś w stanie zaobserwować co się dzieje wewnątrz procesora.

Podsumowanie tematu

✨ Dyskusja dotyczy programowania mikrokontrolera AT90S2313 do sterowania wyświetlaczem LCD w celu wyświetlania różnych napisów w zależności od stanu przycisku podłączonego do pinu PD.0. Problemem były drgania styków oraz migotanie napisów na LCD podczas zmiany stanu przycisku. Rozwiązaniem okazało się programowe wykrywanie zbocza sygnału i wywoływanie transmisji do LCD tylko raz na zmianę stanu, co eliminuje migotanie. Wskazano, że stosowanie funkcji debounce jest konieczne do eliminacji drgań styków. Przykładowe fragmenty kodu pokazują użycie instrukcji warunkowych if-else, funkcji Cls do czyszczenia ekranu oraz Waitms do stabilizacji wyświetlania. Zwrócono uwagę, że zbyt szybkie przełączanie stanów powoduje szybkie kasowanie i ponowne wyświetlanie napisów, co skutkuje migotaniem. W dyskusji poruszono także temat symulatora Bascom AVR, który działa wolniej niż rzeczywista prędkość procesora, co utrudnia testowanie opóźnień typu waitms. Sugerowano użycie trybu krokowego (step) zamiast ciągłego odtwarzania symulacji.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA