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
Przejścia pomiędzy podprogramami...
- matelektronik
- Użytkownik
- Posty: 161
- Rejestracja: 01 sie 2006, 11:48
- Lokalizacja: Przezchlebie
- Kontakt:
Przejścia pomiędzy podprogramami...
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ł ???
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
- matelektronik
- Użytkownik
- Posty: 161
- Rejestracja: 01 sie 2006, 11:48
- Lokalizacja: Przezchlebie
- Kontakt:
Zapodaje soft który ostatnio skodziłem i który niestety nie chce działać
:
W oprogramowaniu pokazanym powyżej powinien sie zmieniac po każdej zmianie zmiennej układ zapalonych diod led...
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
Na pierwszy rzut oka nie podoba mi się to :
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.
Kod: Zaznacz cały
S1 Alias Portd.3
S2 Alias Portd.4
S3 Alias Portd.5[ 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
Poprawiony kod
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.
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
End1. 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.
- matelektronik
- Użytkownik
- Posty: 161
- Rejestracja: 01 sie 2006, 11:48
- Lokalizacja: Przezchlebie
- Kontakt: