Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Regulacja Fazowa Bascom i 1Wire

dam23 28 Mar 2019 09:11 1224 34
Tespol
  • #1
    dam23
    Level 10  
    Witam
    Kombinuje już od tygodnia i nic ... Mianowicie mam taki problem.Buduje sterownik do nagrzewnicy CO która posiada wentylator sterowany fazowo przez mój sterownik . I tak wszystko działa pięknie regulacją obrotów od min do max działa dobrze do momentu gdy uruchomię pomiar na ds18b20 i tu problem gdy testuje układ na żarówce to żarówka co jakiś czas mruga. Napewno jest to spowodowane obsługą 1Wire bo gdy ją wyłączę to reguluje dobrze .Proszę o pomoc bo rozkładam ręce
    Code: vbnet
    Log in, to see the code
  • Tespol
  • #2
    Kuniarz
    Moderator of Designing
    Podczas odczytu DS'a musisz dać pauzę pomiędzy rozkazem rozpoczęcia konwersji a odczytem temperatury (standardowo 750ms). Przy czym musisz to rozwiązać sprytniej niż zwykłym waitms...
  • Tespol
  • #3
    dam23
    Level 10  
    Nic to nie daje.Temperaturę ładnie mierzy stabilnie ale pomiar 1 wire ma jakiś wpływ na Timer1 co obsługuje sterowanie fazowe tylko nie wiem jaki.Jak przejdę na pomiar analogowy (LM35 ) to działa ok. Ale zależy mi na pomiarze z ds... bo jest stabilniejszy i temperatura tak nie skacze.
    Pozdrawiam
  • #4
    Kuniarz
    Moderator of Designing
    Myślę, że w Bascom obsługa 1wire koliduje jakoś z przerwaniami. Miałem kiedyś na tapecie projekt z regulacją fazową i DSem, jak nie zapomnę to odkopię to wieczorem ;-)

    EDIT :

    Przepraszam, w tamtym projekcie miałem czujnik temperatury analogowy...
  • #5
    dam23
    Level 10  
    A jaki miałeś ten czujnik ? LM35 czy może coś lepszego u Mnie na LM35 temperatura skacz o ok 1st.C i nieładnie to wygłąda
  • #6
    Kuniarz
    Moderator of Designing
    Tak, to był chyba LM35 - nie pamiętam dokładnie, bo to 2014 rok był...

    Fragment kodu do przeliczania temperatury. Działało to stabilnie.

    Code: vbnet
    Log in, to see the code
    [/code]
  • #7
    tmf
    Moderator of Microcontroller designs
    Kuniarz wrote:
    Podczas odczytu DS'a musisz dać pauzę pomiędzy rozkazem rozpoczęcia konwersji a odczytem temperatury (standardowo 750ms).

    Musi tylko pamiętać, że jeśli zainicjuje konwersję i odczyta przed jej zakończeniem to odczyta poprzednią zmierzoną wartość. Nic więcej się nie stanie.
    Opisany problem wynika pewnie z faktu blokowania przerwań, czy ogólnie napisania obsługi 1-wire w sposób blokujący. Jakoś że obsługa 1-wire wymaga generowania impulsów nawet o czasie rzędu 500 us, więc to może interferować ze sterowaniem fazowym. Dlatego 1-wire lepiej byłoby zaimplementować na UART.
  • #8
    dam23
    Level 10  
    a czy da rade w bascomie stworzyć procedurę obsługi 1Wire tak by nie kolidowała z przerwaniami np.coś w rodzaju wstawki ASEMBLERA
  • #9
    dam23
    Level 10  
    Witam to co Panowie da radę coś zrobić w tym Bascomie by nie kolidował 1Wire z Timer1 ?
    Pozdrawia
  • #10
    LChucki
    Level 31  
    dam23 wrote:
    Witam to co Panowie da radę coś zrobić w tym Bascomie by nie kolidował 1Wire z Timer1 ?

    Już pisałem ale jak zwykle, dobre rady, trafiają do kosza - użyj UART do 1-Wire (załącznik). Pozostałych opcji nie będę ponownie opisywał, szukaj w koszu.
  • #11
    dam23
    Level 10  
    No Tak tylko jest mały problem bo czujnik temperatury mam podpiety pod port.3 w atmega8 I niemoge go zmienić bo pcb w ilości 40 szt gotowe I niespodziewalem się że takie cyrki wyjdą z tym bascomie. Co prawda uczę się C ale to jeszcze daleka droga.A czasu brakuję

    Dodano po 1 [minuty]:

    PS. Czujnik podpiety jest pod PORTC.3
  • #12
    LChucki
    Level 31  
    dam23 wrote:
    czujnik temperatury mam podpiety pod port.3 w atmega8 I niemoge go zmienić bo pcb w ilości 40 szt gotowe I

    Najpierw robi się prototyp, zrobiłeś krótką serię bez testów prototypu, możesz żal mieć tylko do siebie.

    dam23 wrote:
    niespodziewalem się że takie cyrki wyjdą z tym bascomie.

    Pierwszy raz używałeś Bascom? On jest nieprzewidywalny, jedne funkcje wpływają na drugie a w dokumentacji nie ma nic na ten temat.

    dam23 wrote:
    Czujnik podpiety jest pod PORTC.3

    Skalpel, lutownica i poprawiasz 40 szt.
    Inna opcja, która już opisałem, zawieszać przerwania tylko na czas generowania na 1-Wire "1" i czas slotu odczytu czyli 15us. Nie będzie to super zgodne z normą ale zadziała. Ze względu na niezgodności musisz sprawdzać CRC.

    Dodano po 3 [minuty]:

    dam23 wrote:
    Co prawda uczę się C ale to jeszcze daleka droga

    C nie rozwiąże magicznie problemów jak biblioteki będą do kitu, jak większość dla np Arduino.
    Ułatwieniem jest użycie szybszych uC np ARM, gdzie 1-Wire w 99% zadziała dobrze nawet na GPIO, bez zawieszania przerwań ale w trybie standardowym. W overdrive już nie da rady i trzeba użyć UASRT ale równie dobrze może to być SPI lub I2C.

    dam23 wrote:
    A czasu brakuję

    Robisz komercyjne projekty (40 szt to chyba nie na własny użytek) i nie masz czasu na naukę?
  • #13
    Kuniarz
    Moderator of Designing
    hmm... a może samo sterowanie fazowe masz spierniczone i tu jest pies pogrzebany ?
    Wyłącz też na próbę watchdoga.

    Wrzucam mój stary, ale działający kod (istotne fragmenty), może się na coś przyda.

    Code: vbnet
    Log in, to see the code
  • #14
    LChucki
    Level 31  
    Kuniarz wrote:
    hmm... a może samo sterowanie fazowe masz spierniczone i tu jest pies pogrzebany ?

    Problem jest banalny, w kodzie, którego analiza to katorga (dlatego nie zagłębiam się) ma
    Code: vbnet
    Log in, to see the code

    W chwili gdy obsługuje 1-Wire, Bascom ZAWSZE nawet na czas generowania resetu, co trawa ok 500us, później presence, co daje razem ok 800us, zawiesza przerwania. To samo w czasie transmisji danych, transmisja bajtu to ponad 500us zawieszone przerwania. W tym czasie nie wykona się przerwanie od timera, od i cała tajemnica.
    Można kombinować i użyć sprzętowego PWM do sterowania fazowego ale:
    - jak sprzętowo w AVR zsynchronizować licznik timera z zerem sieci?
    - pewnie pojawi się problem z doborem częstotliwości taktującej uC

    Dodano po 3 [minuty]:

    Jak więc Bascom powinien obsługiwać 1-Wire gdy używa GPIO? Przykładowa transmisja bitu:
    - zawieś przerwania
    - GPIO = L
    - wait 15us
    - włącz przerwania
    - jeśli master wysyła "1": GPIO = H
    - wait 45us
    - GPIO = H
    - wait 4us

    Odczyt bitu:
    - zawieś przerwania
    - GPIO = L
    - wait 6us
    - GPIO = H
    - wait 14us
    - odczytaj GPIO
    - włącz przerwania
    - wait 45us

    Dzięki temu przerwania są zawieszane na 15us po przerwie ok 45us kolejne 15us itd. Bascom zawiesza 8*64us, reset i presence 1-Wire dobija wszystko, stąd problemy.
    Algorytm obsługi nitu już jest, napisanie tego w Bascom to chyba niewielki problem. Następnie dodanie obsługi bajtu i problem rozwiązany.

    * Czasy pisałem z pamięci, trzeba sprawdzić z DS.
  • #15
    bart-projects
    Level 24  
    LChucki wrote:
    W chwili gdy obsługuje 1-Wire, Bascom ZAWSZE nawet na czas generowania resetu, co trawa ok 500us, później presence, co daje razem ok 800us, zawiesza przerwania. To samo w czasie transmisji danych, transmisja bajtu to ponad 500us zawieszone przerwania. W tym czasie nie wykona się przerwanie od timera, od i cała tajemnica.

    Ale zabobony.
    Każdy może otworzyć dowolnym edytorem tekstowym główną bibliotekę bascom czyli mcs.lib. Tam znajdzie sposób obsługi 1wire.
    Spójrz łaskawie na obrazek i pokaż mi gdzie tam jest jakieś CLI albo inne wyłączenie przerwań.
    Bascom nie wyłącza przerwań chyba że zapisuje coś do eeprom.
    Właśnie dla każdych Waitms i @genus jest w Helpie napisane, że każde przerwanie wydłuża takie oczekiwanie. Niektórzy właśnie sami wyłączają przerwania na czas czytania 1Wire - BASCOM TEGO SAM, BEZ WIEDZY PROGRAMISTY NIE ZROBI.
    Regulacja Fazowa Bascom i 1Wire
    Powtórzę po raz już enty "Nikt nie powinien się wypowiadać w temacie o którym nie ma pojęcia" Nie wiesz jak to robi Bascom - po prostu nie pisz bo to SZKODLIWA PORADA.

    Do Autora tematu. Posprzątałem trochę w tym kodzie. Sprawdź teraz.
    Osobiście poprawiłbym dużo więcej, ale już nie mam czasu.
    Code: vbnet
    Log in, to see the code


    [EDIT] Lista zmian:
    Komunikacja z Dallasem podzielona na dwa etapy : pierwsze 100ms - żądanie konwersji, po 900ms - odczyt
    Rezygnacja z przerwania 10ms od Timer0 - w zamian czytanie flagi Timer2
    Wyświetlacz zamiast odświeżania co 100ms odświeżany jest co 1s lub na żądanie (od przycisku i zmian)
    Przerwania zoptymalizowane pod kątem zachowywanych i odtwarzanych rejestrów,
  • #16
    dam23
    Level 10  
    Witam
    Sprawdziłem kod i teraz tak temperaturę wyświetla cały czas 85.0 a przy regulacji fazowej żarówka nadal "Błyska"reszta działa bez problemów
  • #17
    bart-projects
    Level 24  
    Osobiście lubię programować i mi to w niedzielę nie robi problemu, ale tutaj wkradł się błąd logiczny i to pewnie związany z tym, że "Niedzielna praca w nic się obraca" ahahaha :D

    Żądanie konwersji odbywało się co 100ms a nie co sekundę...
    Niemniej rozbiłem to jeszcze bardziej. Sprawdź podmieniając w poprzednim kodzie tylko tę całą pętlę główną.
    Jak dalej będzie mrużyć to spróbuj zaremować odczyt Dallasa. Być może cała idea sterowania wymaga innego podejścia.
    Code: vbnet
    Log in, to see the code
  • #18
    LChucki
    Level 31  
    dam23 wrote:
    temperaturę wyświetla cały czas 85.0

    Bo brakuje poprawnej konwersji temperatury.

    dam23 wrote:
    żarówka nadal "Błyska"

    Bo jak pisałem, rozwiązanie @bart-projects przez wstawki asm to maskowanie problemu a nie jego rozwiązanie. Niestety, moje dobre razy zostały uznane za spam i trafiły do kosza.
    Na początek zastosuj się do rady w #14. Rozwiązanie sprawdzone a nie gdybanie "sprawdź ten kod co posprzątałem może zadziała". Nie przeczę, że w Twoim przypadku, nawet te 15us może być problemem. Nie będe się rozpisywał co i jak bo pewnie post trafi do kosza. Jeśli 15us będzie problemem to napiszę co dalej, ważne bowiem jest kiedy wykrywasz zero, przed czy po faktycznym zerze i ile czasu odchyłki.

    Z głową zrobiona obsługa 1-Wire nawet na GPIO działa bez problemu na 8051. Skąd wiem? Bo robiłem.
    Niestety głupio zrobiłeś używając na tak powolnym uC jak AVR obsługi 1-Wire przez GPIO czyli programowej i programowego sterowania fazowego. Gdyby jedna z tych funkcji była w pełni sprzętowa to ok a tak to funkcje się gryzą i wybrnięcie z tego jest kłopotliwe ale nie niemożliwe. Może będziesz musiał synchronizować operacje 1-Wire z zerem sieci.
  • #19
    dam23
    Level 10  
    z kopiowałem Do.....Loop i temperatura działa ale mruganie nie ustało . Kolega LChucki ma racje ale wcześniej nie zagłębiałem się szczegółowo w 1wire i nie spodziewałem się ze będą kłopoty. Wcześniej robiłem sterowniki temperatur na zasadzie zał/wył grzałkę i to działa do dziś. Próbowałem wcześniej procedurę odczytu 1wire władować do przerwania (przejścia przez "0" sieci) i działało lecz regulacja fazowa działała w ok.50%.
  • #20
    LChucki
    Level 31  
    dam23 wrote:
    Próbowałem wcześniej procedurę odczytu 1wire władować do przerwania (przejścia przez "0" sieci) i działało lecz regulacja fazowa działała w ok.50%.

    Bo chciałeś czytać wszystko na raz. Gdybyś czytał po jednym bicie w każdym przejściu przez zero (max 15us odczyt, max 64us zapis) to problemu by nie było. Niestety, 1 bajt czytałbyś 20ms(50Hz) / 2(dwie połówki) * 8(bitów) = 160ms. Szału nie ma. Ale, jakby czytać 8 bitów to już ma to sens.
    Ja bym jednak szedł w stronę czytania w pętli głównej ale synchronizowania z zerem sieci. W 20ms przetransmitujesz jakieś 300bajtów. Spokojne masz czas na reset+presence ok 0,8ms. Jak bym się wpakował w problem jaki masz tak bym zrobił chyba, że moje rozwiązanie z zawieszaniem przerwań na 15us byłoby skuteczne ale jak pisałem, to zależy od układu wykrywania zera.

    dam23 wrote:
    nie zagłębiałem się szczegółowo w 1wire i nie spodziewałem się ze będą kłopoty.

    Powinien zagłębić się autor Bascoma, jak widzisz, obsługę 1-Wire zrobił źle i jeszcze kasę za to bierze! Mam nadzieję, ze po tej "lekcji" zrezygnujesz z Bascom.
    Moderated By Kuniarz:

    Kolego... dziwisz się później, że Twoje posty lądują w śmieciach ? Skoro w temacie jest Bascom i AVR to tak będzie i koniec ! Nie nawrócisz w dwa dni kogoś na STM'a oprogramowanego w C.
    Bardzo, ale to BARDZO proszę powstrzymać się od hejtu i mądrości ludowych. Tylko konkrety i TYLKO W TEMACIE !



    dam23 wrote:
    Wcześniej robiłem sterowniki temperatur na zasadzie zał/wył grzałkę i to działa do dziś.

    Bo czy załączyłeś trochę wcześniej, czy później, nie miało to znaczenia tu ma.


    PS
    Jaki masz układ wykrywania zera sieci?


    PS2
    Ile kosztowała te 40 szt PCB?
    Może taniej zrobić to porządnie, na UART?
  • #21
    bart-projects
    Level 24  
    Regulację masz na przerwaniach. Nic ich nie blokuje. Gdyby te przerwania przeszkadzały to nie byłoby odczytów z Dallasa.
    Problem zapewne leży gdzie indziej.
    Zaremuj odczyty Dallasa i sprawdź czy rzeczywiście przestanie mrużyć.
    Przyjrzałbym się tej zmiennej "Załacz" która włącza lub wyłącza przerwanie od Timer1. Można to spróbować zaremować (pierwsza linijka pętli)
    Ludzkie oko nie potrafi wychwycić zmian powyżej 50Hz. Coś tam jest innego. Zaremuj odświeżanie wyświetlacza. Coś poszukaj.
  • #22
    LChucki
    Level 31  
    bart-projects wrote:
    Ludzkie oko nie potrafi wychwycić zmian powyżej 50Hz.

    Raczej poniżej tylko kolega raczej nie wie jak działa triak i gdy za późno go wyłączyć to przez następny okres będzie przewodził.
    Dalej, 50Hz to 20ms, poniżej 5ms oko tez zobaczy.

    Problem autora wątku jest dość złożony, na który wpływa wiele czynników. Nie będe się produkował z pisaniem co i jak, bo pewnie znowu kosz, jak autor jest zainteresowany ma telefon do mnie.
    To jest do zrobienia (na 99%) nawet w tej kiepskiej konfiguracji sprzętu, w kiepskim Bascom bez wstawek asm.
    Dałem wiele podpowiedzi (większość kosz), można by napisać "Kosz kopalnią wiedzy".

    Raczej już nic w tym temacie nie napiszę, bo chyba napisałem wszystko w formie pomocy.
  • #23
    dam23
    Level 10  
    Witam
    Zaremowałem najpierw "Call 1wire_read" i miga,potem "Call 1wire_start" i nadal mignięcia ale gdy zaremowałem oby dwie funkcje to działa i nie mruga. Chyba zostawię pomiar temperatury na analogu LM35 ale osobiście wolał na dallasie stabilniejszy pomiar

    Dodano po 2 [godziny] 32 [minuty]:

    A co do detekcji zera standardowo mostek prostowniczy + rezystor na plusie do CNY17 .
  • #24
    bart-projects
    Level 24  
    W detekcji można pominąć mostek stosując optotriak z dwoma diodami np. PC814, ale ja nie o tym.
    Niedługo mam oprogramowywać jakąś zgrzewarkę to zrobię to pewnie porządniej, ale teraz możesz podmienić te pętlę główną.
    Jak widzisz rozbiłem komunikację z Dallasem tak, że na jedno 10ms wysyłana lub odbierana jest jedna komenda. Czytanie temperatury działa - specjalnie sprawdziłem. Ciekawe czy uleczy Twój kod.
    Powodzenia :D
    Code: vbnet
    Log in, to see the code
  • #25
    dam23
    Level 10  
    Bardzo ci dziękuję za pomoc jutro sprawdzę I dam znać co I Jak.
    Pozdrawiam

    Dodano po 10 [godziny] 30 [minuty]:

    Witam nic nie pomogło błyska jak szalona przesyłam filmik jak to wygląda Pozdrawiam

  • #26
    bart-projects
    Level 24  
    Taki długi błysk.. to tak jakby cała długość Timera1. Jakby przeoczono Timer1 OVF i nie wyłączono triaka,
    W międzyczasie - na razie dla siebie - napisałem implementację 1Wire poprzez UART, ale tu nie pomoże. Ten kod trzeba napisać od nowa - inaczej.
  • #27
    LED5W
    Level 33  
    Wyzwalaj triaka impulsem zamiast czekać do zera. W zerze prąd nie zawsze jest zerowy, a triak będzie przewodził dopóki prąd nie spadnie.
  • #28
    dam23
    Level 10  
    Witam
    Czyli mam odpuścić Bascom do tego projektu I wziąć się za C? Zrobiłem to na analogowym czujniki (LM35) I działa dobrze.Jesli ktoś miał by pomysł jak to ogarnąć w bascomie to bardzo proszę o propozycję.Pozdrawiam serdecznie I miłego weekendu
  • #29
    LChucki
    Level 31  
    dam23 wrote:
    Jesli ktoś miał by pomysł jak to ogarnąć w bascomie to bardzo proszę o propozycję.

    Pisałem kilka razy jak to zrobić ale jest jeszcze jeden sposób, napisz w Bascom nie używając Bascom - użyj dostępu do SFR.
  • #30
    bart-projects
    Level 24  
    Znam C a wolę pisać w B4A, B4i, B4R, Bascom czyli w Basic, ale kiedy coś mi nie działa to odpalam analizator stanów logicznych albo oscyloskop. Nie zwalam na język programowania.

    [EDIT] Może inaczej. Oprogramowana w Bascom Babcia Atmega8 taktowana wewnętrznym oscylatorem 8MHz potrafi tam i z powrotem odwrócić stan pinu w ciągu 250ns...
    Regulacja Fazowa Bascom i 1Wire