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

Atmega32A: Sterowanie diodami LED przyciskami na PB0 i PB1 - problem z kodem

Xervith 15 Kwi 2012 20:02 3205 18
REKLAMA
  • #1 10797933
    Xervith
    Poziom 9  
    Witam
    Ucze się właśnie C i programowania pod Atmega32A i próbuje opanować obsługe O/I.
    Mam mały problemik,a mianowice mam 2 przyciski-jeden podłączony pod PB0 a drugi pod PB1,8 LEDs podłączonych do PA0-PA7.

    Chciałbym,aby program po każdym wciśnięciu przycisku na PB0 zapalał diode,a PB1 gasił jedną.
    Mam takie coś:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Jak uruchamiam uC z tym kodem,to albo nic się nie dzieje,albo zapalają się po koleji, gasną po koleji i koniec.
    Zastanawiam sie jak mogę wyskoczyć z pętli po ustawieniu bitu na PORTA i jeszcze raz sprawdzić czy,któryś z przycisków jest przyciśnięty.Albo jak inaczej zapisac,to by osiągnąć wymagany rezultat.
    Użyłbym tu goto,ale podobno nie jest to dobry sposób.
    Pozdrawiam i prosze o wyrozumiałość.
  • REKLAMA
  • #2 10797998
    Mateusz-me-1990
    Poziom 16  
    Proszę zauważ, że jeśli będziesz sterował diodami w tej drugiej pętli for to ostatecznie na samym końcu zmienna counter bedzię równa 0!. Następne wykonanie tej pierwszej pętli for nic nie da, bo jak wiadomo 0*2=0. Uciec z pętli for można zawsze przy pomocy komendy break :D .
  • #3 10798001
    Krauser
    Poziom 26  
    A jak masz podłączone te przyciski?
  • REKLAMA
  • #4 10798039
    Xervith
    Poziom 9  
    Racja,zamiast 0 powinno byc 1,to wyjasnia czemu petle dzialaja tylko raz.
    Probowalem ustawic "break",ale cos to nie dzialalo,po ustawieniu bitu na porta,
    petla za kazdym razem wracala na poczatek i ustawiala nastepny bit(sprawdzalem to ponad godzine na AVR symulatorze)
    Przyciski podlaczone mam do +5v,gdzie napiecie na PB0 i PB1 jest rowne 0V.
  • #5 10798055
    Mateusz-me-1990
    Poziom 16  
    Skoro wyskoczysz z pętli to wartość counter pozostanie w takim stanie w jakim była wcześniej, a z samej racji iż program wykonuje się bardzo szybko możliwe jest, że zanim zdążysz puścić przycisk program wskoczy ponownie.
  • #6 10798282
    raffiki
    Poziom 14  
    ja bym to zrobił jakoś tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    o ile dobrze zrozumiałem jak ma działać
  • REKLAMA
  • #8 10799731
    Xervith
    Poziom 9  
    Hey...
    Kozystam z AVR Studio i eXtreme Burner.
    Wlasnie zauwazylem,ze czasami mam problemy z timingem i nie wszystko chodzi tak jak ma,jezeli uzywam opoznienia _delay_ms().

    @raffiki twoj kod,jest calkiem calkiem,z tym,ze jak go wyslalem do uC,to diody
    zapalaly sie same(tam i spowrotem),albo tylko jedna miga,a po przycisnieciu przycisku na PB0 dioda przestaje migac i tylko swieci.Efekt jest calkowicie przypadkowy.
    Zastanawiam sie czy z uC jest wszystko wporzadku,niby tak.Wszystkie O/I sprawdzalem, pierwsze ustawilem wszystkie wejscia na 1 potem na 0 i to samo z wyjsciami. wszystko wygladalo OK...
    Posprawdzam jeszcze raz wszystko .

    Pozdrawiam i Dziekuje Za Wyrozumialosc
  • #9 10799746
    raffiki
    Poziom 14  
    Polecam zrobić odwrotnie, port podciągnąć do VCC i zwierać z GND. Jak jest odwrotnie lubi łapać.. wszystko z otoczenia.
  • #10 10799756
    gaskoin
    Poziom 38  
    Xervith napisał:
    Wlasnie zauwazylem,ze czasami mam problemy z timingem i nie wszystko chodzi tak jak ma,jezeli uzywam opoznienia _delay_ms().


    Jeśli same timingi są złe tzn, że nie włączyłeś optymalizacji bo _delay_ms działa tylko i wyłącznie dobrze wtedy, kiedy jest ona włączona.
  • #11 10799785
    Xervith
    Poziom 9  
    Zrobilem takie cos:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Ustawiona optymalizacja O2.Jak sprawdzam w debugerze,to gdy dojdzie mi do

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    otwiera sie delay.h zaznaczony na lini
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    i nic mi nie dziala...



    Wczesniej mi funkcje z delay.h smigaly bez problemow,a mialem zdefiniowane F_CPU w delay.h,dokladnie tak jak teraz:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    @stanleyts- jak wroce z pracy to sproboje twojego sposobu.

    Pozdrawiam
  • #12 10799852
    stanleysts
    Poziom 27  
    tamta funkcja mi sie nie podoba sproboj tej:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    jesli to ma dzialac tak ze nacsniecie jednego rpzycisku powoduje zapalenie diodki a tego drugiego wylaczenie jej, przy czym jesli nacisniesz przycisk kilka razy to kolejne ci sie zapala (albo zgasza) to tam przeciez nie trzeba delay zadnych
  • #13 10799975
    Xervith
    Poziom 9  
    Cytat:

    jesli to ma dzialac tak ze nacsniecie jednego rpzycisku powoduje zapalenie diodki a tego drugiego wylaczenie jej, przy czym jesli nacisniesz przycisk kilka razy to kolejne ci sie zapala (albo zgasza) to tam przeciez nie trzeba delay zadnych


    No tak,ale chodzi tutaj o to,zeby troche to kontrolowac,jak nie uzyjesz delay,to za jednym przycisnieciem moze ci sie naprzyklad 5 diod zapalic,bo program bedzie wykonywany bardzo szybko.A jesli dodasz _delay_ms(xx),to dajesz programowi czasu troche.I tak jak przycisniesz,to po jednej sie bedzie zapalac/gasic.

    Tylko nie wiem czemu mi funkcje z delay.h nie dzialaja,jak F_CPU mam zdefiniowane.

    Pozdro
  • REKLAMA
  • #14 10800001
    mirekk36
    Poziom 42  
    Xervith napisał:

    Tylko nie wiem czemu mi funkcje z delay.h nie dzialaja,jak F_CPU mam zdefiniowane.


    Bo męczysz się z tym kocim AVR Studio - więc będziesz miał jeszcze sporo takich kwiatków. Gdybyś się przesiadł na Eclipse to z marszu miałbyś o wiele mniej problemów - poczytaj może to: Link

    Dodano po 52 [sekundy]:

    Tym bardziej, że już miałeś wcześniej coś takiego wśród postów, ale pewnie nie zwróciłeś na to uwagi.

    blue_17 napisał:
    Xervith napisał:
    #define F_CPU 1000000UL


    Tego tutaj się nie pisze to ustawia się w opcjach projektu niezależnie z jakiego środowiska kożystasz

    Możesz mieć później kłopoty
  • #15 10800010
    stanleysts
    Poziom 27  
    @Xerwith racja jesli to masz akurat na przyciskach to jakis delay musi byc.
  • #16 10800012
    gaskoin
    Poziom 38  
    Nie musi, może być timer bez żadnych opóźnień
  • #17 10800136
    stanleysts
    Poziom 27  
    wiadomo ze chodzi o cos co odczeka jakis czas, czy to delay czy timer to sprawa drugorzedna
  • #18 10800179
    dondu
    Moderator na urlopie...
    Xervith napisał:
    No tak,ale chodzi tutaj o to,zeby troche to kontrolowac, jak nie uzyjesz delay,to za jednym przycisnieciem moze ci sie naprzyklad 5 diod zapalic,bo program bedzie wykonywany bardzo szybko.A jesli dodasz _delay_ms(xx),to dajesz programowi czasu troche.I tak jak przycisniesz,to po jednej sie bedzie zapalac/gasic.

    Tutaj masz kilka sposobów deboucingu: Drgania styków


    Xervith napisał:
    Tylko nie wiem czemu mi funkcje z delay.h nie dzialaja,jak F_CPU mam zdefiniowane.

    Może to pomoże: F_CPU gdzie definiować w AVR Studio?
    A może F_CPU definiujesz poprawnie, ale fusebity masz ustawione niewłaściwie?
  • #19 10802995
    Xervith
    Poziom 9  
    Na poczatku chcialem wszystkim podziekowac za posty i cierpliwosc.
    Dla was to moze nic takiego,ale ja dzieki wam duuuzo sie nauczylem.
    Kazde zagadnienie sprawdzilem i doczytalem info na temat-drgania stykow,definiowania F_CPU,itp.itd...

    @mirekk36 Co do eclipse-juz wczesniej sie nim bawilem piszac w php i w javie.
    Poszedlem za twoja wskazowka,przesiadlem sie na Eclipse i wszystkie problemy zniknely.
    Wszystko teraz chula z eclipse&avrdude nawet jednym przycisnieciem,program leci do uC,a nie tak jak wczesniej. xD
    Co do przykladow,ktore podaliscie,to po malych modyfikacjach wszystkie chulaja tak jak chcialem.

    Jeszcze raz Wszystkim bardzo dziekuje za pomoc!

    Pozdrawiam!
REKLAMA