Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

program do przełączania

armkon
-
-
Posty: 2
Rejestracja: 21 mar 2010, o 23:38
Lokalizacja: bydgoszcz

program do przełączania

Postautor: armkon » 22 mar 2010, o 00:04

witam mam problem próbuję napisać program który miał by działać w następujący sposób:

za pomocą naciśnięcia przycisku atmega8 lub 16 tworzyła by pętle

przycisk a - uruchamia diodę 1
przycisk b - uruchamia diodę 2
przycisk c - uruchamia diodę 3
przycisk d - uruchamia diodę 4
przycisk e - uruchamia diodę 1 i 4
przycisk f - uruchamia diodę 1 i 2
przycisk g - uruchamia diodę 2 i 3
przycisk h - bypass - wyłączenie całości

dla was to może prościzna ale ja się dopiero zaczynam uczyć :)

Awatar użytkownika
Press
-
-
Posty: 389
Rejestracja: 10 mar 2004, o 16:21
Lokalizacja: Wrocław
Kontaktowanie:

Postautor: Press » 22 mar 2010, o 09:10

No więc najpierw sprawdzasz jaki przycisk został naciśnięty.
Potem to co stwierdzisz wpisujesz do jakiejś zmiennej.
a Potem na podstawie tej zmiennej sterujesz diodami za pomocą funkcji CASE lub IF.

Awatar użytkownika
j_bravo
-
-
Posty: 189
Rejestracja: 14 wrz 2005, o 16:30
Lokalizacja: Lublin
Kontaktowanie:

Postautor: j_bravo » 22 mar 2010, o 09:28

Najpierw konfigurujesz procesor, porty procesora, potem wygaszasz diody, w pętli do-loop dajesz 8 instrukcji if ...
Kombinuj, a w razie problemów wrzuć kod na forum to postaram się pomóc

armkon
-
-
Posty: 2
Rejestracja: 21 mar 2010, o 23:38
Lokalizacja: bydgoszcz

Postautor: armkon » 22 mar 2010, o 10:50

Tak się zakręciłem że szok, chciałem spróbować zrobić to analogicznie jak dla włącznika i wyłącznika diody led, z tym że każde naciśnięcie danego przycisku włącza kolejną diodę a wyłącza pozostałe, ostatni przełącznik wyłącza wszystkie diody:

Kod: Zaznacz cały

$regfile = "m8def.dat" $crystal = 40000000 Config Portb = Output ' port B jako wyjście Config Portd = Input ' port D jako wejście Main: If Pind.0 = 1 Then ' pind.0 jest wzbudzony to portb.0 jest wzbudzony Goto Led0 If Pind.1 = 1 Then ' pind.1 jest wzbudzony to portb.1 jest wzbudzony Goto Led1 If Pind.2 = 1 Then ' pind.2 jest wzbudzony to portb.2 jest wzbudzony Goto Led2 If Pind.3 = 1 Then ' pind.3 jest wzbudzony to portb.3 jest wzbudzony Goto Led3 If Pind.4 = 1 Then ' pind.3 jest wzbudzony to portb.3 jest wzbudzony Goto Led4 End If Goto Main Led0: Portb.0 = 1 Portb.1 = 0 Portb.2 = 0 Portb.3 = 0 Goto Main Led1: Portb.0 = 0 Portb.1 = 1 Portb.2 = 0 Portb.3 = 0 Goto Main Led2: Portb.0 = 0 Portb.1 = 0 Portb.2 = 1 Portb.3 = 0 Goto Main Led3: Portb.0 = 0 Portb.1 = 0 Portb.2 = 0 Portb.3 = 1 Goto Main Led4: Portb.0 = 0 Portb.1 = 0 Portb.2 = 0 Portb.3 = 0 Goto Main End
chciałem sprawdzić w ten sposób ale nie chce mi się skompilować, wyskakuje

Kod: Zaznacz cały

Error : 7 Line : 0 IF THEN expected [ 55] , in File : Error : 123 Line : 0 END IF expected , in File :
Edit Pajączek: Prosiłbym jeszcze o używanie

Kod: Zaznacz cały

przy zamieszczaniu listingów. [/color] Dodano: znalazłem błąd nie zakończyłem end if-ami poszczególnych if-ów jednakże program zamiast przełączać po kliknięciu przełącza gdy poprzedni jest wduszony... a chciałem żeby po naduszeniu przełączał wyjścia bez konieczności przyduszania poprzedniego switcha...
Ostatnio zmieniony 22 mar 2010, o 18:50 przez armkon, łącznie zmieniany 2 razy.

kenaJ
-
-
Posty: 29
Rejestracja: 13 lis 2006, o 22:31
Lokalizacja: Kraków

Postautor: kenaJ » 26 mar 2010, o 22:34

Mam parę wątpliwości;
- taktowanie procesora 40 MHz
- co procesor ma robić, jeżeli żaden przycisk nie jest wciśnięty?
- czy przyciski mają być włączane losowo?
- co z drganiami styków przycisków?

