Przeróbka programu "Wąż"


Witam! Czy może mi ktoś pomóc w przerobieniu kodu do węża aby nie stosować Waitms tylko licznik, timer. Zależy mi aby była płynna regulacja prędkości zapalania kolejnych ledów na portach. Czy można zastosować zmienną typu integer w celu rozszerzenia reg.prędkości?[]

$regfile = "m8def.dat"                                      'zadeklarowanie użytego procesora
$crystal = 1000000
 Config Pind.0 = Input
    Portd.0 = 1
    Szybko Alias Pind.0
 
    Config Pind.1 = Input
    Portd.1 = 1
    Wolno Alias Pind.1
 
    Config Pinb.0 = Output
    Portb.0 = 0
    Led_1 Alias Portb.0
 
    Config Pinb.1 = Output
    Portb.1 = 0
    Led_2 Alias Portb.1
 
    Config Pinb.2 = Output
    Portb.2 = 0
    Led_3 Alias Portb.2
    Config Pinb.3 = Output
    Portb.3 = 0
    Led_4 Alias Portb.3
    Config Pinb.4 = Output
    Portb.4 = 0
    Led_5 Alias Portb.4
    Config Pinb.5 = Output
    Portb.5 = 0
    Led_6 Alias Portb.5
    Config Pinb.6 = Output
    Portb.6 = 0
    Led_7 Alias Portb.6
    Config Pinb.7 = Output
    Portb.7 = 0
    Led_8 Alias Portb.7
Enable Interrupts
 
    Dim Tempo As Byte At &H62
   Tempo = 255
   Do
   If Szybko = 0 Then Gosub Szybciej
   If Wolno = 0 Then Gosub Wolniej
   Led_8 = 1
   Led_1 = 0
   Waitms Tempo
   If Szybko = 0 Then Gosub Szybciej
   If Wolno = 0 Then Gosub Wolniej
   Led_1 = 1
   Led_2 = 0
   Waitms Tempo
   If Szybko = 0 Then Gosub Szybciej
   If Wolno = 0 Then Gosub Wolniej
   Led_2 = 1
   Led_3 = 0
   Waitms Tempo
   If Szybko = 0 Then Gosub Szybciej
   If Wolno = 0 Then Gosub Wolniej
   Led_3 = 1
   Led_4 = 0
   Waitms Tempo
   If Szybko = 0 Then Gosub Szybciej
   If Wolno = 0 Then Gosub Wolniej
   Led_4 = 1
   Led_5 = 0
   Waitms Tempo
   If Szybko = 0 Then Gosub Szybciej
   If Wolno = 0 Then Gosub Wolniej
   Led_5 = 1
   Led_6 = 0
   Waitms Tempo
   If Szybko = 0 Then Gosub Szybciej
   If Wolno = 0 Then Gosub Wolniej
   Led_6 = 1
   Led_7 = 0
   Waitms Tempo
   If Szybko = 0 Then Gosub Szybciej
   If Wolno = 0 Then Gosub Wolniej
   Led_7 = 1
   Led_8 = 0
   Waitms Tempo
   Loop
   End
   Szybciej:
   If Tempo < 0 Then Tempo = 0
   Decr Tempo
   Return
   Wolniej:
   If Tempo > 255 Then Tempo = 255
   Incr Tempo
   Return




Portret użytkownika matrix

Re: Przeróbka programu "Wąż"

z tego co widzę to (jak dla mnie) jest kilka błędów. na przykład tu:

Szybciej:
   If Tempo < 0 Then Tempo = 0
   Decr Tempo
   Return

już w tym widzę co najmniej 2 błędy.
1 - zmienna byte przyjmuje wartości od 0 do 255 więc mniejsza od 0 nie będzie nigdy
2 - co w ogóle robi ta etykieta? dajmy na to że zmienna Tempo przyjęła by wartość mniejszą niż 0 i co wtedy? instrukcja THEN sprowadzi ją do wartości 0 a linijkę niżej instrukcja DECR spowrotem zmniejszy jej wartość poniżej 0 i tak wkoło. tak samo jest w etykiecie Wolniej.

