Optymalizacja kodu na flagach

Pytania, kody i porady dotyczące nie tylko Bascom.
ODPOWIEDZ
Awatar użytkownika
Radzio
Posty: 8
Rejestracja: 08 lip 2018, 11:36

Optymalizacja kodu na flagach

Post autor: Radzio » 23 sty 2022, 18:20

Witam wszystkich, mam zagwozdkę z programem j.n. O ile wersja na waitach jak na debounce nie stanowi problemu i działa(bez wyjścia B.3), tak postanowiłem przerobić to aby kod zajmował nieco mniej, na tzw. flagach. Geneza programu jest taka:
Zwieram wejście B.2 do masy, zostaje uruchomione wyjście B.0 a po 1s. wyjście wraca do poprzedniego stanu, nawet jak dalej trzymam przycisk wejścia.
Puszczam przycisk wejścia, dzieje się dokładnie to samo, czyli uruchamia się wyjście B.0 na 1s. i wraca do poprzedniego stanu nawet jak nie trzymam przycisku.
Do tego chciałbym aby wraz z uruchomieniem wejścia na 3s. w cyklu co 400ms. migała sobie dioda na wyjściu B.3.

Obecnie mam taki stan że uruchamiam wejście, uaktywnia się wyjście B.0 ale nie zmienia stanu po 1s., oraz uaktywnia się wyjście B.3 (miga dioda) ale cały czas do momentu zwolnienia wejścia. Jak zwolnię wejście to deaktywuje się poprzedni stan wyjścia B.0 i B.3. Co robię źle?
  1.   $Regfile = "attiny13.dat"    
  2.   $Crystal = 9600000            'taktowanie procesora 9,6MHz - podział przez 8 wyłączony
  3.  
  4.  $hwstack = 10
  5.  $swstack = 0
  6.  $framesize=40
  7.  
  8.  Config Pinb.2 = Input        
  9.  Config Pinb.0 = Output        
  10.  Config Pinb.3 = Output        
  11.  
  12.  przycisk Alias Pinb.2
  13.  wyjscie Alias Portb.0
  14.  led Alias Portb.3
  15.  
  16.  Dim flaga As Bit
  17.  Dim licznik As Word
  18.  Dim miganie As Word
  19.  
  20. przycisk = 1
  21.  
  22. do
  23.    if przycisk = 0 then        
  24.       if flaga = 0 then        
  25.          flaga = 1
  26.          licznik = 0
  27.          miganie = 0
  28.       endif
  29.    endif
  30.  
  31.    if flaga = 1 then
  32.       if wyjscie = 1 then
  33.          wyjscie = 0            
  34.          endif
  35.       endif
  36.  
  37.       incr licznik
  38.       if licznik = 1000 then    
  39.          wyjscie = 1
  40.          led = 1
  41.          flaga = 0
  42.       endif
  43.  
  44.       incr miganie
  45.       if miganie = 400 then  
  46.          toggle led
  47.  
  48.       endif
  49.  
  50.      waitms 1                   'opoznienie petli glownej
  51.  
  52.      loop
  53.  
  54.      End
Awatar użytkownika
niveasoft
Posty: 1213
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Optymalizacja kodu na flagach

Post autor: niveasoft » 24 sty 2022, 10:25

Bardziej w ten deseń:
  1. $Regfile = "attiny13.dat"
  2. $Crystal = 9600000            'taktowanie procesora 9,6MHz - podział przez 8 wyłączony
  3. $hwstack = 10
  4. $swstack = 0
  5. $framesize = 24
  6.  
  7. Config Portb = &B001001 : Portb = &B111111
  8.  
  9. przycisk Alias Pinb.2
  10. wyjscie Alias Portb.0
  11. Led Alias Portb.3
  12.  
  13. Dim Licznik As Word
  14. Dim Licz_mig As Word
  15. Dim Status As Byte
  16.  
  17. Do
  18.  
  19.  If Przycisk = 0 Then
  20.   If Status = 0 Then
  21.    Status = 1
  22.     Gosub Startuj
  23.   End If
  24.  Else
  25.   If Status = 1 Then
  26.    Status = 0
  27.     Gosub Startuj
  28.   End If
  29.  End If
  30.  
  31.  If Licznik < 3000 Then
  32.   Incr Licznik
  33.  
  34.   If Licznik = 2000 Then Set Wyjscie
  35.  
  36.   If Licz_mig < 400 Then
  37.    Incr Licz_mig
  38.   Else
  39.    Licz_mig = 0
  40.    Toggle Led
  41.   End If
  42.  Else
  43.   Set Led
  44.  End If
  45.  
  46. Loop
  47. End
  48.  
  49. Startuj:
  50.  Licznik = 0
  51.  Licz_mig = 0
  52.   Reset Wyjscie
  53.   Reset Led
  54. Return
