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 i wielowątkowość? Jak napisać procedurę?

ser1983 18 Cze 2006 16:06 2590 9
REKLAMA
  • #1 2739987
    ser1983
    Poziom 12  
    Posty: 116
    Pomógł: 3
    Ocena: 7
    Na procesorze AT89S52 pisze program sterujący dwoma wiatrakami poprzez tranzystory w zależności od temperatury. Czyli jak najmniejsze obroty, temperatura w górnej dopuszczalnej granicy, głośność jak najniższa. Dopiero raczkuje w mikrokontrolerach i bascomie. Napisalem taka oto procedurke:
    
       Dim W As Byte                                              'wypelnienie w %
       W = 80
       Dim F As Byte                                              'czestotliwosc w Hz
       F = 10
       Dim T As Single                                            'okres w s
       Dim T1 As Single                                           'pomocnicza
       Dim I As Single
    
    Pwm:
       Do
       I = 0
       T = 1 / F
       T1 = W / 100                                               'T=(1/f)*(w/100)
       T = T * T1
       P1.0 = 1
       While T > I                                                'sterowanie czasem impulsu
          Waitms 1
          I = I + 0.001                                           'i=i+1ms
          Wend
       I = 0
       T = 1 / F
       T1 = 100 - W                                               'T=(1/f)*((100-w)/100)
       T1 = T1 / 100
       T = T * T1
       P1.0 = 0
       While T > I                                                'sterowanie czasem braku impulsu
          Waitms 1
          I = I + 0.001
          Wend
       Loop 


    Ogolnie rzecz biorąc to działa, ale jest to rozwaizanie na jeden wentylator. Jak zrobic aby jednoczesnie PWM dzialal mi na dwa kanaly niezaleznie, tj. na jednym kanale jedno wypelnienie, na drugim inne wypelnienie. Jest jakas obsluga wielowątkowości w bascomie? A moze jakies inne rozwiazania? Z gory dzieki!
  • REKLAMA
  • REKLAMA
  • #3 2740606
    McRancor
    VIP Zasłużony dla elektroda
    Posty: 5326
    Pomógł: 479
    Ocena: 123
    wielowątkowość w bascomie? Pamiętaj że komputery PC jeszcze pare lat temu ledwo radziły sobie z wielowątkowością, a to tylko 8bitowe mikrokontrolery. Musisz sprytnie napisać program zastępując kilka wątków jednym, bardziej rozbudowanym.
  • #4 2741094
    ser1983
    Poziom 12  
    Posty: 116
    Pomógł: 3
    Ocena: 7
    udalo mi sie rozwiazac problem nastepujaco:
    
    'Zmienne do PWM
       Dim W As Byte                                              'wypelnienie procentowe wyj.1
       W = 50
       Dim W2 As Byte                                             'wypelnienie procentowe wyj.2
       W2 = 90
       Dim F As Byte                                              'czestotliwosc w Hz
       F = 10
       Dim T As Single                                            'pomocnicza
       Dim T1 As Single                                           'okres wyjscia nr 1
       Dim T2 As Single                                           'okres wyjscia nr 2
       Dim I As Single
    'Koniec zmiennych do PWM
    Cls
    Pwm:
       Do
       I = 0
       T1 = 1 / F
       T = W / 100                                                'T=(1/f)*(w/100)
       T1 = T1 * T                                                'czas trwanai impulsu wyj1
       Lcd "T1=" ; T1
       Lowerline
       T2 = 1 / F
       T = W2 / 100                                               'T=(1/f)*(w/100)
       T2 = T2 * T                                                'czas trwanai impulsu wyj2
       Lcd "T2=" ; T2
       P1.0 = 1
       P1.1 = 1
       '_________________________________________________________
        'Gdy wypelnienie wyj. 1 jest wieksze od wypelnienia wyj 2
       If W > =W2 Then
          While T2 > I                                            'sterowanie czasem impulsu
             Waitms 1
             I = I + 0.001                                        'i=i+1ms
             Wend
          P1.1 = 0
          While T1 > I
             Waitms 1
             I = I + 0.001                                        'i=i+1ms
             Wend
          T2 = 1 / F
          P1.0 = 0
          While T2 > I
              Waitms 1
              I = I + 0.001                                        'i=i+1ms
              Wend
        End If
    
        '_________________________________________________________
        'Gdy wypelnienie wyj. 2 jest wieksze od wypelnienia wyj 1
        If W < W2 Then
          While T1 > I                                            'sterowanie czasem impulsu
             Waitms 1
             I = I + 0.001                                        'i=i+1ms
             Wend
          P1.0 = 0
          While T2 > I
             Waitms 1
             I = I + 0.001                                        'i=i+1ms
             Wend
          T1 = 1 / F
          P1.1 = 0
          While T1 > I
              Waitms 1
              I = I + 0.001                                        'i=i+1ms
              Wend
        End If
    Loop
    


    Na symulatorze dziala zadowalajaco jak na moje wymagania. Na testy w polu przyjdzie czas :)
  • #5 2741725
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    ser1983 napisał:

    Na symulatorze dziala zadowalajaco jak na moje wymagania. Na testy w polu przyjdzie czas :)

    A sprawdziłeś jak się ma procentowe wypełnienie , do założonego - nijak :(
    Radzę zaprząc do PWM-a timer(y) , a ten kod ... wyrzucić do śmietnika :)
    Pomyśl co się stanie , jak dopiszesz kod odpowiedzialny za przetwarzanie danych o temperaturze :!:

    Piotrek
  • REKLAMA
  • #6 2742059
    ser1983
    Poziom 12  
    Posty: 116
    Pomógł: 3
    Ocena: 7
    No wlasnie to mnie martwi ze troche rośnie rozmiar programu. A sesja w trakcie- czasu malo na nauke obslugi timerow. Tak wiec nastepne pytanie laika: na jakiej zasadzie to ma dzialac na timerach? Ze timer zlicza az sie przepelni co trwa np. 1ms a gdy to nastąpi to wysyla przerwanie i w obsludze przerwan dac procedurke sprawdzajaca ile razy licznik sie przepelnil i na podstawie tych danych generowac wysoki lub niski sygnal? Czy moze jakis inny algorytm?
  • Pomocny post
    #7 2742114
    JollyRoger
    Poziom 21  
    Posty: 538
    Pomógł: 21
    Ocena: 30
    Radziłbym Ci zobic tak:
    Cały PWM zrób na przerwaniu od jakiegoś Timera; nie uzywaj zmiennych typu single, jeżeli częstotliwośc przerwań bedzie odpowiednio szybka wystarczy zmienna typu byte lub word.
    Obsługe LCD czy przycisków i innych obliczeń zostaw w pętli główne

    Przykładowy PWM dla portb.3:
    Gdzie a to jakas amienna a do b podajesz wartosc PWM (0-255)...
    
    dim a as byte
    dim b as byte
    
    Przerwanie' przerwanie z timera
    incr a
    if a > b then
    set portb.3
    else 
    reset portb.3
    end if
    return
    
  • REKLAMA
  • #8 2744346
    ser1983
    Poziom 12  
    Posty: 116
    Pomógł: 3
    Ocena: 7
    Dzieki JollyRoger!

    Zrobilem to w ten sposob:
    
    Dim A As Byte                                                 'Zmienna pomocnicza do wypelnienia
    Dim Wyp1 As Byte                                              'Wypelnienie kanalu 1 0..100%
    Dim Wyp2 As Byte                                              'Wypelnienie kanalu 2 0..100%
    Config Timer0 = Timer , Gate = Internal , Mode = 2            'zdefiniowanie timera jako 8-bitowego timera z przepelnieniem
    
    On Timer0 Pwm
    Load Timer0 , 70                                              'Gdy Timer osiagnie ta wartosc nastepuje przerwanie
    Enable Interrupts                                             'Wlaczenie przerwan
    Enable Timer0                                                 'Wlaczenie timera
    Start Timer0                                                  'start timera
    Wyp1 = 40                                                     'wypelnienie w %
    Wyp2 = 80
    A = 0                                                         'zresetowanie licznika
    Do
    nop
    loop
    End
    
    Pwm:
       Incr A
       If A < Wyp1 Then
          P0.0 = 1
          Else
          P0.0 = 0
          End If
       If A < Wyp2 Then
          P0.1 = 1
          Else
          P0.1 = 0
          End If
       If A = 100 Then
          A = 0
          End If
    Return
    
  • #10 2744395
    ser1983
    Poziom 12  
    Posty: 116
    Pomógł: 3
    Ocena: 7
    Hmmm... nie wiem, w przykaldach z bascoma na których sie wzorowałem nie było tego. Symulacja dziala ok. No ale jakby cos w praktyce sie krzeczylo to sprobuje. Tak czy inaczej problem rozwiazany, wnosze o zamkniecie tematu :) Pozdrowienia dla uczestnikow dyskusji :) Faktycznie Timer to lepszy pomysl byl.

