strobo led na attiny2313


ktoś da cynk jak zrobić coś takiego na attiny2313 http://www.youtube.com/watch?v=uNpGGLREbBE&feature=related] nie umiem pisać programu




Portret użytkownika mirley

Re: Program

Tutaj nie trzeba nic umieć tylko posłużyć się poleceniem waitms i ustawianiem stanu na porcie procesora, taki masz szkielet programu:

'************* Konfiguracja uC *****************
'***********************************************
$regfile = "attiny2313.dat"
$crystal = 1000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11111111 : Portd = &B11111111
 
Enable Interrupts
'********** Konfiguracja uC Koniec  ************
 
'******************  Nazwy *******************
'***********************************************
'Nazwa Alias Portb.0
'tu sobie możesz zdefiniować nazwy pinów
'*************  Nazwy Koniec  ****************
 
'**************  Petla glowna ******************
'***********************************************
Do
 
Waitms 100               'czeka 100ms
Reset Portb.0            'włacza diodę
Waitms 100               'czeka 100ms
Set Portb.0              'wyłacza diodę
Reset Portb.1            'włacza diodę2
Waitms 100 
Set Portb.1              'wyłacza diodę2
 
Loop
End
'************ Petla glowna Koniec **************

Wszystko co musisz zrobić to napisać polecenia Waitms dające opóźnienie i polecenia Set i reset dany port procesora w pętli głównej Do loop (tak jak w przykładzie wyżej). Diody dołącz przez rezystory ograniczające prąd np 330R między +5V a pin procesora. Możesz sobie wykorzystać wszystkie piny procesora Portb.0 do Portb.7 i jeszcze port d jak Ci braknie. procesor działa na wewnętrznym oscylatorze więc nie trzeba nic do działania tylko podłaczyć zasilanie, zaprogramować i podłaczyć diody

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika rybaczenko

jest ok wszystko zmontowałem

jest ok wszystko zmontowałem wgrałem i świecą dzięki mirley tylko nie wiem o co chodzi ze zdefiniowaniem nazw 'Nazwa Alias Portb.0 to jedno ma zostać bo jak wpisywałem po kolei ze zmiana tylko numeru portu to przy kompilacji wywala błąd ze jest już taki użyty ?? resztę już kumam

-

ROOKIE

Portret użytkownika mirley

Re: Alias

Możesz sobie zdefiniować nazwy pinów żeby nie musieć pamiętać co jest do czego podłączone np:

lampa_przod1 Alias Portb.0
lampa_przod2 Alias Portb.1
lampa_tyl Alias Portb.2

potem zamiast Set Portb.0 możesz sobie napisać Set lampa_przod1 itp.

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika rybaczenko

napisałen to tak i przypomina

napisałen to tak i przypomina to strobo wreszcie narazie tylko dwie diodki

                       '************* Konfiguracja uC *****************
'***********************************************
$regfile = "attiny2313.dat"
$crystal = 1000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11111111 : Portd = &B11111111
 
Enable Interrupts
'********** Konfiguracja uC Koniec  ************
 
'******************  Nazwy *******************
'***********************************************
D1 Pszod Alias Portb.2
D2 Pszod Alias Portb.7
'tu sobie możesz zdefiniować nazwy pinów
'*************  Nazwy Koniec  ****************
 
'**************  Petla glowna ******************
'***********************************************
Do
 
Waitms 100                                                  'czeka 100ms
Reset Portb.2                                               'włacza diodę
Waitms 30                                                   'czeka
Set Portb.2                                                 'wyłacza diodę
Waitms 100
Reset Portb.2                                               'włacza diodę2
Waitms 30
Set Portb.2                                                 'wyłacza diodę
Waitms 100                                                  'czeka 100ms
Reset Portb.7                                               'włacza diodę
Waitms 30                                                   'czeka
Set Portb.7                                                 'wyłacza diodę
Waitms 100
Reset Portb.7                                               'włacza diodę2
Waitms 30
Set Portb.7
'****************** przod koniec ************************
Loop
End
'************ Petla glowna Koniec **************

a i czy mogę dodawać sobie te gwiazdki tak jak jest powyżej np :"przód koniec" żeby się nie pogubić jak więcej będę pisał tego

-

ROOKIE

Portret użytkownika rybaczenko

