[BASCOM] Kilka pytań dotyczących BASCOM i procesorów

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
Awatar użytkownika
Kulpina
Użytkownik
Posty: 2037
Rejestracja: 28 lip 2005, 16:57
Lokalizacja: Sanok
Kontakt:

[BASCOM] Kilka pytań dotyczących BASCOM i procesorów

Post autor: Kulpina » 04 kwie 2007, 15:06

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.
Ostatnio zmieniony 10 kwie 2007, 10:12 przez Kulpina, łącznie zmieniany 1 raz.

ZbeeGin

Post autor: ZbeeGin » 04 kwie 2007, 17:05

Kulpina pisze:Czy jest w bascomie polecenie do...loop...until??? bo pokazuje mi błąd gdy dopisze until.
Jest:

Kod: Zaznacz cały

Do
  instrukcja..1 [: instrukcja..2]
  [instrukcja..n]
Loop Until /warunek końcowy/
Możesz także skorzysać z While...Wend.

Awatar użytkownika
Kulpina
Użytkownik
Posty: 2037
Rejestracja: 28 lip 2005, 16:57
Lokalizacja: Sanok
Kontakt:

Post autor: Kulpina » 04 kwie 2007, 18:20

A co może być tym warunkiem koncowym?

shadow82
-
Posty: 7
Rejestracja: 26 mar 2007, 16:53
Kontakt:

Post autor: shadow82 » 04 kwie 2007, 18:25

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

Awatar użytkownika
Kulpina
Użytkownik
Posty: 2037
Rejestracja: 28 lip 2005, 16:57
Lokalizacja: Sanok
Kontakt:

Post autor: Kulpina » 04 kwie 2007, 18:29

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...

shadow82
-
Posty: 7
Rejestracja: 26 mar 2007, 16:53
Kontakt:

Post autor: shadow82 » 04 kwie 2007, 18:36

U mnie w Bascom AVR 1.11.8.1 kompiluje się bez problemu.

Wszystko zależy od tego jak mocno jest zajety procesor. Jeżeli poza zmianą stanu portu ma jeszcze wiele innych zadań, to najlepiej użyć przerwań. W przeciwnym wypadku Waitms z powodzeniem wystarczy.

Awatar użytkownika
Kulpina
Użytkownik
Posty: 2037
Rejestracja: 28 lip 2005, 16:57
Lokalizacja: Sanok
Kontakt:

Post autor: Kulpina » 04 kwie 2007, 18:43

No to, to ma byc program do układu, procesor ma sterować diodami w sumie nic niezwykłego,ale sposób ułożenia diod czyni układ niezwykłym, dlatego układ chyba pojedzie pocztą do redakcji dlatego sie zastanawiam czy używać waitms w takim programie czy "niewypada" :mrgreen:

shadow82
-
Posty: 7
Rejestracja: 26 mar 2007, 16:53
Kontakt:

Post autor: shadow82 » 04 kwie 2007, 18:52

Jak zrobisz na przerwaniach, to będzie "profesjonalniej" wyglądać, no i wyrobisz się bardziej w pracy z obsługą przerwań.

Awatar użytkownika
Kulpina
Użytkownik
Posty: 2037
Rejestracja: 28 lip 2005, 16:57
Lokalizacja: Sanok
Kontakt:

Post autor: Kulpina » 04 kwie 2007, 19:55

No właśnie, ale jak zastosować przerwania. Bo korzystam tu z polecenia gosub ten program co tu wkleiłem to do niego jest przekierowanie z programu głównego przez gosub i nie wiem jak w takim wypadku przerwanie dodać

shadow82
-
Posty: 7
Rejestracja: 26 mar 2007, 16:53
Kontakt:

Post autor: shadow82 » 05 kwie 2007, 0:21

Zadeklaruj jakąś zmienną bajtową, np.:

Kod: Zaznacz cały

Dim FlashIdx As Byte

On Timer1 T1_Int NoSave
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ą.

Kod: 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
W procedurze obsługi przerwania sprawdź licznik kroków i ustaw odpowiednio PortB. Po zakończeniu animacji wyłącz Timer1.

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
Program jest napisany na kwarc 8 MHz (100ms). Jeżeli używasz innego, wystarczy zmienić wartości Timera1 w obsłudze przerwania.

Awatar użytkownika
Kulpina
Użytkownik
Posty: 2037
Rejestracja: 28 lip 2005, 16:57
Lokalizacja: Sanok
Kontakt:

Post autor: Kulpina » 05 kwie 2007, 8:07

To jest bascom? Dobra jakoś pokombinuje z tymi przerwaniami.

A gdzie można kupić pełną wersje BASCOM AVR?? i czy są jakieś promocyjne ceny?

Awatar użytkownika
Tranzystor
Użytkownik
Posty: 889
Rejestracja: 28 sie 2005, 19:19
Lokalizacja: Świętochłowice
Kontakt:

Post autor: Tranzystor » 05 kwie 2007, 9:42

Kupić pełną wersje BASCOM możesz w AVT lub u Marka Albertsa.

shadow82
-
Posty: 7
Rejestracja: 26 mar 2007, 16:53
Kontakt:

Post autor: shadow82 » 05 kwie 2007, 11:08

To jest oczywiście asembler. Jak wkleisz go do bascoma, to nie powinno być żadnych problemów z odpaleniem tego.
Gdybym napisał to w basicu, to z pewnością zajęłoby ci to 2x więcej miejsca.

Awatar użytkownika
Kulpina
Użytkownik
Posty: 2037
Rejestracja: 28 lip 2005, 16:57
Lokalizacja: Sanok
Kontakt:

Post autor: Kulpina » 05 kwie 2007, 11:56

aha a możesz chociaż kilka linijek przerobić na bascoma? Było by mi łatwiej zrozumieć bo z asemblerem nigdy w życiu jeszcze nie miałem do czynienia

shadow82
-
Posty: 7
Rejestracja: 26 mar 2007, 16:53
Kontakt:

Post autor: shadow82 » 05 kwie 2007, 12:20

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

ODPOWIEDZ