Podsumowanie tematu

✨ Dyskusja dotyczy implementacji sterowania dwoma wiatrakami na mikrokontrolerze AT89S52 za pomocą Bascoma, z uwzględnieniem PWM i wielowątkowości. Autor początkowo stosował pętlę z opóźnieniami (Waitms) do generowania sygnału PWM, co zostało odradzone na rzecz wykorzystania timerów i przerwań, które pozwalają na bardziej efektywne i precyzyjne sterowanie. Zwrócono uwagę, że mikrokontrolery 8-bitowe nie obsługują wielowątkowości w klasycznym rozumieniu, więc należy zastąpić ją odpowiednio rozbudowaną pętlą i obsługą przerwań. Zaproponowano implementację PWM w procedurze obsługi przerwania timera, z użyciem zmiennych typu byte zamiast typu single dla optymalizacji. Autor ostatecznie zastosował Timer0 w trybie 8-bitowego timera z przepełnieniem, konfigurując przerwania do generowania sygnału PWM dla dwóch kanałów, co rozwiązało problem sterowania wiatrakami. Wskazano również na konieczność ponownego załadowania wartości timera w procedurze przerwania, co jest standardową praktyką w mikrokontrolerach AVR, choć w Bascomie symulacja działała poprawnie bez tego kroku.
Wygenerowane przez model językowy.
REKLAMA