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

BASCOM - Attiny13 - 2 wejścia i jedna zmienna - na różne sposoby.

Justyniunia 11 Lut 2024 17:30 552 12
  • #1 20956479
    Justyniunia
    Poziom 36  
    Cześć.

    Szukam sposobu, aby za pomocą dwóch wejść - K1 i K2 podciągniętych do VCC inkrementować zmienną (kejsy 0 i 3), ale na kilka różnych sposobów tzn:

    Sposób 1 - Dwa osobne przyciski lub przełącznik 2 pozycyjny.
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod

    ...to działa

    Sposób 2 - Jeden przycisk
    Tu wystarczy poprzedni kod i zewrzeć zworką oba przyciski.
    ... to też działa

    Teraz zaczynają się schody, bo potrzebuję...
    Sposób 3 - Jeden włącznik stabilny (w jednej pozycji zwiera K1 do masy)
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod

    Teoretycznie wszystko OK, ale to koliduje z poprzednimi warunkami.
    Siędzę kilka godzin, głowa boli.

    Odnoście konfiguracji to możemy operować sprzętowymi zworkami.
    Zewrzeć K1 do masy, zewrzeć K2 do masy, bądź zewrzeć K1 z K2

    Dodano po 43 [minuty]:

    Tak, to część kodu.
    (Odpowiedź na usunięty wpis :) )
    Rozwiązanie które podałeś załatwia sprawę sterowania włącznikiem stabilnym, ale teraz nie działa sterowanie jednym przyciskiem chwilowym :)

    Dodano po 6 [minuty]:

    To sterowanie serwo.
    Teraz chce dopisać trzy możliwości sterowania.
    1 - Jeden przycisk chwilowy
    2 - Dwa przyciski chwilowe.
    3 - włącznik stabilny (on/off)

    Nie wiem czemu biorę pod uwagę PRZEŁĄCZNIK stabilny, a nie włącznik, może na samym włączniku będzie łatwiej...

    Z całym kodem kręcę się w okolicach 96% flash, więc nie mam już większych ruchów :)
  • Pomocny post
    #2 20956589
    bart-projects
    Poziom 29  
    Widziałem gdzieś już kod z którego wycięto ten kawałek. Były w nim dwie zmienne typu Bit (Lock1 i Lock2). To są tylko dwa bity a Bascom i tak musi zarezerwować na nie cały bajt. Masz więc do dyspozycji jeszcze sześć wolnych bitów.
    Możesz dodać jeden Bit i teraz zakładasz zworkę na K2 do masy po czym włączasz urządzenie. Jeśli K2 na masie to Status = 1 i wszystko dalej reaguje tylko na stan K1.

    Kod: VB.net
    Zaloguj się, aby zobaczyć kod
  • #3 20956623
    Justyniunia
    Poziom 36  
    Obsługa obu przycisków z tymi LOCK się nie zmieści.
    Dlatego teraz przyciski są w CASE.

    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    To kod podstawowy, nie wiem czy dobry, ale działa i serwo nie przyspiesza już w jednym kierunku :)
    Trzeba zapisać EEPROM, bo nie ruszy.

    Ten kod działa z dwoma osobnymi przyciskami jak i jednym, kiedy zewrzemy zworką oba wejścia.

    Teraz chcę do tego dopisać obsługę jednego włącznika stabilnego.
    Jest GND na jednym z wejść, albo go nie ma, to serwo jedzie do jednej albo drugiej pozycji.
  • Pomocny post
    #4 20956638
    bart-projects
    Poziom 29  
    Jeśli dalej używasz choćby jednej zmiennej typu Bit to nadal pomysł jest aktualny bo bitów zawsze jest osiem.
    Jeśli nie, to mozna wygospodarować jedną zmienną typu Byte, ale że Tiny13 to bardzo wymagający uC i mozesz już nie mieć więcej miejsca na Byte to możesz pojechac po bandzie i do przechowywania wartości wykorzystać jakiś nieużywany rejestr :D

    Piszesz:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Czyli bit zero nieuzywanego Timera0 będzie miał wartość przeciwną do stanu K2 przy włączaniu urządzenia ahahahahahaha :D Timer stoi więc tam się nic nie zmieni.
  • Pomocny post
    #6 20956705
    bart-projects
    Poziom 29  
    Zajrzałem do skompilowanego pliku i widzę że kompilator w ogóle nie używa tu R2 i R3 więc mi je zostawił ;)
    Od pewnego czasu w Bascom do rejestrów można się odwoływać prosto z kodu. Ciekawe którą wersję Bascom masz. Pewnie znowu schody...
    U mnie program się kompiluje na 96%
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod
  • #7 20956743
    Justyniunia
    Poziom 36  
    W stanie niskim na K2 i wysokim na K1 serwo jedzie do jednej pozycji ale w stanie niskim na K2 i K1 jeździ w te i z powrotem.

    Może inaczej.

    Sterujemy serwem B.2, wychylenie i prędkość regulowana B.3 i B.4 (ADC)
    Do sterowania mamy dostępne dwa wejścia B.1 i B.0
    Obsługa opiera się na
    1 - Jednym przycisku B.0 lub B.1, albo oba na raz (każde naciśnięcie powoduje zmianę pozycji)
    2 - Dwóch przyciskach B.0 i B.1 (naciśnięcie jednego - zmiana pozycji w jedną stronę, naciśnięcie drugiego - zmiana pozycji w drugą stronę)
    3 - (Jeśli się da) Pod jedno z wejść B.0/B.1 lub oba podłączamy włącznik dźwigienkowy ON/OFF (zmiana pozycji przełącznika powoduje zmianę pozycji serwa)

    Problemem jest to, żeby te wszystkie opcje były dostępne na raz.
    Założenie zworki podczas włączania napięcia i zdjęcie jej później niestety nie wchodzi w grę. Założenie zworki i zostawienie jej na zawsze - już tak :)

    Tak coś czuję, że nie da się tego upchnąć w tym uC

    Nie wiem też dlaczego muszę zapisywać w EEP oprócz kroku jeszcze pozycję, ale tylko tak działa.
  • #8 20956750
    bart-projects
    Poziom 29  
    W poprzednim kodzie był błąd w Case 3 który poprawiłem.
    Nie miało sensu to że kiedy zworka na K2 do masy to sprawdzać warunek czy na K2 jest masa :D
    Błąd się wkradł bo nie chciałem użyć Not.
    Nad resztą pomyślę później. Może jakaś kawa sie przyda.
  • #10 20961478
    mpier
    Poziom 29  
    Witam,
    może nie całkiem na temat, ale próbowałaś napisać to w C, albo w Arduino? W Arduino wychodzi jakieś 10 bajtów RAM na całość plus kilka bajtów stosu. Jeśli masz jeszcze dużo tych attiny13 i planujesz jeszcze na nich budować, to myślę, że warto spróbować w C/C++.

    Niezależnie od języka sterowanie z punktu widzenia serwa w opcji 2 i 3 będzie takie samo, więc funkcja obsługująca jego stan musi reagować jedynie na trzy zdarzenia: M1 w obu przypadkach zmiana na przeciwny i na M23_L w stanie R, i M23_R w stanie L. To jest jeden switch z dwoma case.
    Wybór trybu na początku programu w zależności od wartości zworek a później znowu jeden switch z trzema case (bo tyle opcji masz). Teraz np. w case 1 (zwrotka na 0, tryb 1) naciśnięcie przycisku 1 generuje M1 np. serwo_obsłóż_zdarzenie(M1).
    Całe sterowanie wygląda wtedy tak:
    BASCOM - Attiny13 - 2 wejścia i jedna zmienna - na różne sposoby.
    W C wygląda tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    W bascomie będzie pewnie tak samo.

    Pozdrawiam.
  • #11 20968236
    mpier
    Poziom 29  
    Dopisałem na szybko resztę w stylu jak wyżej, i bez kombinacji wychodzi kilka bajtów ram i trochę ponad 400 kodu. Pewnie trzy takie programy weszłyby do attiny13 na raz.
    Cały ten case z krokami jest zbędny, a pewnie zajmuje miejsce. Mnożenie * 3.5 też może szkodzić, ale nie wiem jak bascom to traktuje.
  • #12 20968247
    Justyniunia
    Poziom 36  
    Niestety nic mi to nie mówi..
    Case z krokami jest potrzebny do zapisu położenia po zmianie pozycji serwa, bez tych kroków zapis nastepowal by cały czas bez sensu i ze szkodą dla pamięci eeprom.

    Kilka bajtów, no właśnie.
    Program zajmuje 99%, tu toczyła się bitwa o te kilka bajtów.

    Już jest i działa.
  • #13 20968334
    bart-projects
    Poziom 29  
    Znalazłem specjalnie dla Ciebie jeszcze kilka bajtów :D ahahahahaha

    Bascom stara się być "ignorantoodpornym" czyli jak ktoś może czegoś nie wiedzieć to on to, na wszelki wypadek, robi za niego.
    W języku C każdą zadeklarowaną zmienną najczęściej inicjuje się jakąś wartością ponieważ po reset nie można być pewnym, że w niej znajduje sie zero lub potrzebna wartość.
    Bascom na początku kodu patrzy jaki jest najdalszy adres w pamięci i w takiej pętli inicjuje wszystkie zmienne wartością zero. Ta pętla oczywiście kosztuje kilka bajtów flasha.
    Jeśli jednak program jest dość prosty i w dodatku nie jest Tobie potrzebne te zero bo każda ze zmiennych dostaje jakąś swoją początkową wartość np. Odczyt = Getadc(1) to można wyłączyć te zerowanie komendą $noramclear

    Kolejnym bezpiecznikiem Bascom jest tworzenie tablicy adresów do procedur obsługi przerwań.
    Jeśli włączysz przerwanie od jakiegoś zdarzenia to program skacze pod jego wektor i sprawdza gdzie we flash jest jego obsługa. Prawidłowo powinna być określona przez programistę poleceniem "On InterruptX Label". Gdy tego adresu nie będzie to program się wysypie.
    Bascom tworzy więc tablicę wszystkich nieobsługiwanych w kodzie przerwań i umieszcza tam instrukcję RETI czyli powrót z przerwania z jednoczesnym zdjęciem ze stosu adresu z którego skakał. Czyli nic się nie stanie.
    Jeśli jednak nie korzystasz z przerwań tak jak tutaj lub Twoje przerwanie ma "wysoki" adres to można zmniejszyć lub całkiem zrezygnowac z tej tablicy poleceniem $reduceivr

    Dodając więc te dwa polecenia w Twoim kodzie to przy flashu 1KB zajętośc flasha zmniejsza się z 99% na 96% i możesz sobie rzeźbić dalej ahahahahaha :D

    Kod: VB.net
    Zaloguj się, aby zobaczyć kod

    Rezygnujemy z Zapis = 1 tuż przed Waitms 500 bo zmienna Zapis i tak dostaje wartość z "Readeeprom Zapis ,1" oraz rezygnujemy z Waitms 1 w petli głównej bo program i tak jest tam zgodnie z Timerem co 20ms więc to marnowanie czasu, i teraz hulaj duszo, piekła nie ma :D

    Co do mnożenia x 3.5 to będzie traktowane "poważnie" tylko jeśli zmienna do której jest zapisywany wynik jest zmiennoprzecinkowa. Dla zmienej typu Word to nawet zapis:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod
    będzie kosztował więcej kodu.


    Polecam się w innych Bascomowych "kruczkach". :D

Podsumowanie tematu

Dyskusja dotyczy implementacji inkrementacji zmiennej w mikrokontrolerze ATtiny13 przy użyciu dwóch wejść (K1 i K2). Użytkownik przedstawia różne metody, w tym użycie dwóch przycisków, jednego przycisku oraz włącznika stabilnego. W odpowiedziach zaproponowano wykorzystanie zmiennych typu Bit do zarządzania stanami przycisków oraz zastosowanie timerów do uproszczenia logiki. Uczestnicy dyskusji omawiają również optymalizację kodu w języku Bascom, wskazując na ograniczenia pamięci i możliwości kompilacji. Wskazano na problemy z kolizjami warunków oraz potrzebę efektywnego zarządzania pamięcią EEPROM.
Podsumowanie wygenerowane przez model językowy.
REKLAMA