jeszcze jedno co dopisać aby

jeszcze jedno co dopisać aby migały na określony czas np:1 minute a następnie przeszły na inny rodzaj migania ktory sobie napisze i powróciły do pierwszego migania czy to już wyższa szkoła jazdy?????

-

ROOKIE

Portret użytkownika mirley

Re: Migacz

Generalnie nie jest to problemem jak program jest napisany porzędnie z użyciem sprzętowego timera itp. W twoim przypadku będzie problem bo podałem Ci najprostszy sposób jak można sobie wyobrazić ze zwykłymi opóźnieniami. Można ten problem przeskoczyć każąc procesorowi wykonywać określoną ilość sekwencji jednego migania a potem przejście do innej sekwencji znowu na ileś iteracji.

Możesz to zrobić zamykając w pętlę for twoje instrukcje migania:

dim n as byte
 
do
 
for n = 0 to 100
 
'twoje instrukcje które napisałeś wykonają się 100 razy
next n
 
 
for n = 0 to 100
 
'inne instrukcje
next n
 
loop

na początku deklarujesz zmienna n (dim n as byte) poza pętlą do loop tak jak wyżej

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika rybaczenko

o to chodzi

DZIAŁA heheheh jak to nie wiele potrzeba by człowiek był szczęśliwy wielkie dzięki mirley jesteś wielki

-

ROOKIE

Portret użytkownika rybaczenko

jescze raz?

zauważyłem ze jednak diody mrygaja w sposób po kolei jak jest napisane chciałem aby każdy port wyjścia żył własnym życiem inna częstotliwością migania z tego można zrobić biegnące światło a tego właśnie nie chcę

-

ROOKIE

Portret użytkownika mirley

Re: Migacz

Przecież da się to zrobić w taki sposób jak napisałem, podziel pracę układu na mniejsze odcinki z waitms, np:

Waitms 30                                                
Reset Portb.2                                            
Waitms 30 
Set Portb.2  
Reset Portb.3    
Waitms 30                                                
Reset Portb.2                                             
Waitms 30 
Set Portb.2  
set Portb.3   
Reset Portb.4  
Waitms 30                                                
Reset Portb.2                                             
Waitms 30 
Set Portb.2  
Reset Portb.3    
Waitms 30                                                
Reset Portb.2                                             
Waitms 30 
Set Portb.2  
Reset Portb.3  
Reset Portb.4    

w powyższym fragmencie 3 diody migają każda z inną częstotliwością. Bardziej wygodnie da się to zrobić na timerze ale i tak nie dasz rady uzyskac niezależnego migania każdej z diod, Częstotliwość ustaloną timera możesz sobie tylko podzielić przez ileś

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika matrix

Re: Migacz

jestem autorem -> czegoś takiego <- i częścią programu jest taki oto kod: (prawa autorskie)

strobo:
   incr WARTOSC_STROBO
   stop TIMER0
 
   if rodzaj_strobo = 0 then       'ciagle swiecenie
     wartosc_strobo = 0
     set strobol
     set strobop
   end if
 
   if rodzaj_strobo = 1 then       'na aprzemian po 2x
     select case wartosc_strobo
       case 70:
        set strobop
        reset strobol
       case 100:
        set strobol
       case 170:
        reset strobol
       case 200:
        set strobol
       case 270:
        reset strobop
       case 300:
        set strobop
       case 370:
        reset strobop
       case 400:
        set strobop
        wartosc_strobo = 0
       end select
   end if
 
   if rodzaj_strobo = 2 then       'oba na raz
    select case wartosc_strobo
       case 70:
        reset strobol
        reset strobop
       case 100:
        set strobop
        set strobol
       case 170:
        reset strobol
        reset strobop
       case 200:
        set strobop
        set strobol
       case 270:
        reset strobop
        reset strobol
       case 300:
        set strobol
        set strobop
       case 370:
        reset strobop
        reset strobol
       case 400:
        set strobol
        set strobop
        wartosc_strobo = 0
     end select
   end if
 
   if rodzaj_strobo = 3 then       'fala
    select case wartosc_strobo
       case 70:
        reset strobol
       case 100:
        reset strobop
       case 170:
        set strobol
       case 200:
        set strobop
       case 270:
        reset strobop
       case 300:
       reset strobol
       case 370:
        reset strobop
       case 400:
        set strobol
        set strobop
        wartosc_strobo = 0
     end select
   end if
 
   if rodzaj_strobo = 4 then
     reset strobol
     reset strobop
   end if
 
   if rodzaj_strobo = 5 then
     rodzaj_strobo = 0
     wartosc_strobo = 0
   end if
 
   timer0 = 6
   start TIMER0
 