Można to ugryźć tak: stan początkowy - oczekiwanie na naciśnięcie jakiegokolwiek przycisku i diody ciemne, naciskamy przycisk i wszystko rusza a przy naciśnięciu ostatniego wracamy do stanu początkowego.
Z braku zmiennej Twój procesor "nie wie" co ma robić. Wprowadź zmienną, ustaw ją na 0 (zero, stan początkowy), przyciskami zmieniaj jej wartość a w pętli sprawdzaj tą wartość i leć go to do odpowiednich etykiet. Jeżeli nie wciśniesz kolejnego przycisku, zmienna będzie taka sama i nic się nie zmieni, kiedy zaś naciśniesz - nastąpią zmiany. Ostatnim przyciskiem zerujesz zmienną i gasisz diody.

Jeszcze jedno: stan wysoki wyjścia gasi diodę a niski ją zapala, przynajmniej tak ja robiłem.

Pozdrawiam

Jeszcze uwaga: w powyższej postaci przy każdym sprawdzeniu pętli procesor będzie włączał diodę nawet w "starym" układzie (dotychczasową). Gdy dodasz drugą zmienną ustawianą na wartość pierwszej po włączeniu danej diody, można uniknąć niepotrzebnego włączania diody. Identyczne zmienne uniemożliwią przejście do etykiety włączania diody, jeżeli zaś naciśniesz przycisk inny od poprzedniego, zmienne będą różne i wtedy trzeba "lecieć" włączyć "wywołaną" diodę bądź zgasić "poprzednią".

Awatar użytkownika
j_bravo
-
-
Posty: 189
Rejestracja: 14 wrz 2005, o 16:30
Lokalizacja: Lublin
Kontaktowanie:

Postautor: j_bravo » 27 mar 2010, o 08:51

jeśli każde naciśnięcie danego przycisku włącza kolejną diodę a wyłącza pozostałe to program tak działa... przynajmniej w symulatorze.

Kod: Zaznacz cały

$regfile = "m8def.dat" $crystal = 40000000 $sim Config Portb = Output ' port B jako wyjście Config Portd = Input ' port D jako wejście Main: If Pind.0 = 1 Then Goto Led0 ' pind.0 jest wzbudzony to portb.0 jest wzbudzony If Pind.1 = 1 Then Goto Led1 ' pind.1 jest wzbudzony to portb.1 jest wzbudzony If Pind.2 = 1 Then Goto Led2 ' pind.2 jest wzbudzony to portb.2 jest wzbudzony If Pind.3 = 1 Then Goto Led3 ' pind.3 jest wzbudzony to portb.3 jest wzbudzony If Pind.4 = 1 Then Goto Led4 ' pind.3 jest wzbudzony to portb.3 jest wzbudzony Goto Main Led0: Set Portb.0 Reset Portb.1 Reset Portb.2 Reset Portb.3 Goto Main Led1: Reset Portb.0 Set Portb.1 Reset Portb.2 Reset Portb.3 Goto Main Led2: Reset Portb.0 Reset Portb.1 Set Portb.2 Reset Portb.3 Goto Main Led3: Set Portb.0 Reset Portb.1 Reset Portb.2 Set Portb.3 Goto Main Led4: reset Portb.0 Reset Portb.1 Reset Portb.2 Reset Portb.3 Goto Main End
1. używaj TABów
2. instrukcja goto jest nieetyczna i ogólnie bee. Omijaj z daleka

Awatar użytkownika
j_bravo
-
-
Posty: 189
Rejestracja: 14 wrz 2005, o 16:30
Lokalizacja: Lublin
Kontaktowanie:

Postautor: j_bravo » 27 mar 2010, o 09:15

Tu masz programik bez GOTO

Kod: Zaznacz cały

$regfile = "m8def.dat" $crystal = 40000000 $sim Config Portb = Output ' port B jako wyjście Config Portd = Input ' port D jako wejście Config Debounce = 30 Do Debounce Pind.0 , 1 , Led0 ' pind.0 jest wzbudzony to portb.0 jest wzbudzony Debounce Pind.1 , 1 , Led1 ' pind.1 jest wzbudzony to portb.1 jest wzbudzony Debounce Pind.2 , 1 , Led2 ' pind.2 jest wzbudzony to portb.2 jest wzbudzony Debounce Pind.3 , 1 , Led3 ' pind.3 jest wzbudzony to portb.3 jest wzbudzony Debounce Pind.4 , 1 , Led4 ' pind.3 jest wzbudzony to portb.3 jest wzbudzony Loop Led0: Set Portb.0 Reset Portb.1 Reset Portb.2 Reset Portb.3 return Led1: Reset Portb.0 Set Portb.1 Reset Portb.2 Reset Portb.3 Return Led2: Reset Portb.0 Reset Portb.1 Set Portb.2 Reset Portb.3 Return Led3: Set Portb.0 Reset Portb.1 Reset Portb.2 Set Portb.3 Return Led4: Set Portb.0 Reset Portb.1 Reset Portb.2 Reset Portb.3 Return End

Wróć do „Projektowanie PCB, programy EDA, CAD, narzędziowe”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 27 gości