Awatar użytkownika
Radzio
Posty: 8
Rejestracja: 08 lip 2018, 11:36

Re: Optymalizacja kodu na flagach

Post autor: Radzio » 24 sty 2022, 11:59

Szacun panie Bartku, zrozumiałem. Teraz jeszcze mam to, że nawet jak zmieniłem taktowanie na 4,8MHz z włączonym podziałem przez 8, to i tak śmiga to za szybko. Nijak mają się wartości 2000 do czasu.
Awatar użytkownika
niveasoft
Posty: 1213
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Optymalizacja kodu na flagach

Post autor: niveasoft » 24 sty 2022, 12:09

Bo brakuje Waitms 1. Kod napisałem praktycznie od nowa i tego nie przepisałem.

Co do tych flag to to się nie opłaca dla jednej flagi bo Bascom i tak to musi trzymać w jakimś bajcie.
Na dodatek wyłuskanie flagi bitowej jest dużo bardziej flasho-żerne czyli czytaj że kosztuje więcej kodu.
Kiedyś na forum Pana Mirleya udało mi się dodać jakąś funkcjonalność do Jego programu tylko dlatego, że zrezygnowałem z Bitów na rzecz Bajtów. Program z 99% zmniejszył się do 70%.

Dla tego procesorka który ma tylko 64 bajty RAM to lepiej jest zrobić maszynę stanów na jednym bajcie czyli np. Status = 1 Status = 2 a w programie Select Case Status.
Awatar użytkownika
Radzio
Posty: 8
Rejestracja: 08 lip 2018, 11:36

Re: Optymalizacja kodu na flagach

Post autor: Radzio » 24 sty 2022, 14:59

Ok. a dlaczego po podaniu zasilania od razu uaktywniają mi się wyjścia B0 i B3 skoro są podciągnięte razem z wejściem?
Awatar użytkownika
niveasoft
Posty: 1213
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Optymalizacja kodu na flagach

Post autor: niveasoft » 24 sty 2022, 15:13

No sam też możesz pomyśleć ;)
Błąd był chyba w logice...bo w międzyczasie robiłem coś innego.
  1. $regfile = "attiny13.dat"
  2. $crystal = 9600000                                          'taktowanie procesora 9,6MHz - podział przez 8 wyłączony
  3. $hwstack = 10
  4. $swstack = 0
  5. $framesize = 24
  6.  
  7. Config Portb = &B001001 : Portb = &B111111
  8.  
  9. Przycisk Alias Pinb.2
  10. Wyjscie Alias Portb.0
  11. Led Alias Portb.3
  12.  
  13. Dim Licznik As Word
  14. Dim Licz_mig As Word
  15. Dim Status As Byte
  16.  
  17. Do
  18.  
  19.  If Przycisk = 0 Then
  20.   If Status = 0 Then
  21.    Status = 1
  22.     Gosub Startuj
  23.   End If
  24.  Else
  25.   If Status = 1 Then
  26.    Status = 0
  27.     Gosub Startuj
  28.   End If
  29.  End If
  30.  
  31.  If Licznik > 0 Then
  32.   Decr Licznik
  33.  
  34.   If Licznik = 2000 Then Set Wyjscie    'jedzie w dół więc tutaj minęła sekunda
  35.  
  36.   If Licz_mig < 400 Then
  37.    Incr Licz_mig
  38.   Else
  39.    Licz_mig = 0
  40.    Toggle Led
  41.   End If
  42.  Else
  43.   Set Led
  44.  End If
  45.  
  46. Loop
  47. End
  48.  
  49. Startuj:
  50.  Licznik = 3000
  51.  Licz_mig = 0
  52.   Reset Wyjscie
  53.   Reset Led
  54. Return
Awatar użytkownika
Radzio
Posty: 8
Rejestracja: 08 lip 2018, 11:36

Re: Optymalizacja kodu na flagach

Post autor: Radzio » 24 sty 2022, 16:14

Wszystko jasne, bardzo ci dziękuję.
ODPOWIEDZ