return

5 rodzajów migania stroboskopów w modelu samochodu zdalnie sterowanego w skali 1:10. podstawą jest umiejętne wykorzystanie timera.

Portret użytkownika demsy1

Dodatkowy przycisk

Chciałem do tego kodu poniżej dołożyć przycisk który sterowałby efektem diód

         '************* Konfiguracja uC *****************
'***********************************************
$regfile = "attiny2313.dat"
$crystal = 1000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11111110 : Portd = &B11111111
 
Enable Interrupts
'********** Konfiguracja uC Koniec  ************
 
'******************  Nazwy *******************
'***********************************************
Lewy Alias Portb.0
Prawy Alias Portb.1
S Alias Portd.0
 
'*************  Nazwy Koniec  ****************
 
'**************  Petla glowna ******************
'***********************************************
Do
 
Waitms 100               'czeka 100ms
Reset Lewy                                                  'włacza diodę
Waitms 100               'czeka 100ms
Set Lewy                                                    'wyłacza diodę
Reset Prawy                                                 'włacza diodę2
Waitms 100
Set Prawy                                                   'wyłacza diodę2
 
Loop
End
'************ Petla glowna Koniec **************

Czyli na początek:

Waitms 100               'czeka 100ms
Reset Lewy               'włacza diodę
Waitms 100               'czeka 100ms
Set Lewy                 'wyłacza diodę
Reset Prawy              'włacza diodę2
Waitms 100 
Set Prawy                'wyłacza diodę2

kolejne kliknięcie:

Waitms 100               'czeka 100ms
Reset Lewy                'włacza diodę
Waitms 100               'czeka 100ms
Set Lewy                 'wyłacza diodę
Waitms 100               'czeka 100ms
Reset Lewy                'włacza diodę
Waitms 100               'czeka 100ms
Set Lewy                 'wyłacza diodę
Waitms 100
Reset Prawy            'włacza diodę2
Waitms 100 
Set Prawy              'wyłacza diodę2
Waitms 100
Reset Prawy            'włacza diodę2
Set Prawy              'wyłacza diodę2
Waitms 100 

itd...

Portret użytkownika mirley

Re: miganie

Napisz program z uzyciem timera inaczej będzie problem z sensownym odczytem klawiszy. Można zrobić zwykłego ifa ale w pierwszym przypadku na reakcję klawisza będzie trzeba czekac tyle ile masz waitów w sumie, czyli 300ms. W drugim przypadku klawisz zareaguje po 800ms albo wczesniej, zależy jak trafisz przyciskiem w działanie programu.

Trzeba zrobić timera z sensownym przerwaniem i odpowiedniego case, który zaświeca diody

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika demsy1

Można to zrobić na attiny 13?

Można to zrobić na attiny 13? i jak napisać program z użyciem timera?

Portret użytkownika matrix

Re: jak napisać program z użyciem timera?

Szablon wygląda następująco:
1. Ustalasz co ile nastąpi przerwanie
2. Dobierasz jakąś zmienną typu WORD która będzie zwiększana w przerwaniu timera
3. Uruchamiasz przerwania
4. W podprogramie przerwań piszesz szereg SELECT CASE zmienna i piszesz co ma się dziać. Jako że zostanie wykonana tylko jedna czynność z danego SELECT CASE to nie trzeba się obawiać dużej ilości procedur w podprogramie przerwania. Ja pisałem w ten sposób programy i nic się nie działo.

Portret użytkownika demsy1

program z użyciem timera

Pomoże mi ktoś poprawić program? SELECT CASE sam dopisze

 '************* Konfiguracja uC *****************
'***********************************************
$regfile = "attiny2313.dat"
$crystal = 1000000
 
Config Portb = &B11111000 : Portb = &B11111111
Config Portd = &B11111111 : Portd = &B11111111
 
