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

[atmega32][C]dodawanie amiennych i warunek if

margas4542 15 Paź 2010 18:27 1011 8
REKLAMA
  • #1 8623428
    margas4542
    Poziom 16  
    Witam.Zliczam impulsy z jednego klawisza rozbijając je na dwie zmienne dziesiętne które po osiągnięciu zadanej liczby mają się wyzerować z czy mam kłopot bo zerowanie nie następuje...nie wiem czy to błąd w założeni czy po prost źle zdefiniowana funkcja...
    
    if(!(PIND & _BV(4)))
    {
     _delay_ms(250);
     ++set_h;
     if (set_h==10)
     {
      set_h=0;
      ++set_hh;
      if((set_hh==6)&&(set_h==8))//jeżeli 68 to wyzeruj set_hh i set_h
      {
       set_h=0;
       set_hh=0;
      }
    }
  • REKLAMA
  • #2 8623554
    gaskoin
    Poziom 38  
    popatrz na kod po kolei


    zwiększasz h dopóki nie osiągnie liczby = 10,

    wtedy ją zerujesz a zmienną hh zwiększasz o jeden

    if((set_hh==6)&&(set_h==8))//jeżeli 68 to wyzeruj set_hh i set_h
      {
       set_h=0;
       set_hh=0;
      } 


    ten warunek nie nie jest spełniony nigdy, bo jest sprawdzany tylko raz - wtedy gdy set_h jest równe 0 (a chcesz żeby było równe 8)
  • REKLAMA
  • #3 8623559
    mirekk36
    Poziom 42  
    twoje set_h się przecież zeruje (ciekawe jak ty to sprawdzasz że niby się nie zeruje), natomiast twoje set_hh nigdy nie ma prawa się wyzerować w takim warunku.... toż popatrz sam chwilę chłodnym okiem na to co napisałeś w tym najbardziej zagnieżdżonym warunku.
  • #4 8623642
    margas4542
    Poziom 16  
    Czy się zerują po if obydwie zmienne to można zobaczyć na LCD oczywiście po konwersji dlatego wiem że nie zeruje tylko leci dalej...siedzę nad programem sterownika zarządzającego zasilaniem z solara i ładowarki monitorowaniem stanu aku ,zegarem z dwukanałowym timerem włącz/wyłącz i automatycznym lub ręcznym sterowaniem czterema obwodami od dwu miesięcy i naprawdę już mi się mózg lasuje...jeżeli ktoś wie jak napisać taką procedurę to bardzo proszę konkrety...poza tym muszę jeszcze dojść jak wyciągnąć z PCF8583 dzień i miesiąc...
  • REKLAMA
  • #5 8624001
    mirekk36
    Poziom 42  
    Konkrety? tzn hmm co gotowca? - jeśli ci takie wyraźne i jasne podpowiedzi nic ci nie mówią (a przecież gaskoin wyłożył ci to łopatologicznie)... to daj sobie lepiej spokój z budową sterownika solara, ładowarki, aku, zegara, timera itp bo się zlasujesz na amen.
  • #6 8624493
    gaskoin
    Poziom 38  
    set_h=0;
      ++set_hh;
      if((set_hh==6)&&(set_h==8))//jeżeli 68 to wyzeruj set_hh i set_h 


    no weź się chłopie przyjrzyj. Zerujesz set_h a potem sprawdzasz czy nie jest = 8, kiedy się te 8 tam miało nabić ? :)

    A do pcf8583 jest gotowiec - w datasheecie. Trzeba go tylko dokładnie przeczytać i czasem niektóre rzeczy kilka razy. A nie przejrzeć raz i mówić "nie da się". Ja siedziałem dzisiaj cały dzień nad konwersją napięć przetwornika DAC i udało się :D
  • REKLAMA
  • #7 8626106
    margas4542
    Poziom 16  
    A dlaczego..fakt że borykam się z logiką ale program w większości jest już uruchomiony mam pomiary...dzięki twojemu rozwianiu i tak jak chciałem...chodzi zegar który jest podstawa dla dwu kanałowego timera załącz/wyłącz o określonej godzinie...mam sterowanie auto/manual czterema kanałami obwodów 230V...więc to co zostało do zrobienia to tylko uzyskać odczyt dnia i miesiąca...manuale są i owszem ale po angielsku i choć znalazłem polskie tłumaczenie to jest strasznie ubogie w rezultacie czego wiem że muszę odczytać jeszcze jeden bit ale nie wiem jak...
    co do zamieszczonego kodu to switchem nabijam impulsy do określonej liczby ale jest ona rozbita na dwie zmienne dziesiątki i jednostki czyli jak doliczy do 10 to kasuje się i liczy od nowa dodając 1 do drugiej zmiennej i teraz jak dziesiątki dojdą do 6 a jednostki do 8 to obydwie zmienne mają się wyzerować...
  • Pomocny post
    #8 8626416
    gaskoin
    Poziom 38  
    a po co Ci dwie zmienne ?

    if(!(PIND & _BV(4)))
    {
     _delay_ms(250);
     if(++set_h >= 10){
            set_hh++;
            set_h = 0;
    }
     }
    
      if((set_hh>=6)&&(set_h>=8))//jeżeli 68 to wyzeruj set_hh i set_h
      {
       set_h=0;
       set_hh=0;
      }
    


    tak to raczej winno wyglądać
  • #9 8626568
    margas4542
    Poziom 16  
    Po stokroć dziękuje..teraz wiem dlaczego to mi nie chciało chodzić..ale mówią że najprostsze rzeczy najtrudniej wymyślić i to prawda....impulsy będą przychodzić z dwu transoptorów szczelinowych i po przetworzeniu przez program ustawiać serwa pozycjonując moją antenę nadawczo/odbiorczą na pasmo 2m....to na razie pomysł i program jest teoretyczny ale jak skończę sterownik to za to się zabiorę i będę miał na czymś poćwiczyć programowanie...jeszcze raz dziękuje za pomoc.
REKLAMA