Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Atmega8 ustawienie czasów

bercikmk 22 Sty 2012 19:06 1320 7
  • #1 22 Sty 2012 19:06
    bercikmk
    Poziom 16  

    Witam serdecznie grono forumowiczów. Mam w poniższym kodzie problem z czasami. Mianowicie definicje czasów działają trochę po swojemu,
    podpowiedzcie co jest nie tak bo nie bardzo wiem już gdzie szukać. Zmiana wartości w #define nie bardzo pomaga. Liczyłem stoperem i (czas załączania) działa tak jak chcę ale już (czas załącz wyłącz) powinien być 60 sekund a jest około 6-7
    natomiast (czas zwłoki) około 5s


    Kod: c
    Zaloguj się, aby zobaczyć kod


    OK. Procesor jest zdefiniowany wcześniej, nawet kompilator się tego czepiał ale nie zauważyłem wcześniej. Zmieniłem trochę kod i czasy działają , jednak timery o których piszesz to jeszcze dla mnie chyba za dużo jak na pierwsze spotkanie z AVR. Jest to mój pierwszy programik jednak nie pisany przezemnie, który na dodatek próbuję dostosować do własnych jednorazowych potrzeb. I tu pojawił się kolejny problem. Po załączeniu wszystkich diod np od 1 do 14 procek powinien zareagować na podanie masy na drugie wejście(przycisk lewo) ale niestety nic się nie dzieje tak jakby klawisze były nie aktywne do momentu wygaszenia się diod. Dlaczego?

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 7
  • #2 22 Sty 2012 19:40
    McMonster
    Poziom 32  

    Po pierwsze F_CPU powinno być w ustawieniach projektu (zakładam, że używasz AVR Studio lub Eclipse). Po drugie nie używa się zmiennych jako parametr _delay_ms(), to działa jedynie ze stałymi, bo to nie jest "normalna" funkcja.

    Do odmierzania czasu najlepiej używać timerów.

    0
  • #3 23 Sty 2012 21:14
    bercikmk
    Poziom 16  

    Witam. Fakt z procesorem mój błąd. Jednak tak jak wyżej napisałem pojawił się nowy problem, którego wcześniej nie potrafiłem wychwycić. Wejścia stają się nieaktywne w momencie gdy diody się zapalają i świecą. Dopiero gdy wszystko gaśnie znów można wysterować któreś wejście.

    0
  • #4 23 Sty 2012 23:03
    gaskoin
    Poziom 38  

    McMonster napisał:
    Po drugie nie używa się zmiennych jako parametr _delay_ms(), to działa jedynie ze stałymi, bo to nie jest "normalna" funkcja.


    Ta funkcja jest najnormalniejsza w świecie, jak każda inna. Jej mankament polega na tym, że parametr odpowiedzialny za milisekundy jest typu float, więc jakiejkolwiek liczby byś tam nie wpisał to będzie ona promowana do takiego typu.

    O ile gdy wpiszesz tam stałą wartość, to obliczenia zawarte w tej funkcji będą wykonane na etapie kompilacji. Kompilator pomnoży, podzieli i sobie kod zoptymalizuje do jakiejś prostej postaci.
    Jak wpiszesz tam zmienną, to kompilator nie ma co liczyć i optymalizować, bo nie wie jaka ta zmienna będzie. Dołącza więc bibliotekę do obliczeń zmiennoprzecinkowych, która na AVR trochę waży i dlatego nie powinno się do tej funkcji wkładać zmiennych.

    0
  • #5 24 Sty 2012 09:05
    bercikmk
    Poziom 16  

    Ok z funkcją delay poradziłem sobie wpisując konkretną liczbę czyli stałą tak? i to już działa, ale co z tymi wejściami, dlaczego nie reagują na wyzwolenie tak jak myślałem? Moja logika chyba jest inna niż procka albo nie w tym miejscu gdzie trzeba zmieniam kod.

    0
  • #6 09 Lut 2012 12:07
    xyz541
    Poziom 9  

    witam,ja też mam problem z ustaleniem czasu pracy wentylatora sterowanego termometrem i Pwm. chcę aby wentylator pracował jeszcze ok 30 sek po spełnieniu warunku Pw=0 bez opóźniania całego procesu, po użyciu polecenia Wait 30. teraz wentylator załącza się i wyłącza natychmiast po spełnieniu warunku K=28,lub K=30

    Dodano po 1 [minuty]:

    a to listing'$sim
    ' Program działa

    $regfile = "m8def.DAT"
    $crystal = 8000000 'procesor ustawiony na WEWNĘTRZNY oscylator 8MHz w Fusebitach
    Config Pinb.1 = Output
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Disconnect , Prescale = 8

    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
    Config Lcd = 16 * 1

    Config 1wire = Portb.0
    Dim I1 As Integer , Ss As String * 6
    Dim I2 As Integer
    Dim Dsid1(8) As Byte
    Dim Dsid2(8) As Byte
    Dim E As Byte
    Dim K As Integer
    Dim Pw As Integer
    Deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32
    Cursor Off

    Cls
    Dsid1(1) = 1wsearchfirst()
    Dsid2(1) = 1wsearchnext()
    If Dsid1(8) = Crc8(dsid1(1) , 7) Then
    For E = 1 To 8
    Next
    End If
    If Dsid2(8) = Crc8(dsid2(1) , 7) Then
    For E = 1 To 8
    Next
    End If
    Do
    Cls
    1wreset
    1wwrite &H55 2
    1wverify Dsid1(1)

    1wwrite &HBE
    I1 = 1wread(2)
    1wreset
    1wwrite &H55
    1wverify Dsid2(1)

    1wwrite &HBE
    I2 = 1wread(2)
    1wreset
    1wwrite &HCC
    1wwrite &H44

    I1 = I1 * 10
    I1 = I1 / 16
    If I1 > 0 Then
    Ss = Str(i1)
    Ss = Format(ss , "00.0")
    Locate 1 , 1
    Lcd " " ; Ss ; Chr(0) ;
    Else
    Ss = Str(i1)
    Ss = Format(ss , "00.0")
    Locate 1 , 1
    Lcd " " ; Ss ; Chr(0) ;
    End If

    I2 = I2 * 10
    I2 = I2 / 16
    If I2 > 0 Then
    Ss = Str(i2)
    Ss = Format(ss , "00.0")
    Locate 2 , 1
    Lcd " " ; Ss ; Chr(0) ;
    Else
    Ss = Str(i2)
    Ss = Format(ss , "00.0")
    Locate 2 , 1
    Lcd " " ; Ss ; Chr(0)
    End If
    Wait 1


    If I1 > I2 Then
    K = I1
    Else
    K = I2
    End If
    K = K / 10
    If K => 30 Then
    Pw = 200
    Else
    Pw = 130
    If K =< 28 Then
    Wait 10
    Pw = 0
    End If
    End If
    Pwm1a = Pw

    Loop

    End

    'działa w zasilaczu zgodnie z listingiem

    'wentylator załącza się natychmiast po wykryciu zapisanej temperatury
    'ale i wyłącza sie natychmiast po jej opadnięciu

    Dodano po 1 [minuty]:

    za każdą pomoc będę wdzięczny
    pozdrawiam

    Dodano po 4 [minuty]:

    za każdą pomoc będę wdzięczny
    pozdrawiam

    0
  • #7 12 Lut 2012 11:04
    xyz541
    Poziom 9  

    witam, problem rozwiązany ,ustaliłem parametry histerezy,
    pozdrawiam

    0
  • #8 04 Maj 2012 19:41
    bercikmk
    Poziom 16  

    Zastosowałem się do porad McMonster i wszystko gra. Dziękuję

    0