Dim Licznik As Byte
Dim Rodzaj As Word
Enable Interrupts : Enable Timer0 : Config Timer0 = Timer , Prescale = 64
 
'********** Konfiguracja uC Koniec  ************
 
'******************  Nazwy *******************
'***********************************************
Lewy Alias Portd. 4
Prawy Alias Portd. 5
S1 Alias Portb. 0
 
 
'*************  Nazwy Koniec  ****************
 
'**************  Petla glowna ******************
'***********************************************
Do
If S1 = 0 Then                                              'ciagle swiecenie
        Licznik = 0
     Set Lewy
     Set Prawy
   End If
 
    If S1 = 1 Then
    Incr Rodzaj                                             'na aprzemian po 2x
     Select Case Rodzaj
       Case 1:
        Set Prawy
        Reset Lewy
       case 100:
        Set Lewy
       Case 2:
        Reset Lewy
       Case 3:
        Set Lewy
       Case 4 :
        Reset Prawy
       Case 50:
        Set Prawy
       Case 6:
        Reset Prawy
       Case 7:
        Set Prawy
        Rodzaj = 0
       end select
   end if
 
 Loop
End
'************ Petla glowna Koniec **************

Portret użytkownika matrix

Re: jak napisać program z użyciem timera?

Powinno być troszkę inaczej. Nie wnikam w ustawienia portów itp. Początek tylko skopiowałem.

'************* Konfiguracja uC *****************
'***********************************************
$regfile = "attiny2313.dat"
$crystal = 1000000
 
Config Portb = &B11111000 : Portb = &B11111111
Config Portd = &B11111111 : Portd = &B11111111
 
Dim Licznik As Byte
Dim Rodzaj As Word
Enable Interrupts : Enable Timer0 : Config Timer0 = Timer , Prescale = 64
 
'********** Konfiguracja uC Koniec  ************
 
'******************  Nazwy *******************
'***********************************************
Lewy Alias Portd. 4
Prawy Alias Portd. 5
S1 Alias Portb. 0
 
set S1
Set Lewy   'taka dyrektywa wyłącza diodę
Set Prawy  'taka dyrektywa wyłącza diodę
 
'*************  Nazwy Koniec  ****************
 
'**************  Petla glowna ******************
'***********************************************
Do
   If S1 = 0 Then
    Incr Rodzaj                                             
     Select Case Rodzaj
 
       ' tu Twoje select case nie ma zbytnio sensu więc tego nie powielam
 
     end select
   end if
 
 Loop
End
'************ Petla glowna Koniec **************

Portret użytkownika demsy1

Co tu jeszcze powinienem

Co tu jeszcze powinienem zmienić?

'************* Konfiguracja uC *****************
'***********************************************
$regfile = "attiny2313.dat"
$crystal = 1000000
 
Config Portb = &B11111110 : Portb = &B11111111
Config Portd = &B11111111 : Portd = &B11111111
 
Dim Licznik As Byte
Dim Rodzaj As Word
Enable Interrupts : Enable Timer0 : Config Timer0 = Timer , Prescale = 64
 
'********** Konfiguracja uC Koniec  ************
 
'******************  Nazwy *******************
'***********************************************
Lewy Alias Portd. 4
Prawy Alias Portd. 5
S1 Alias Portb. 0
 
set S1
Set Lewy   'taka dyrektywa wyłącza diodę
Set Prawy  'taka dyrektywa wyłącza diodę
 
'*************  Nazwy Koniec  ****************
 
'**************  Petla glowna ******************
'***********************************************
Do
 If S1 = 0 Then
    Licznik = 0
      Reset lewy      'wlaczanie obu diod dla swiecenia ciaglego
      reset prawy
 End If
 
   If S1 = 0 Then
    Incr Rodzaj
     Select Case Licznik
         Case 10 :
          Reset Lewy
       Case 20 :
          Set Lewy
       Case 30
          Reset Lewy
       Case 40
          Set Lewy
       Case 50
          Reset Prawy
       Case 60
          Set Prawy
       Case 70
          Reset Prawy
       Case 80
          Set Prawy
        Licznik = 0
 
     end select
   end if
 
 Loop
End
'************ Petla glowna Koniec **************

Portret użytkownika matrix

Re: jak napisać program z użyciem timera?

