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

[Bascom] Wartości granieczne w pętli

mic11 01 Maj 2010 19:57 1537 5
REKLAMA
  • #1 8024071
    mic11
    Poziom 10  
    Witam

    Tworzę teraz taki mały programik do obsługi lampki z kilkoma diodami led, w której jasność świecenia regulowana jest pwm'em przez tranzystor buz11. W kodzie jest odniesienie do lcd bo na razie wszystko robię na płytce stykowej i chcę obserwować wartość pwm na wyświetlaczu.
    
    'sterowanie pwm
    
    $regfile = "m8def.dat"                                      'zadeklarowanie użytego procesora
    $crystal = 8000000                                          'zadeklarowanie szybkości wewnętrznego kwarcu
    
    Config Lcdmode = Port
    Config Lcdbus = 4
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , Rs = Portd.5 , E = Portd.6
    
    Config Portc = &B000000
            Portc = &B110000
    
    Config Portb.1 = 1
    Config Timer1 = Pwm , Pwm = 8 , Prescale = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Disconnect
    
    Dim I As Byte
    
    Pwm1a = 2
    
    Cls
    Cursor Off
    Lcd "rejestr PWM ="
    
    
    For I = 2 To 250                                            'załaczenie diod na 100%
    Incr Pwm1a
    Waitms 3
    Next
    
    
    For I = 250 To 20 Step -1                                   'zjazd pwm do 20
    Decr Pwm1a
    Waitms 3
    Next
    
    Do
    
        If Pinc.5 = 1 Then Incr Pwm1a 
       Waitms 3
    
       If Pinc.4 = 1 Then Decr Pwm1a
       Waitms 3
    
    
    Locate 2 , 1
    Lcd Pwm1a
    
    Loop
    
    End
    

    No i chodzi o główną pętlę programu. A mianowicie o to że przyciski "+" i "-" zwiększają i zmniejszają wartość pwm'a ale jak np. wartość wynosi 255 i jeszcze raz nacisnę "+" to pwm = 0 i odwrtonie jak pwm = 0 a nacisnę "-" to pwm=255.
    Chodzi mi o to żeby przy krańcowych wartościach (czyli 0 i 255) po naciśnięciu "+" lub "-" nic się nie działo albo żeby na którymś wolnym porcie procka pojawił się np. stan wysoki.

    Proszę o pomoc w stworzeniu właściwej do w/w założeń pętli głównej programu bo przeczytałem w książce Marcina Wiązani wszystko o pętlach ale nadal nie potrafię zbudować takiej, w której w razie wystąpienia warunku (wartość graniczna) należy "nic nie robić" lub wykonać jakąś instrukcję.
  • REKLAMA
  • Pomocny post
    #2 8024173
    tadzik85
    Poziom 38  
    Zwiększaj tylko jeśli zmienna <255 z zmniejszaj jeśli >0
  • REKLAMA
  • Pomocny post
    #3 8024310
    arktik1
    Poziom 27  
    Na przykład tak:
    
    If Pinc.5 = 1 And Pwm1a < 255 Then Incr Pwm1a
       Waitms 3
    
       If Pinc.4 = 1 And Pwm1a > 0 Then Decr Pwm1a
       Waitms 3
    
  • REKLAMA
  • #4 8024496
    mic11
    Poziom 10  
    arktik1 napisał:
    Na przykład tak:
    
    If Pinc.5 = 1 And Pwm1a < 255 Then Incr Pwm1a
       Waitms 3
    
       If Pinc.4 = 1 And Pwm1a > 0 Then Decr Pwm1a
       Waitms 3
    

    wszystko ok, działa tak jak należy, dzięki za podpowiedź.
  • REKLAMA
  • #5 8028429
    mic11
    Poziom 10  
    jeszcze jeden mały problemik (próbuję to już zrobić od 6 godzin):
    mianowicie chodzi o zapis wartości pwm do epromu co jakiś czas (nie za często - tylko kilka chwil po nastawieniu nowej wartości przyciskami) żeby można ją było odtworzyć po włączeniu zasilania. przerobiłem to już w każdym możliwym wariancie ale nie potrafię wmontować tego w pętlę. najlepsze co udało mi się uzyskać to to:
    'sterowanie pwm
    
    $regfile = "m8def.dat"                                      'zadeklarowanie użytego procesora
    $crystal = 8000000                                          'zadeklarowanie szybkości wewnętrznego kwarcu
    
    Config Lcdmode = Port
    Config Lcdbus = 4
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , Rs = Portd.5 , E = Portd.6
    
    Config Portc = &B000000
            Portc = &B110000
    
    Config Portb.1 = 1
    Config Timer1 = Pwm , Pwm = 8 , Prescale = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Disconnect
    Config Timer0 = Timer , Prescale = 256
    
    Config Pinb.0 = Output
    
    Dim Wartosc As Byte
    Dim I As Byte
    Dim Licz_8ms As Word
    
    Declare Sub Pamiec
    Declare Sub Buzzer
    
    S1 Alias Pinc.5
    S2 Alias Pinc.4
    
    On Timer0 Pamiec
    Enable Interrupts
    Enable Timer0
    Load Timer0 = 250
    
    Pwm1a = 2
    
    For I = 1 To 2
    Call Buzzer
    Waitms 100
    Next
    
    Cls
    Cursor Off
    Lcd "rejestr PWM ="
    
    Readeeprom Wartosc , 1
    
    For Pwm1a = 1 To 250                                        'załaczenie diod na 100%
    Incr Pwm1a
    Waitms 3
    Next
    
    
    For Pwm1a = 250 To Wartosc Step -1                          'zajazd pwm do 20
    Decr Pwm1a
    Waitms 3
    Next
    
    
       Do                                                       'początek głównej pętli programu
       If Wartosc = Pwm1a Then
    
       If S1 = 1 And Pwm1a <= 250 Then Incr Pwm1a
       Waitms 3
    
       If S2 = 1 And Pwm1a >= 2 Then Decr Pwm1a
       Waitms 3
    
       Elseif Pwm1a <> Wartosc Then
       Pamiec
       End If
    
    
       Locate 2 , 1
       Lcd Pwm1a
    
       Loop                                                     'koniec głównej pętli programu
    
    End
    
    
    Pamiec:
    Load Timer0 = 250                                           'tu
    Incr Licz_8ms                                               ' jest
      If Licz_8ms = 625 Then                                    'odlicznie 5 sekund
      Licz_8ms = 0                                              'zerowanie licznika
      Wartosc = Pwm1a                                           'przypisanie wartości Wartosc liczby PWM1A
      Writeeeprom Wartosc , 1                                   'zapisanie wartości Wartosc do epromu pod adres 1
      Call Buzzer                                               'buzer
      End If
    Return
    
    Sub Buzzer
    Sound Portb.0 , 1000 , 50
    End Sub
    

    ale coś jest nie tak mimo że wartość Wartosc = PWM1A to niepotrzebny zapis następuje i tak co 5 sekund. chodzi o to że nie wiem jak niezależnie od działania głównej pętli zliczać jakiś czas - ponieważ nie chcę zapisywać wartości do epromu co pojedyncze naciśnięcie s1 lub s2 tylko dać sobie trochę czasu na regulację jasności przed automatycznym zapisem wartości pwm do eprom'u.
    a może mam całkowicie błędną koncepcję i powinno się np dać oddzielny przycisk do zapamiętania danej nastawy a nie robić automat - którego być może w takiej pętli w ogóle nie da się zrobić.
    podpowie ktoś coś?
  • #6 8028492
    kots
    Poziom 12  
    Najprościej:
    Wprowadź zmienną liczącą przebiegi pętli,
    zeruj ją gdy zostanie naciśnięty klawisz,
    zapisuj do EEPROMu gdy zmienna osiągnie odpowiednią wartość

    KotS
REKLAMA