Błąd w programie, proszę o pomoc

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
tomson
-
Posty: 29
Rejestracja: 26 lut 2007, 18:02
Kontakt:

Błąd w programie, proszę o pomoc

Post autor: tomson » 01 mar 2007, 20:24

Witam
Postanowiłem zrobić użytek z procesora, aby rozwiązać mój problem z napływającą wodą w piwnicy
Wymyśliłem sobie że w przedpokoju mam mieć Diodę alarmową która będzie mnie informować o zbyt dużym poziomie wody (będzie pulsować) nazwiemy ją B0
Gdy czujnik poziomu D1 poda stan "1" na portd.1 , wtedy dioda B0 miga alarmując mnie o niebezpiecznym poziomie wody, wtedy Ja nacisnę switch (portd.0=0) nazwiemy go D0 który załączy pompę (portb.1=1), oraz zapali diodę D0 na stałe informując mnie że pompa jest załączona


Napisałem odpowiedni program który spełnia w/w wymogi ale znalazłem błąd który może spowodować samoczynne załączenie pompy (portb.1)
Błąd ten polega na tym że gdy w nieodpowiednim momęcie czujnik poda "1" na portd.1 następuje załaczenie portb.0 i portb.1


Kod: Zaznacz cały

      $regfile = "attiny2313.dat"
$crystal = 1000000
'sterownik pompy
Config Portb = Output
Config Portd = Input
Portb = 255
Portd = &B00000011
Dim A As Byte
Do
   If Pind.1 = 0 Then                                       'jeżeli zadziała czujnik D1
Waitms 500
Pulseout Portb.0 , A , 6000                                 ' to ma pulsowac dioda B0 (ALARM)
End If
If Pind.0 = 0 Then                                          'jeżeli nacisnę D0
Waitms 500
Toggle Portb.0                                              'ma zapalić diodę B0 
Toggle Portb.1                                              'oraz włączyć pompę
End If
Loop
End
Ostatnio zmieniony 01 sty 1970, 1:00 przez tomson, łącznie zmieniany 1 raz.

Michał17
Użytkownik
Posty: 329
Rejestracja: 07 sty 2006, 14:25
Lokalizacja: Łódź

Post autor: Michał17 » 02 mar 2007, 17:20

może tu:

Kod: Zaznacz cały

Toggle Portb.0                                              'ma zapalić diodę B0 
Toggle Portb.1                                              'oraz włączyć pompę 
Ostatnio zmieniony 01 sty 1970, 1:00 przez Michał17, łącznie zmieniany 1 raz.

tomson
-
Posty: 29
Rejestracja: 26 lut 2007, 18:02
Kontakt:

Post autor: tomson » 02 mar 2007, 23:47

Może tu może tam, marna pomoc dla kogoś kto dopiero kilka dni siedzi w temacie
Mimo wszystko dzięki za próbę
wywaliłem tamten program i napisałem coś nowego
Mam tylko pytanie jak prawidłowo powinno się zapobiegać "drganiu" styków mikroprzełącznika? chodzi mi oczywiście o programowe zabezpieczenie

Niestety musiałem zrezygnować z sygnalizacji włączenia pompy na tej samej diodzie na której jest sygnalizacja czujnika wody
To chyba niemożliwe skoro nikt nie potrafił mi pomóc

Aktualna wersja programu

Kod: Zaznacz cały

      $regfile = "attiny2313.dat"
$crystal = 1000000
'sterownik pompy
Config Portb = Output    'port B jako wyjścia
Config Portd = Input     'port D  jako wejścia
Config Int0 = Low Level  'wywołanie przerwania poprzez niski poziom
Portb = &B11111111       'wystawiony stan wysoki na wszystkich pinach portu B
Portd = &B11111111       'wystawiony stan wysoki na wszystkich pinach portu D
Czujnik_wody Alias Pind.0       'nadanie nazwy Czujnik_wody pinowi D0
Wlacznik_pompy Alias Pind.3       'nadanie nazwy Włacznik_pompy pinowi D3
Alarm Alias Portb.0      'nadanie nazwy alarm pinowi B1
Pompa Alias Portb.1      'nadanie nazwy pompa pinowi B1
   Dim A As Byte         'definicja zmiennej A
   Dim Czujnik_wody As Byte       'definicja zmiennej Czujnik_wody
   Dim Wlacznik_pompy As Byte       'definicja zmiennej Włącznik_pompy
Enable Interrupts        'właczenie przerwań
Enable Int0              'włączenie przerwania na wejściu INT0
On Int0 Przerwanie       'Jeżeli załączy się włącznik_pompy nastąpi skok do etykiety przerwanie:
Do
   Select Case Czujnik_wody
   Case 0
   Waitms 100 : Pulseout Alarm , A , 5000       'zadziałanie czujnika wody spowoduje pulsowanie diody Alarm
   End Select
Loop
End                      'koniec głównego programu

Przerwanie:              'etykieta podprogramu
Waitms 1000              'tutaj
Toggle Pompa             'i tutaj zostają wykonane instrukcjie spowodowane załączeniem pompy
Return                   'powrót do głównego programu



Ostatnio zmieniony 03 mar 2007, 9:48 przez tomson, łącznie zmieniany 1 raz.

Raflles
-
Posty: 77
Rejestracja: 06 sie 2005, 17:15
Lokalizacja: Tychy
Kontakt:

Post autor: Raflles » 03 mar 2007, 1:45

Są dwa sposoby:
pierwszy to po odczycie pinu dać waitms xx - czyli wartość czasu, najczęściej starczy 20 ms lub 50 ms, drugi sposób to instrukcja "DEBOUNCE".
A co ma temat wspólnego z programem, który umieściłeś to nie mam pojęcia.
Pozdrawiam !!

tomson
-
Posty: 29
Rejestracja: 26 lut 2007, 18:02
Kontakt:

Post autor: tomson » 03 mar 2007, 9:51

Moim zdaniem ma znaczenie bo jeśli ktoś by mnie przy moim pierwszym programie stwierdził że jest on OK to szukałbym błędu w sprzęcie.
I właśnie zjawisko drgania styków mnie naprowadziło żeby przyjrzeć się płytce.

Przyjrzyj się tem programowi i powiedz mi czy podanie przez czujnik_wody stanu "0" może spowodować załączenie wyjścia pompa ????
Moim zdaniem NIE może ponieważ za załączenie pompy odpowiada przerwanie które zostaje uruchomione przez włącznik_pompy.

Niestety gdy zadziałał czujnik_wody załaczała się też pompa.
szukałem błędu w programie ale błąd był w tym, że do przycisków był podłączony też display LED.

Dzięki za info w sprawie przycisków.
Ostatnio zmieniony 01 sty 1970, 1:00 przez tomson, łącznie zmieniany 1 raz.

ODPOWIEDZ