W ogóle to powinieneś napisać co chcesz osiągnąć? Bo ja nie wiem. Niby na początku napisałeś że chcesz napisać strobo z użyciem timera a zwiększasz wartość zmiennej za pomocą naciskania przycisku?

Portret użytkownika demsy1

Więc tak1. Dwie diody i

Za mało mam doświadczenia co do pisania programów

1. Dwie diody i przycisk
2. Na starcie niech świecą obydwie diody
3. Naciskam przycisk chcę uzyskać efekt stroboskopu policyjnego
4. Naciskam jeszcze raz i mrugają obydwie diody
itd...

Portret użytkownika matrix

Re: jak napisać program z użyciem timera?

To trzeba to zrobić zupełnie inaczej niż myślisz.
Specjalnie nie napiszę Ci gotowca bo niczego się nie nauczysz. Podpowiem tylko i naprowadzę.

on timer1 zmiana  'dajmy na to timer1, bo może być timer0, obojętnie
 
set dioda1
set dioda2    'wyłączam obie diody
wlacz_wylacz = 0
 
enable interrupts
enable timer1
start timer1
 
do
  if S1 = 0 then
    waitms 150
     incr wlacz_wylacz
  end if
  if wlacz_wylacz = 0 then   'włączam na stałe diody
    disable timer1
    reset dioda1
    reset dioda2
  end if
  if wlacz_wylacz = 1 then enable timer1
  if wlacz_wylacz = 2 then
     disable timer1
     gosub migacz
  end if
  if wlacz_wylacz = 3 then wlacz_wylacz = 0
loop
end
 
 
zmiana:
  incr rodzaj
    select case rodzaj
 
       'tu wstawiasz case do wykonania
 
    end select
 if rodzaj = 'jakaś liczba  then
    rodzaj = 0
 end if
return
 
'*************************************************
'*** tu będzie bardzo nieładnie bo użyłem wait ***
'*** ale nie chciało mi się myśleć ***************
'*************************************************
 
migacz:
   toggle dioda1
   toggle dioda2
 waitms 250
return

Wystarczy że w select case wstawisz odpowiednie ustawiania stanów na pinach i będziesz miał strobo jak ta lala.

Portret użytkownika demsy1

Coś jest nie tak bo mam

Coś jest nie tak bo mam błąd

'************* Konfiguracja uC *****************
'***********************************************
$regfile = "attiny2313.dat"
$crystal = 1000000
 
Config Portb = &B11111110 : Portb = &B11111111
Config Portd = &B11111111 : Portd = &B11111111
 
 
Dim Wlacz_wylacz As Word
Dim Rodzaj As Byte
Dim Migacz As Word                                          '********** Konfiguracja uC Koniec  ************
 
'******************  Nazwy *******************
'***********************************************
Dioda1 Alias Portd. 4
Dioda2 Alias Portd. 5
S1 Alias Portb. 0
 
                                                 'taka dyrektywa wyłącza diodę
 
'*************  Nazwy Koniec  ****************
 
'**************  Petla glowna ******************
'***********************************************n timer1 zmiana  'dajmy na to timer1, bo może być timer0, obojętnie
On Timer1 Zmiana
 
wlacz_wylacz = 0
 
enable interrupts
enable timer1
start timer1
 
do
  if S1 = 0 then
    waitms 150
     incr wlacz_wylacz
  end if
  if wlacz_wylacz = 0 then   'włączam na stałe diody
    disable timer1
    reset dioda1
    reset dioda2
  end if
  if wlacz_wylacz = 1 then enable timer1
  if wlacz_wylacz = 2 then
     disable timer1
     gosub migacz
  end if
  if wlacz_wylacz = 3 then wlacz_wylacz = 0
loop
end
 
 
zmiana:
  incr rodzaj
    select case rodzaj
 
       Case 10 :
          Reset Dioda1
       Case 20 :
          Set Dioda1
       Case 30
          Reset Dioda1
       Case 40
          Set Dioda1
       Case 50
          Reset Dioda2
       Case 60
          Set Dioda2
       Case 70
          Reset Dioda2
       Case 80
          Set Dioda2                                        'tu wstawiasz case do wykonania
 
    end select
 If Rodzaj = 1
  Then Rodzaj = 0
 end if
return
 
