[BASCOM] Kilka pytań dotyczących BASCOM i procesorów
[BASCOM] Kilka pytań dotyczących BASCOM i procesorów
Zamieszczam tu fragment programu prostego efektu świetlnego:
Do
Portb = 01111110
Waitms 100
Portb = 10111101
Waitms 100
Portb = 11011011
Waitms 100
Portb = 11100111
Loop
Do PortB będą dołączone diody LED chyba widać zależność pomiędzy kolejnymi zmianami w PortB - od zewnątrz do środka.
Czy jest w bascomie polecenie do...loop...until??? bo pokazuje mi błąd gdy dopisze until.
Do
Portb = 01111110
Waitms 100
Portb = 10111101
Waitms 100
Portb = 11011011
Waitms 100
Portb = 11100111
Loop
Do PortB będą dołączone diody LED chyba widać zależność pomiędzy kolejnymi zmianami w PortB - od zewnątrz do środka.
Czy jest w bascomie polecenie do...loop...until??? bo pokazuje mi błąd gdy dopisze until.
Ostatnio zmieniony 10 kwie 2007, 10:12 przez Kulpina, łącznie zmieniany 1 raz.
-
ZbeeGin
Jest:Kulpina pisze:Czy jest w bascomie polecenie do...loop...until??? bo pokazuje mi błąd gdy dopisze until.
Kod: Zaznacz cały
Do
instrukcja..1 [: instrukcja..2]
[instrukcja..n]
Loop Until /warunek końcowy/Bardzo prosty przykład z helpa
Kod: Zaznacz cały
Dim A As Byte
A = 1 'assign a var
Do 'begin a do..loop
Print A 'print var
Incr A 'increase by one
Loop Until A = 10 'do until a=10
To nie rozumiem... podobnie podawałem w programie i pokazywało mi błędy, ale spróbuje jeszcze raz.
A czy zna ktoś odpowiedź na pierwsze pytanie? Czy nie można by tego waitms zastąpić przerwaniami? Czy wogle ktoś z zaawansowanych programistów stosuje waitms czy to tylko tak dla poczatkujących żeby się pobawili, a żaden poważny elektronik tego nie używa...
A czy zna ktoś odpowiedź na pierwsze pytanie? Czy nie można by tego waitms zastąpić przerwaniami? Czy wogle ktoś z zaawansowanych programistów stosuje waitms czy to tylko tak dla poczatkujących żeby się pobawili, a żaden poważny elektronik tego nie używa...
Zadeklaruj jakąś zmienną bajtową, np.:
Jak przyjdzie czas animacji diod, to ustaw licznik kroków - w tym przypadku 4 (01111110, 10111101, 11011011, 11100111). Następnie skonfiguruj Timer1 i włącz przerwania. Poniższą procedurę musisz wykonać za każdym razem kiedy chcesz wykonać animację diod. Zauważ, że po zainicjowaniu Timera nic więcej nie musisz już robić w petli głównej. Obsługa przerwania "sama" zajmie się sobą.
W procedurze obsługi przerwania sprawdź licznik kroków i ustaw odpowiednio PortB. Po zakończeniu animacji wyłącz Timer1.
Program jest napisany na kwarc 8 MHz (100ms). Jeżeli używasz innego, wystarczy zmienić wartości Timera1 w obsłudze przerwania.
Kod: Zaznacz cały
Dim FlashIdx As Byte
On Timer1 T1_Int NoSaveKod: Zaznacz cały
If Zdarzenie = 1 Then
$asm
ldi r16, 4
sts {FlashIdx}, r16
ldi r16, &HFF
!out TCNT1H, r16
ldi r16, &HFF
!out TCNT1L, r16
in r16, TIMSK
ori r16, &H04
!out TIMSK, r16
sei
in r16, TCCR1B
ori r16, &H03
!out TCCR1B, r16
$end asm
End If
Kod: Zaznacz cały
$asm
T1_Int:
push r16
push r17
in r16, SREG
push r16
lds r16, {FlashIdx}
cpi r16, 4
brne _T01
ldi r17, &B01111110
!out PORTB, r17
rjmp _T04
_T01:
cpi r16, 3
brne _T02
ldi r17, &B10111101
!out PORTB, r17
rjmp _T04
_T02:
cpi r16, 2
brne _T03
ldi r17, &B11011011
!out PORTB, r17
rjmp _T04
_T03:
cpi r16, 1
brne _T04
ldi r17, &B11100111
!out PORTB, r17
_T04:
dec r16
sts {FlashIdx}, r16
brne _T05
in r16, TIMSK
andi r16, &HFB
!out TIMSK, r16
in r16, TCCR1B
andi r16, &HFC
!out TCCR1B, r16
rjmp _T06
_T05:
ldi r16, &HCF
!out TCNT1H, r16
ldi r16, &H2C
!out TCNT1L, r16
_T06:
pop r16
!out SREG, r16
pop r17
pop r16
reti
$end Asm
- Tranzystor
- Użytkownik
- Posty: 889
- Rejestracja: 28 sie 2005, 19:19
- Lokalizacja: Świętochłowice
- Kontakt:
Kod: Zaznacz cały
If Zdarzenie = 1 Then
licznik = 4
timer1 = 65535
enable timer1
enable interrupts
config timer1 = timer, prescale = 64
End If
T1_Int:
select case licznik
1: portb = sekwencja1
2: portb = sekwencja2
3: portb = sekwencja3
4: portb = sekwencja4
end case
If licznik > 0 Then
timer1 = 100 ms
Else
timer off
disable timer1
End If
Decr licznik
Return