Elektroda.pl
Elektroda.pl
X
SterControl
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

BASCOM AtTiny85 - Początki, programy, problemy, pytania...

Justyniunia 05 Wrz 2016 12:54 3951 49
  • #1 05 Wrz 2016 12:54
    Justyniunia
    Poziom 24  

    Witam.

    Mam program, w którym stany 4 wyjść zmieniają się pod wpływem impulsów na jednym z wejść (Select Case) Teraz chodzi mi o to, żeby po zaniku impulsów (dłuższym stanie 0 na wejściu) wszystkie wyjścia przeszły w stan 0, RESET.
    Pewnie trzeba użyć TIMER, ale nie umiem.

    Pozdrawiam

    0 29
  • SterControl
  • Pomocny post
    #2 05 Wrz 2016 12:55
    excray
    Poziom 39  

    A co to za stan wejść RESET?

    0
  • #3 05 Wrz 2016 13:01
    Justyniunia
    Poziom 24  

    Na 4 wyjściach są diody LED i po każdym impulsie 1 na wejściu stany wyjść zmieniają się zależnie od wpisów w CASE, po zaniku impulsów na wejściu, na wyjściach zostają stany ostatnio wybranego CASE, a mi zależy, żeby po (np) 2 sekundach wszystkie wyjścia przeszły w stan 0 (wszystkie LED zgasły)

    Jeśli stan na wejściu = 0 przez więcej jak 2s, to ustaw wyjścia na 0

    0
  • Pomocny post
    #4 05 Wrz 2016 13:05
    excray
    Poziom 39  

    Pokaż program.

    0
  • #5 05 Wrz 2016 13:09
    Justyniunia
    Poziom 24  

    Potrzeba jakiegoś licznika, który co chwilę będzie resetowany przez stan 1 na wejściu PULSE.
    Jeśli na wejściu PULSE przestaną pojawiać się stany 1, to licznik doliczy do określonej wartości i wtedy ustawi na wyjściach A, B, C, D stany 0.

    Czy dobrze myślę?

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

    0
  • Pomocny post
    #6 05 Wrz 2016 13:49
    373522
    Użytkownik usunął konto  
  • SterControl
  • #8 07 Wrz 2016 21:26
    Justyniunia
    Poziom 24  

    Teraz z innej beczki:
    Jest sobie program, gdzie po każdorazowym naciśnięciu przycisku program skacze do kolejnych CASE i wszystko działa, ale...

    Po załączeniu zasilania nie dzieje się nic, bo program czeka na pierwsze naciśnięcie guzika, a ja potrzebuję, żeby ruszył od razu np CASE1

    0
  • Pomocny post
    #9 07 Wrz 2016 21:36
    373522
    Użytkownik usunął konto  
  • #10 13 Wrz 2016 20:05
    Justyniunia
    Poziom 24  

    Jest jakaś opcja, żeby w każdej chwili wyjść z wywołanej wcześniej procedury?

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

    Teraz w razie kiedy nagle T < 5
    Procedura musi zostać przerwana i program ma wrócić do pętli głównej.

    Dobra, chyba wiem, to będzie EXIT SUB

    Nie, to jednak nie to...

    0
  • Pomocny post
    #11 14 Wrz 2016 13:45
    373522
    Użytkownik usunął konto  
  • #13 18 Wrz 2016 18:47
    373522
    Użytkownik usunął konto  
  • #14 18 Wrz 2016 21:31
    Justyniunia
    Poziom 24  

    Zmienna T jest definiowana jakby z zewnątrz i nie może brać udziału w pętli For Next, za to pętla For Next musi reagować na zmienną T.

    Oto kot :) tzn Kod:

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Program STROBO to tylko przykład, jest to program jeden z wielu przełączanych przyciskiem, natomiast wpadając w tryb Stand Alone za cholerę nie mogę już z niego wyjść. Pętle For Next muszą dojść do końca i nie wiem jak to przeskoczyć.

    0
  • #15 18 Wrz 2016 22:28
    373522
    Użytkownik usunął konto  
  • #16 19 Wrz 2016 09:50
    Justyniunia
    Poziom 24  

    Dziękuję, działa :)
    Jak użyć timera (tzn. jak wyciągnąć z niego np zmienną dodawaną, lub resetowaną co określony czas?)
    Boję się jeszcze TIMERów :) , ale chodzi mi po głowie ten licznik programowy, jeśli już pracuje z rozdzielczością 1/1000s, to można go wykorzystać do generowania zmiennych trwających określone czasy zamiast wstrzymywać program tymi WAIT.

    To już się mści niestety. Czasem trzeba dłużej przytrzymać guzik, żeby program zmienił efekt świetlny na następny. Pewnie akurat wtedy trafiam na te przerwy WAIT.

    Czy jest jakaś pozycja książkowa, albo online pisana przez programistów dla zwykłych zjadaczy chleba, gdzie można bezboleśnie nauczyć się Bascoma?

    0
  • Pomocny post
    #17 19 Wrz 2016 12:48
    yokoon
    Poziom 28  

    Ja akurat znam taką:
    Programowanie mikrokontrolerów AVR w języku BASCOM.
    Autor: Marcin Wiązania

    Zobacz w księgarni HELION.

    0
  • #18 04 Paź 2016 21:49
    Justyniunia
    Poziom 24  

    Kupione, bardzo ciekawa, dużo przykładów.
    Znam już trochę timer (przynajmniej podstawy), ale teraz pytanie.

    Jak zrobić żeby zmienna trwała krócej niż impuls, który ustala jej wartość? (pewnie piszę herezje)

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

    Proble jest w tym, że moje PULSE trwa ok 300-500ms, a moje T musi być wyzwalane poprzez PULSE, ale przyjmować stan 1 krócej niż trwa PULSE po czym się resetować (T=0).

    Jeśli zrobię tak, że
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    to działa (LED na porcie jakimśtam, błyśnie w czasie 1ms nie zależnie od długości PULSE), a ze zmienną T już nie działa...

    0
  • #19 04 Paź 2016 22:00
    373522
    Użytkownik usunął konto  
  • #20 09 Paź 2016 11:02
    Justyniunia
    Poziom 24  

    Rozumiem teraz.

    Mam teraz takie coś:

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Mogę ustalić ile czasu ma trwać świecenie LED, ale jak teraz zrobić, żeby po podaniu Pulse dioda LED błysnęła 3 razy.

    Do tej pory w programie było to tak:
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Chcę się pozbyć tych Wait'ów i skorzystać z tego licznika programowego.
    Jak napisać, że jeśli zmienna "czas" zawiera się w przedziale 0-20, 50-70 i 100-120 to Led = 1 w przeciwnym wypadku (20-50, 70-100 i powyżej 120) Led = 0.

    Tak, wiem, na pewno robi się to inaczej i zapewne na TIMER'ach.

    0
  • #21 09 Paź 2016 20:54
    373522
    Użytkownik usunął konto  
  • #22 31 Paź 2016 21:44
    Justyniunia
    Poziom 24  

    Witam po przerwie.

    Ćwiczę teraz zapis do pamięci EEPROM i mam problem.

    Chcę, żeby po wyłączeniu urządzenie pamiętało ostatnią nastawę.
    Po każdym naciśnięciu przycisku program zwiększa i zapisuje zmienną X do pamięci EEPROM
    Po wyłączeniu i włączeniu odczytuje zmienną, ale działa to tylko dla X=2 i x=3
    Jeśli x=1 i wyłączę i włączę zasilanie lub zresetuję procesor, to nic się nie dzieje. Przycisk też przestaje reagować.

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Korzystam z HELPA i rozumiem, że to tylko najprostszy przykład ale działa jakby połowicznie. Co robię źle?

    ...

    Dobra, już wiem.

    Zapis do pamięci ma być po warunku.

    0
  • #23 31 Paź 2016 23:11
    373522
    Użytkownik usunął konto  
  • #24 02 Lis 2016 21:31
    Justyniunia
    Poziom 24  

    Co do ilości nóg, to nie problem, akurat teraz męczę TINY85, ale docelowo będzie to pewnie jakaś MEGA8.
    Najlepiej było by gdyby zapisywało się to np tylko przy wyłączaniu zasilania, ale to już pewnie sprzętowo trzeba by załatwić.
    Jakiś układ zewnętrzny wykrywający spadek napięcia na kondensatorze, podający stan niski na wejście portu (zamiast przycisku) i wtedy:

    If "jakiś układ" = 0 then
    Writeeeprom X , 0
    End If

    Pozdrawiam.

    0
  • #25 13 Lis 2016 20:20
    Justyniunia
    Poziom 24  

    Witam.

    Potrzebuję podłączyć pod jeden z portów DIP Switch i wybierać procedurki zależnie od jego ustawień.
    Czy można sprawdzić stan wejść portu, tak jak ustawia się stany wyjściowe na porcie? (portB=&B00001010)
    Jeśli sprawdzam to warunkami

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

    , to 16 gołych warunków zajmuje mi grubo ponad 2k FLASH :(
    Gdyby dało się np tak:
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

    To już by było prościej.

    Czy można to zrobić w podobny sposób?

    0
  • Pomocny post
    #26 13 Lis 2016 20:37
    excray
    Poziom 39  

    Oczywiście, że możesz. Będziesz wtedy czytać PINB.

    0
  • #27 20 Lis 2016 17:23
    Justyniunia
    Poziom 24  

    Witam.

    Mam kolejną zagwozdkę, a właściwie dwie.

    Czy można wybierać Case, w których są inne Case?
    Czyli np.

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

    Jak zamknąć teraz end select? Dwa razy?
    Pewnie tak się nie da.

    Teraz drugie pytanie:

    Jak sterować 4 LED wg tego, ale tak, żeby można było np jedną mrugać, drugą zaświecić na stałe, a pozostałe zgasić?
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Pazdrawlaju ;)
    PS: Pewnie niedługo ktoś napisze - przesiądź się na C, albo daj sobie spokój...

    0
  • #28 20 Lis 2016 17:37
    373522
    Użytkownik usunął konto  
  • #29 20 Lis 2016 17:58
    Justyniunia
    Poziom 24  

    Czytam to
    https://www.elektroda.pl/rtvforum/topic1399667.html
    i linki zamieszczone w temacie, poniekąd rozumiem, ale nigdzie niema wzmianki (jakieś liczby, przykłady) o tym kiedy i jakie wartości ustawiać.

    Bazuję na tym co ustawia mi BASCOM

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

    Dla początkującego fajnie pisze się proste programy, ale teraz zaczynają się schodki :(
    Co do drugiego:

    Chcę sterować czterema LED wybierając ich stany z CASE (krok), ale umiem tylko zaświecić/zgasić, lub pobłyskać jedną lub ich kombinacjami, natomiast jeśli trzeba:

    KROK1
    LED1 błyska : LED2 świeci : LED3 świeci : LED4 błyska
    KROK2
    LED1 nie świeci : LED2 błyska : LED3 : błyska : LED4 nie świeci

    itp...
    to już niestety kombinuję na wszelkie sposoby i nie działa.

    Ogólnie to próbuję pisac programy do sterowania oświetleniem dyskotekowym, tak dla siebie (buduję różne urządzenia).
    Czasem jest to stroboskop, czasem ledy RGB, czasem powerLED z soczewką i jakiś silnik DC który kręci lusterkami, zmiana kierunku i koloru zależnie od muzyki.

    Niby nic trudnego, a jednak.

    0
  • #30 20 Lis 2016 18:58
    373522
    Użytkownik usunął konto