'*************************************************
'*** tu będzie bardzo nieładnie bo użyłem wait ***
'*** ale nie chciało mi się myśleć ***************
'*************************************************
 
migacz:
   toggle dioda1
   toggle dioda2
 waitms 250
return

Portret użytkownika matrix

Re: błąd

Gdzie masz błąd i jaki? Program pisałem z głowy na sucho więc błąd mógł się wedrzeć. Nawet nie sprawdzałem programu. Nie mam na to czasu.
Zmienna wlacz_wylacz nie jako word a jako byte, a migacz nie deklarujesz bo to podprogram a nie zmienna.

Portret użytkownika demsy1

już poprawiłem końcówka

już poprawiłem
końcówka programu

    end select
 If Rodzaj = 1    'tu jest błąd
  Then Rodzaj = 0   ' tu też jest błąd
 end if
return
 
'*************************************************
'*** tu będzie bardzo nieładnie bo użyłem wait ***
'*** ale nie chciało mi się myśleć ***************
'*************************************************
 
migacz:
   toggle dioda1
   toggle dioda2
 waitms 250
return

Portret użytkownika matrix

Re: Błąd

Bo musisz napisać:

If Rodzaj = 1 Then Rodzaj = 0

a nie

If Rodzaj = 1    'tu jest błąd
  Then Rodzaj = 0   ' tu też jest błąd

Jeśli napiszesz warunek If...Then w jednej linii to nie musisz pisać end if.

Portret użytkownika demsy1

migacz: toggle dioda1 '

migacz:
   toggle dioda1  ' tu jeszcze jest błąd
   toggle dioda2  ' tu też
 waitms 250
return

Portret użytkownika matrix

Re: Błąd

Nie wiem, ciężko mi się myśli. Pomyśl troszkę. Może zmień jakieś deklaracje? Bascom jest o tyle dziwny że nie zawsze błąd jest w linii na którą wskazuje kompilator.

Portret użytkownika demsy1

Kolega może spróbuje sobie

Kolega może spróbuje sobie przypomnieć jak budował swój stroboskop do modelu samochodowego to może się przypomni co jest nie tak.

strobo:
   incr WARTOSC_STROBO
   stop TIMER0
 
   if rodzaj_strobo = 0 then       'ciagle swiecenie
     wartosc_strobo = 0
     set strobol
     set strobop
   end if
 
   if rodzaj_strobo = 1 then       'na aprzemian po 2x
     select case wartosc_strobo
       case 70:
        set strobop
        reset strobol
       case 100:
        set strobol
       case 170:
        reset strobol
       case 200:
        set strobol
       case 270:
        reset strobop
       case 300:
        set strobop
       case 370:
        reset strobop
       case 400:
        set strobop
        wartosc_strobo = 0
       end select
   end if
 
   if rodzaj_strobo = 2 then       'oba na raz
    select case wartosc_strobo
       case 70:
        reset strobol
        reset strobop
       case 100:
        set strobop
        set strobol
       case 170:
        reset strobol
        reset strobop
       case 200:
        set strobop
        set strobol
       case 270:
        reset strobop
        reset strobol
       case 300:
        set strobol
        set strobop
       case 370:
        reset strobop
        reset strobol
       case 400:
        set strobol
        set strobop
        wartosc_strobo = 0
     end select
   end if
 
   if rodzaj_strobo = 3 then       'fala
    select case wartosc_strobo
       case 70:
        reset strobol
       case 100:
        reset strobop
       case 170:
        set strobol
       case 200:
        set strobop
       case 270:
        reset strobop
       case 300:
       reset strobol
       case 370:
        reset strobop
       case 400:
        set strobol
        set strobop
        wartosc_strobo = 0
     end select
   end if
 
   if rodzaj_strobo = 4 then
     reset strobol
     reset strobop
   end if
 
   if rodzaj_strobo = 5 then
     rodzaj_strobo = 0
     wartosc_strobo = 0
   end if
 
   timer0 = 6
   start TIMER0
 
return

Portret użytkownika matrix

Re: Błąd

Napisałem wiele różnych softów do modelu, natomiast u mnie każdy działa jak zakładałem i jak przedstawione w załączonym kodzie.
U mnie zmienna rodzaj_strobo zmieniana była przyciskiem a zmienna wartosc_strobo odliczana z timera i wszystko działało i działa jak należy.

