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
Moderatorzy:Jacek Bogusz, robertw, k.pawliczak, Moderatorzy
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ć
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ć
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:
chciałem sprawdzić w ten sposób ale nie chce mi się skompilować, wyskakuje
Edit Pajączek: Prosiłbym jeszcze o używanie
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
Kod: Zaznacz cały
Error : 7 Line : 0 IF THEN expected [ 55] , in File :
Error : 123 Line : 0 END IF expected , in File :
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.
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ą".
- 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ą".
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.
1. używaj TABów
2. instrukcja goto jest nieetyczna i ogólnie bee. Omijaj z daleka
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
2. instrukcja goto jest nieetyczna i ogólnie bee. Omijaj z daleka
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
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 0 gości