a co do zamiany WAITMS na timer to trzeba dodać zmienna typu (na przykład) WORD i przy naciskaniu przycisków zwiększać lub zmniejszać jej wartość, a następnie wpisywać wartość tej zmiennej do timera.

a pomijając to wszystko to (jak dla mnie) program w ogole źle jest napisany i jakoś tak chaotycznie. trzeba by go całkowicie przebudować, albo napisać od początku.
tyle na początek.

Portret użytkownika andrzzbi

Re: Przeróbka programu "Wąż"

Dzięki, za zainteresowanie ,program zaczerpnięty gdzieś z netu, niby działa ale ta regulacja prędkości jest do bani. Kolego matrix,jeśli to nie problem dla Ciebie to możesz podać przykład w Bascom jak przy naciskaniu przycisków zwiększać lub zmniejszać wartość zmiennej, a następnie wpisywać wartość tej zmiennej do timera.

Portret użytkownika matrix

Re: Przeróbka programu "Wąż"

andrzzbi wrote:
Kolego matrix,jeśli to nie problem dla Ciebie to możesz podać przykład w Bascom jak przy naciskaniu przycisków zwiększać lub zmniejszać wartość zmiennej, a następnie wpisywać wartość tej zmiennej do timera.

mówisz i masz jakiś tam gotowy soft. program napisany na szybko, ale kompilator błędów nie wywala więc można wnioskować że będzie działać ok. nie sprawdzałem.

zapomniałem dodać. co ile ma być wywoływane przerwanie? w jakich granicach? bo trzeba odpowiednio dobra timery i podział. w tym przykładzie będzie to mało zauważalne.

'ponizej fuzy dla attiny2313 z wewnetrznym kwarcem 8MHz
 
$PROG &HFF , &HE4 , &HDB , &H00    ' generated. Take care that the chip supports all fuse bytes.
 
$regfile = "Attiny2313.dat"
$crystal = 8000000
$eepleave
$hwstack = 40
$swstack = 16
$framesize = 40
 
'=========================
'=== Rozmiary i zmienne===
'=========================
 
Dim x As byte                      'deklaracja zmiennej wpisywanj do timera
x = 6                              'nadaje wartosc poczatkowa liczbie ladowanej
                                  'do timera, liczba moze byc inna zalezna od tego jaka chcesz miec
 
 
'=========================
'===Konfiguracje portow===
'=========================
 
config pinb.6 = input              'przycisk 1
Config Pinb.7 = Input              'przycisk 2
config timer0 = TIMER , PRESCALE = 64       'konfiguracaj timera
timer0 = x
on timer0 costam                   'jakakolwiek etykieta do realizowania w przerwaniu od timera 0
 
 
p1 alias pinb.6                    'deklaracja dwoch przyciskow
p2 alias pinb.7
 
set p1                             'aliasy owych przyciskow
set p2
 
enable INTERRUPTS                  'zezwolenie na przerwania
enable timer0
 
 
'=============================
'====Petla glowna programu====
'=============================
 
 
do
if p1 = 0 then
  gosub gora
  waitms 150
end if
if p2 = 0 then
  gosub dol
  waitms 150
end if
loop
end
 
 
gora:                              'podprogram zwiekszania wartosci ladowanej do timera
   stop TIMER0
   incr x
 
   'tu trzeba sie zabezpieczyc przed tym zeby nie przepelnic wartosci dla
   'zadeklarowanej zmiennej. w tym przypadku 255
 
   timer0 = x
   start TIMER0
 
return
 
dol:                               'podprogram zmniejszania wartosci ladowanej do timera
   stop TIMER0
   decr x
 
   'tu trzeba sie zabezpieczyc przed tym zeby nie zmniejszyc wartosci dla
   'zadeklarowanej zmiennej ponizej zera
 
   timer0 = x
   start TIMER0
 
return
 
 
costam:                            'etykieta do wykonania podczas przerwania
 
return