Portret użytkownika demsy1

może łatwiej będzie napisać

może łatwiej będzie napisać kod jeśli np zastosujemy 3 przyciski i naciśniecie pierwszego zapali na stałe obydwie diody, drugi włączy stroboskop policyjne, a trzeci błysk obydwu diod na raz

Portret użytkownika matrix

Re: Strobo

Eeee, nie trzeba tak kombinować. Jedna zmienna jako byte którą zmieniasz za pomocą przycisku i na jej podstawie zmieniasz resztę czyli świecenie stroboskopów.

do
 if S1 = 0 then incr zmienna
 
'***********************************************************************
'*** tu jest zmienna potrzebna do zmiany rodzaju wyswietlania strobo ***
'***********************************************************************
 
If zmienna = 0 then   'zapalome obie diody
  disable timer1
  set dioda1
  set dioda2
end if
if zmienna = 1 then
  disable timer1
  reset dioda1
  reset dioda2
end if
if zmienna = 3 then enable timer1
if zmienna >= 4 then zmienna = 0
 
loop
end
 
 
przerwanie_od_timera:
  incr wartosc_strobo
   select case wartosc_strobo
    case 0:   'co jaki case dajesz w zaleznosci jak masz ustawiony timer
      reset dioda1
      set dioda2
    case 10:
      set dioda1
      reset dioda2
   end select
return

Portret użytkownika demsy1

Coś takiego?

'************* Konfiguracja uC *****************
'***********************************************
$regfile = "attiny2313.dat"
$crystal = 1000000
 
Config Portb = &B11111110 : Portb = &B11111111
Config Portd = &B11111111 : Portd = &B11111111
 
 
Dim Wlacz_wylacz As Word
Dim Rodzaj As Byte
Dim Zmienna As Byte
'********** Konfiguracja uC Koniec  ************
 
'******************  Nazwy *******************
'***********************************************
Dioda1 Alias Portd. 4
Dioda2 Alias Portd. 5
S1 Alias Portb. 0
 
                                                 'taka dyrektywa wyłącza diodę
 
'*************  Nazwy Koniec  ****************
 
'**************  Petla glowna ******************
'***********************************************n timer1 zmiana  'dajmy na to timer1, bo może być timer0, obojętnie
On Timer0 Zmiana
 
Wlacz_wylacz = 0
 
Enable Interrupts
Enable Timer0
Start Timer0
 
Do
 If S1 = 0 Then  incr zmienna
 
 
'***********************************************************************
'*** tu jest zmienna potrzebna do zmiany rodzaju wyswietlania strobo ***
'***********************************************************************
 
If zmienna = 0 then   'zapalome obie diody
  Disable Timer0
  set dioda1
  set dioda2
end if
if zmienna = 1 then
  Disable Timer0
  reset dioda1
  reset dioda2
end if
If Zmienna = 3 Then Enable Timer0
if zmienna >= 4 then zmienna = 0
 
loop
end
 
 
Przerwanie_od_timera:
  Incr Rodzaj
   Select Case Rodzaj
    case 0:   'co jaki case dajesz w zaleznosci jak masz ustawiony timer
      reset dioda1
      set dioda2
    case 10:
      set dioda1
      reset dioda2
   end select
Return                                         ' error: Label not found [zmiana]

Portret użytkownika matrix

Re: Jak napisać program z użyciem timera?

Błąd masz tutaj:

 
On Timer0 Zmiana

Powinno być:
On Timer0 Przerwanie_od_timera

Błąd wywala bo nie masz etykiety Zmiana tylko jest atykieta Przerwanie_od_timera.

W pętli głównej po:

Do
 If S1 = 0 Then  incr zmienna

daj choćby małego waitms bo procesor sprawdzi Ci stan danego pinu setki razy i tyle samo razy zmieni Ci wartość zmiennej o nazwie Zmienna

A do tego skonfiguruj timer0 obliczając co ile ma nastąpić przerwanie, czy to ma być timer czy counter, itd.
Diody zaświeca się dając na pin procka reset czyli stan niski a gasi się podając na pin procesora set czyli stan wysoki. W mikroprocesorach najczęściej steruje się od strony masy, że tak powiem.