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

[bascom]wykonywanie poleceń z wykorzystaniem PCF8583

fliper_katrill 12 Wrz 2009 18:24 1410 3
  • #1 7010017
    fliper_katrill
    Poziom 20  
    Witam serdecznie!
    Zwracam się z prośbą do kolegów z większą wiedzą w tym temacie. Problem błahy, ale rozkładam ręce, pewnie zapomniałem o jakiejś oczywistej rzeczy, oto kod:
    
    '$sim
    $crystal = 8000000
    $regfile = "m16def.dat"                                     'deklaracja zmiennej określającej godziny
    
    Config Lcd = 20 * 4
    Config Lcdpin = Pin , Db4 = Portb.5 , Db5 = Portb.4 , Db6 = Portb.3 , Db7 = Portb.2 , E = Portb.6 , Rs = Portb.7
    
    Config Sda = Portc.1
    Config Scl = Portc.0
    Config Pinc.2 = Output
    Config Pinc.4 = Output
    Config Pind.5 = Output
    Dim M As Byte
    Dim S As Byte
    Dim H As Byte
    Dim Dzien As Byte
    Cursor Off
    Cls
    S = Makebcd(50)
    M = Makebcd(49)
    H = Makebcd(23)
    Dzien = Makebcd(1)
    I2cstart
    I2cwbyte 160
    I2cwbyte 0
    I2cwbyte 8
    I2cstop
    I2cstart
    I2cwbyte 160
    I2cwbyte 2
    I2cwbyte S
    I2cwbyte M
    I2cwbyte H
    I2cwbyte Dzien
    
    I2cstop
     Set Portc.2
     Set Portc.4
     Set Portd.5
    
     Reset Portc.2
     Wait 1
     Set Portc.2
    
     Reset Portc.4
     Wait 1
     Set Portc.4
    
     Reset Portd.5
     Wait 1
     Set Portd.5
    
    Do
    
    I2cstart
    I2cwbyte 160
    I2cwbyte 2
    I2cstart
    I2cwbyte 161
    I2crbyte S , Ack
    I2crbyte M , Ack
    I2crbyte H , Ack
    I2crbyte Dzien , Nack
    I2cstop
    
    S = Makedec(s)
    M = Makedec(m)
    H = Makedec(h)
    
    Locate 1 , 1
    Lcd H ; ":" ; M ; ":" ; S
    Locate 2 , 1
    Lcd Dzien
     If M = 50 Then
     Locate 3 , 1
     Lcd "*"
     Reset Pinc.2
     Else
     Locate 3 , 1
     Lcd " "
     Set Pinc.2
     End If
    
    Loop
    


    mój zegar ma wpisane początkowe nastawy godziny minuty i sekundy, a moduł wykonawczy jest podpięty pod Pinc.2 (uC to Atmega16).
    w określonej minucie (docelowo również i godzinie) program ma załączyć moduł wykonawczy ( wybrałem sobie 50 minutę ), ważne jest że sygnałem aktywnym jest RESET pinu, na początku celowo wybrałem 3 piny aby sprawdzić czy moduły je załączają, wszystko działa. Celowo nawet na wyświetlaczu dałem gwiazdkę, gdy załączy się polecenie wykonania ( to działa) ale dochodząc do sedna, nie wiem czemu w określonej minucie moduł się nie włącza. Dodam że JTAG jest wyłączony.
    Proszę o pomoc.

    Przeniosłem z Programowanie Początkujący.
    [Dr.Vee]
  • Pomocny post
    #2 7011417
    hose2
    Poziom 17  
    fliper_katrill napisał:
    ...
    Problem błahy, ale rozkładam ręce, pewnie zapomniałem o jakiejś oczywistej rzeczy
    ...
    Witam

    Tak, problem jest błahy i wynika ze specyficznego sposobu konfigurowania portów w bascom-ie.
    O ile instrukcje:
    Config Pinc.2 = Output
    Config Portc.2 = Output
    dają równoważne wyniki (chociaż poprawny zapis w/g helpa to PINx.y dla konfiguracji pojedynczego bitu portu,
    a PORTx dla konfiguracji CAŁEGO 8-bitowego portu), to zapis danych do PINx.y i PORTx.y odnosi się do RÓŻNYCH rejestrów.
    PINx.y to rejestr portu wejściowego procesora, przeznaczony tylko do odczytu.
    PORTx.y to rejestr portu wyjściowego procesora - można go zapisywać i odczytywać.
    Tą drugą postać powinieneś wykorzystać w tym miejscu:
     Lcd "*"
     Reset Pinc.2
     Else
     Locate 3 , 1
     Lcd " "
     Set Pinc.2
     End If


    Pozdrawiam
  • #3 7015637
    fliper_katrill
    Poziom 20  
    Jak najbardziej śmiga! Dziękuję, zapamiętam na przyszłość.
    A teraz z innej beczki bo nie wiem czemu to nie odpala sie również. Nie przytoczę właściwego kodu bo nie mam zbytnio jak, ale chodzi o to, że mogę ustawić zmienne wykonywania polecenia w zakresie godzin od do i wpisywałem to z reguły:
    
    if godz_od >=godz_PCF8583 and godz_do <= godz_PCF8583 then
    if min_od >=min_PCF8583 and min_do <= min_PCF8583 then
    reset portc.2
    end if
    end if
    

    Przeczuwam, że nie można tego zapisać w jednym warunku bo nie zdąży się wykonać i w zasadzie to czekam na potwierdzenie no i pomysł jak to inaczej zrealizować:)

    Dodano po 4 [minuty]:

    Chcę uzyskać efekt:
    [code]
    if (godzina i minuty znajdują się w zakresie od do) then
    włącz urządzenie
    end if
  • #4 7026606
    hose2
    Poziom 17  
    Witam
    fliper_katrill napisał:
    if godz_od >=godz_PCF8583 and godz_do <= godz_PCF8583 then
    if min_od >=min_PCF8583 and min_do <= min_PCF8583 then
    reset portc.2
    end if
    end if

    Dlaczego ten warunek miałby się nie zdążyć wykonać ? Sprawdzasz go z dokładnością
    do minuty, więc masz całą minutę na jego potwierdzenie i odpowiednie do wyniku
    działanie.
    Inna sprawa, że warunek jest błędny, bo godz_pcf8583 (czas aktualny) muszą być
    większe lub równe od godz_od (minął czas rozpoczęcia), a mniejsze lub równe
    od godz_do (jeszcze nie minął czas zakończenia). Podobnie z minutami.
    Jeżeli masz wątpliwości, czy kompilator poradzi sobie z takimi warunkami to możesz wszystko zapisać w postaci:
    IF (warunek z godziną rozpoczęcia) THEN
      IF (warunek z godziną zakończenia) THEN
        IF (warunek z minutą rozpoczęcia) THEN
          IF (warunek z minutą zakończenia) THEN
            ... (zrób coś wartościowego)
          END IF
        END IF
      END IF
    END IF

    Kompilator traktuje taki zapis jako iloczyn logiczny (AND) wszystkich warunków składowych.
    Nie zapomnij zakończyć każdego pojedynczego warunku instrukcją END IF.

    Pozdrawiam
REKLAMA