Przejścia pomiędzy podprogramami...

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!
ODPOWIEDZ
Awatar użytkownika
matelektronik
Użytkownik
Posty: 161
Rejestracja: 01 sie 2006, 11:48
Lokalizacja: Przezchlebie
Kontakt:

Przejścia pomiędzy podprogramami...

Post autor: matelektronik » 07 kwie 2007, 22:04

Witam

Od pewnego czasu pracuję nad projektem, który ma byc symulatorem stroboskopu. Wszystko ma być zrobione na ATTINY 2313. Układ mam gotowy jednakże przy programowaniu napotkałem problem. Mianowicie, układ ma generować kilka efektów które będa sie zmieniały po naciśnięciu przycisków GÓRA/DÓŁ. Chcialem to zrealizowac za pomocą pomoca instrukcji SELECT...CASE, tj. w zmiennej przechowywana byłaby wartość która byłaby zmieniana poprzez naciskanie przycisków GÓRA/DÓŁ. Wartość zmiennej odczytywałaby procedura SELECT...CASE i wykonywałaby skok do etykiety zawartej w procedurze. Program zrealizowalem wg powyższej wizji. Niestety nie działa :( Może ma ktoś jakiś pomysł ???

Awatar użytkownika
radzio
Użytkownik
Posty: 573
Rejestracja: 07 gru 2004, 23:06
Lokalizacja: Sosnowiec
Kontakt:

Post autor: radzio » 07 kwie 2007, 22:26

Twoja idea nie jest zła, powinno to zadziałać. Bez kodu tego co "nie działa" nikt nie stwiedzi dlaczego "nie działa" i nie sprawi aby "działało". Zamieść więć kod jaki popełniłeś i zobaczymy co tam nie gra.

Awatar użytkownika
matelektronik
Użytkownik
Posty: 161
Rejestracja: 01 sie 2006, 11:48
Lokalizacja: Przezchlebie
Kontakt:

Post autor: matelektronik » 08 kwie 2007, 15:13

Zapodaje soft który ostatnio skodziłem i który niestety nie chce działać :( :

Kod: Zaznacz cały

'oprogramowanie do obslugi stroboskopu

$regfile = "attiny2313.dat"
$crystal = 4000000

Dim Efekt As Byte

Config Portd.3 = Input                                      'S1
Config Portd.4 = Input                                      'S2
Config Portd.5 = Input                                      'S3
Config Portb.3 = Output                                     'D2
Config Portb.4 = Output                                     'D1

Portd = 255                                                 'ustawienie portu B w stan wysoki

S1 Alias Portd.3
S2 Alias Portd.4
S3 Alias Portd.5

Efekt = 0                                                   'wpisz do zmiennej efekt wartosc 0

Do



'procedury obslugi przyciskow

                                                0

   If S3 = 0 Then
   Waitms 25

      If S3 = 0 Then                                        'jesli nacisniety S3 to

         Incr Efekt                                         'zwieksz wartosc zmiennej o 1


   If S2 = 0 Then
   Waitms 25

      If S2 = 0 Then                                        'jesli nacisniety S2 to

         Decr Efekt                                         'zmniejsz wartoc zmiennej o 1

   If Efekt = 3 Then Efekt = 0                              'przepelnienie zmiennej



End If : End If : End If : End If


  Select Case Efekt

   Case 0:                                                  ' jesli wartosc zmiennej efekt = 0 to

   Set Portb.3

   Case 1:                                                  ' jesli wartosc zmiennej efekt = 1 to

   Set Portb.4

   Case 2:                                                  ' jesli wartosc zmiennej efekt = 2 to

   Set Portb.3
   Set Portb.4

  End Select


Loop
End







W oprogramowaniu pokazanym powyżej powinien sie zmieniac po każdej zmianie zmiennej układ zapalonych diod led...

Awatar użytkownika
radzio
Użytkownik
Posty: 573
Rejestracja: 07 gru 2004, 23:06
Lokalizacja: Sosnowiec
Kontakt:

Post autor: radzio » 08 kwie 2007, 19:00

Na pierwszy rzut oka nie podoba mi się to :

Kod: Zaznacz cały

S1 Alias Portd.3 
S2 Alias Portd.4 
S3 Alias Portd.5
Stan linii portów odczytuje sie z rejestru Pin a nie Port. Zmień na Pin i sprawdź czy teraz będzie lepiej.

[ Dodano: 2007-04-08, 20:03 ]
Pozatym w select case ustawiasz wyprowadzenia a nigdzie ich nie zerujesz. Tak więc gdy po efekcie '0' wykona się efekt '1' to da to taki sam skutek jak efekt '2. No a potem juz nic się nie będzie działo bo piny będą już ustawione.
Ostatnio zmieniony 08 kwie 2007, 19:03 przez radzio, łącznie zmieniany 1 raz.

ZbeeGin

Post autor: ZbeeGin » 08 kwie 2007, 19:03

Poprawiony kod

Kod: Zaznacz cały

'oprogramowanie do obslugi stroboskopu
$regfile = "attiny2313.dat"
$crystal = 4000000

Dim Efekt As Byte
Dim Klawisz As Bit

Config Portd.3 = Input                            'S1
Config Portd.4 = Input                            'S2
Config Portd.5 = Input                            'S3
Config Portb.3 = Output                           'D2
Config Portb.4 = Output                           'D1

Portd = 255                                       'ustawienie portu B w stan wysoki

S1 Alias Pind.3                                   '*** wejścia określa się jako PIN nie PORT
S2 Alias Pind.4                                   '*** PORT jest wyjściowy, a PIN jest wejściowy
S3 Alias Pind.5

Efekt = 0                                         'wpisz do zmiennej efekt wartosc 0

Do
'procedury obslugi przyciskow
  Klawisz = 0                                     '*** flaga nacisnięcia klawisza skasowana
  If S3 = 0 Then
    Waitms 25
    If S3 = 0 Then                                'jesli nacisniety S3 to
      Incr Efekt                                  'zwieksz wartosc zmiennej o 1
      If Efekt = 3 Then Efekt = 0                 '*** cykl zapętlimy 0->1->2->0
      Klawisz = 1                                 '*** nacisnal klawisz, konieczna zmiana stanu
    End If
  End If

  If S2 = 0 Then
    Waitms 25
    If S2 = 0 Then                                'jesli nacisniety S2 to
      Decr Efekt                                  'zmniejsz wartoc zmiennej o 1
      If Efekt = 255 Then Efekt = 2               '*** cykl zapętlimy 0->1->2->0
      Klawisz = 1                                 '*** nacisnal klawisz, konieczna zmiana stanu
    End If
  End If

  If Klawisz = 1 Then                             '*** jesli klawisz nacisniety
    Reset Portb.3                                 '*** to wylacz porty
    Reset Portb.4                                 '*** bo nastapi zmiana stanu
  End If

  Select Case Efekt
    Case 0:                                       ' jesli wartosc zmiennej efekt = 0 to
      Set Portb.3
    Case 1:                                       ' jesli wartosc zmiennej efekt = 1 to
      Set Portb.4
    Case 2:                                       ' jesli wartosc zmiennej efekt = 2 to
      Set Portb.3
      Set Portb.4
  End Select
Loop

End
Teraz analiza usterek:

1. S1, S2, S3 mają być wejściami, zatem nie należy definiować ich jako PORT bo układy AVR analizuja stan końcówek bezpośrednio przez rejestr PIN a nie przez rejestr PORT.
2. "Procedury" obsługi klawiszy były połączone w jeden wielki IF. A stan przycisków należałoby tutaj logicznie podzielić na dwa.
3. Przed SELECT...CASE lub w nim samym nie wykonujesz żadnej pełnej aktualizacji stanu portów. Dlatego naciskanie klawisza ustawiało tylko dodatkowo stany wysokie i stąd efekt ustawienia "na stałe" stanu portów.

W kwestii resetowania stanu zastosowałem system flagowy. Przeanalizuj aktualną postać programu (zasymuluj) i najprawdopodobniej dojdziesz do tego jak ten system działa.

Awatar użytkownika
matelektronik
Użytkownik
Posty: 161
Rejestracja: 01 sie 2006, 11:48
Lokalizacja: Przezchlebie
Kontakt:

Post autor: matelektronik » 08 kwie 2007, 22:49

Panowie dziękuje wam serdecznie :) Bardzo mi pomogliście :D Program i układ działają prawidłowo. Jeszcze raz DZIĘKI !!!

ODPOWIEDZ