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

Procedura na równoległe działanie 2 programów w bascom

KanGu 05 Maj 2006 10:37 1827 7
REKLAMA
  • #1 2593748
    KanGu
    Poziom 13  
    Posty: 76
    Pomógł: 4
    Ocena: 1
    Zrobiłem program sterujący 4 urządzeniami i mierzącymi 2 temperatury jednak po dołożeniu tych 2 procedur mierzących temperaturę szybkość reakcji przy wysyłaniu z komputera znacznie spadła (tzn. ze np. wysyłam "1" powinno praktycznie od razu włączyć wejście portb.1, a teraz trwa to sekundę), zastanawiam się czy istnieje możliwość zagnieżdżenia programu albo sprawienia by 2 podprogramy działały równolegle. Jeśli to ma znaczenie to dodam że układ realizuje na procku atmega8:?:
  • REKLAMA
  • #2 2593954
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    KanGu napisał:

    Zrobiłem program sterujący 4 urządzeniami i mierzącymi 2 temperatury jednak po dołożeniu tych 2 procedur mierzących temperaturę szybkość reakcji przy wysyłaniu z komputera znacznie spadła (tzn. ze np. wysyłam "1" powinno praktycznie od razu włączyć wejście portb.1, a teraz trwa to sekundę), zastanawiam się czy istnieje możliwość zagnieżdżenia programu albo sprawienia by 2 podprogramy działały równolegle. Jeśli to ma znaczenie to dodam że układ realizuje na procku atmega8:?:

    Jeśli Twój program wykonuje tylko te zadania o których wspomniałeś , to jest to oczywiście do zrobienia.Trzeba tylko określić priorytety i tak napisać program , by "zadania" nie kolidowały ze sobą.Krótko mówiąc , trzeba być mistrzem sztuki kompromisów ;) Opisz dokładnie jak to rozwiązałeś, czy wykorzystujesz przerwania (świadomie-jawnie lub nie ;) )
    Gdybyś ujawnił swój kod , to byłaby najkrótsza droga do sukcesu ;)

    Piotrek
  • REKLAMA
  • #3 2594285
    Mustela73
    Poziom 13  
    Posty: 57
    przeanalizuj co zabiera twojemu programowi tyle czasu.
    Najprawdopodobnie czekanie na wynik pomiaru temperatury.
    zmien te procedure tak by rozdzielic rzadanie temperatury od jej odczytu.
    w miedzy czasie obsluz odczyt danych przychodzacych z komputera.
    polecam takze przyjrzenie sie przerwaniom, co pod nie jest podpiete i jak jest obslugiwane.

    Pozdrawiam
  • REKLAMA
  • #4 2595305
    adamusx
    Poziom 27  
    Posty: 977
    Pomógł: 94
    Ocena: 28
    A na czym Ci bardziej zalezy, na funkcji pomiaru temperatury czy na szybkosci reakcji na sygnal z komputera? Mysle ze temperatura nie zmienia sie zbyt gwaltownie wiec to moze poczekac, a najwiekszy priorytet przeznacz na obsluge danych odbieranych z komp. Jak odczytujesz dane z bufora RSa? W przerwaniu czy w okerslonym miejscu programu? Nie pamietam jak to jest w Bascomie, ale chyba jest mozliwosc wykorzystania przerwania od UARTA, np bezposrednio po przyjeciu przerwania od UARTa obsluguj sterowanie portami itp.
  • #5 2596531
    KanGu
    Poziom 13  
    Posty: 76
    Pomógł: 4
    Ocena: 1
    Juz po części przyśpieszyłem działanie dokładając miedzy dwa odczyty temperatury funkcje odczytu z bufora. teraz to wygląda tak:
    Odczyt z bufora
    odczyt temperatury 1
    Odczyt z bufora
    odczyt temperatury 2
    Pętla
    wcześniej było tak:
    Odczyt z bufora
    odczyt temperatury 1
    odczyt temperatury 2
    Pętla


    jednak nadal jak dla mnie czas reakcji jest za długi

    
    1wreset
    1wwrite Skip_rom
    1wwrite Convert
    [b]Waitms 800[/b]
    1wreset
    1wwrite Skip_rom
    1wwrite Read_sp
    


    Tak wygląda kod odczytu temperatury odbywa się on oddzielnie na 2 portach gdyż chciałem maksymalnie uprościć całość w sumie nigdzie indziej nie ma procedur opóźniających a te 800ms jednak robi swoje czy istnieje możliwość żeby to jeszcze bardziej uprościć (próbowałem dać mniejszy czas ale nie odczytuje temp)

    PS. czy zmieniłoby to cos jesli dałbym kwarc 16Mhz zamiast 8?

    mam pomysł porozdzielam te opóźnienia na 4x200ms i powrzucam miedzy nie odczyt z bufora :)
    juz chyba 10 raz to edytuje ^^
    Sprawdzone idzie jak burza :D
  • REKLAMA
  • #6 2603126
    euromatic
    Poziom 21  
    Posty: 422
    Pomógł: 17
    Ocena: 14
    zamiast opóźnienia daj zmienną i zliczaj czas ( pętle) jak poniżej
    Do
    Waitms 10
    Call Analogi

    Loop


    Sub Analogi

    '============================================= odczyt temperatury ds
    Incr Licznik_ds

    If Licznik_ds = 1 Then
    1wreset
    1wwrite &HCC : 1wwrite &H44
    End If

    If Licznik_ds = 100 Then
    1wreset
    1wwrite &HCC
    1wwrite &HBE
    Bd(1) = 1wread(9)
    1wreset
    T1 = Makeint(bd(1) , Bd(2))
    'If T1 < 0 Then : Temp_znak = 0 : Else : Temp_znak = 1 : End If
    'T1 = Abs(t1)
    T1 = T1 * 10 : T1 = T1 / 16

    Licznik_ds = 0

    End If

    End Sub
  • #7 2669137
    polik80
    Poziom 14  
    Posty: 85
    Pomógł: 6
    Ocena: 1
    Przywracam to forum do życia, bo mam problem podobny do tego z tematu. jak zrobić chociażby migającą diodę (programowo migającą), tak żeby nie wpływała na prędkość wykonywania programu, albo robiła to w nieznacznym stopniu.
    Wiem że mogę urzyć wait 1 ale to strasznie spowolni mi program
  • #8 2669447
    Samuraj
    Poziom 35  
    Posty: 2792
    Pomógł: 286
    Ocena: 619
    To proste, wykorzystaj timer.
    Ustaw tak jeden z timerów aby generował przerwanie np. co 1s a w obsłudze przerwania tego timera zmieniaj stan diody na przeciwny. I ot to cała filozofia.

Podsumowanie tematu

✨ Dyskusja dotyczy problemu spowolnienia reakcji programu sterującego czterema urządzeniami i mierzącego dwie temperatury na mikrokontrolerze Atmega8 w Bascom. Główną przyczyną opóźnień jest blokujące oczekiwanie na pomiar temperatury, szczególnie 800 ms opóźnienia w procedurze odczytu czujników DS18B20. Proponowane rozwiązania obejmują rozdzielenie zadań pomiaru temperatury i obsługi komunikacji z komputerem, wykorzystanie przerwań UART do szybkiego reagowania na dane, a także implementację pomiaru temperatury w sposób nieblokujący poprzez zliczanie czasu w pętli zamiast używania funkcji Waitms. Zasugerowano także użycie timerów do realizacji zadań okresowych (np. miganie diodą) bez spowalniania głównego programu. Zmiana częstotliwości taktowania mikrokontrolera z 8 MHz na 16 MHz może poprawić szybkość działania, ale kluczowe jest unikanie długich blokujących opóźnień. Przykładowy kod pokazuje implementację pomiaru temperatury DS18B20 z podziałem na etapy inicjalizacji i odczytu, realizowaną w funkcji wywoływanej cyklicznie.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA