Tester wejsc

To forum jest dla wszystkich pasjonatów wiecznie młodych mikrokontrolerów '51. 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
Arko
-
Posty: 16
Rejestracja: 02 gru 2006, 11:04
Lokalizacja: okolice Kielc
Kontakt:

Tester wejsc

Post autor: Arko » 02 gru 2006, 11:08

Witam.
Chce napisac w Bascomie pewien program na procek 2051. Program ma analizowac stan 4 wejsc i jesli pojawi sie sygnal na wejsciu ma liczyc czas. Powinien reagowac dopiero wtedy,kiedy sygnal z wejscia nie zniknie w ciagu jednej do kilku sekund. Gdy sygnal nie ustepuje ma zapalic leda (4 pilnowane wejscia, 4 ledy), dac jakis sygnal dzwiekowy i wysterowac optotriak.
Resetowanie odbywa sie klawiszem.

Wymyslilem od przerwanie timera1, zalozmy co kilka milisekund, zrobie pomiar czasu. Taki systemowy zegar.Wprowadze kilka zmiennych pomocniczych i uzaleznie ich stan od stanu wejscia badanego i uplytwajacego czasu.

Pytanie moje: moze ktos podobny temat walkowal? i czy jest sprytniejszy sposon niz ten ktory przedstawilem?

Arko

[ Dodano: 2007-01-14, 10:49 ]
moje wypociny, jesli ktos moglby zajrzec i poradzic czy mozna lepiej czy nie..

Kod: Zaznacz cały

'test wejsc
Dim Dzw As Integer
Dim Flagadzwiek As Bit
Dim Miniflaga1 As Bit
Dim Flaga1tmp As Byte
Dim Op25ms As Byte
Dim Op25ms2 As Byte
Dim Op25ms3 As Byte
Dim Czasopuz3 As Byte
Dim Czasopuz2 As Integer
Dim Czasopuz As Integer
Dim Opuzreset As Byte
Config Timer0 = Timer , Gate = Internal , Mode = 1

On Timer0 Timer_0_int       'interrupt routine
Counter0 = 56000      ' co 10ms
Enable Timer0
Enable Interrupts
Start Timer0          'TR0 = 1

Op25ms2 = 0
Czasopuz2 = 0
Op25ms = 0
Czasopuz = 0
Flagadzwiek = 0
Flaga1tmp = 0
P3.2 = 1
P3.0 = 1
P3.7 = 1
P3.5 = 1
P1.0 = 1
P1.1 = 1
P1.2 = 1
Do
Loop

Timer_0_int:          'obsluga przerwania...
Counter0 = 56000
Start Timer0
'111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
If P1.0 = 0 Then      'wejscie 1
Incr Op25ms           'zmienna, sprawdza czy rzeczywiscie nacisniete p1.0
     If Op25ms = 2 Then       '2 * czas wystapienia przerwania
        Op25ms = 0
        If P1.0 = 0 Then
        Incr Czasopuz       'zaczyna mierzyc opuznienie sekundowe
             If Czasopuz = 250 Then       '10=200ms, 250=5sekund
                Czasopuz = 0       
                  If P1.0 = 0 Then       'jesli po uplywie sek we1 aktywne
                  Reset P3.0       'zapala LED_1
                  Set Flagadzwiek
                  End If
             End If
        Else
        Czasopuz = 0
        End If
     End If
Else
Op25ms = 0
Czasopuz = 0
End If
'111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

'RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
If P3.4 = 0 Then      'przycisk RESET
Incr Opuzreset
     If Opuzreset = 2 Then 'czas zwloki 2*czas przerwania eliminuje smieci na wejsciu
        Opuzreset = 0       'bo opuzreset przekroczy wartosc 2 ...
        If P3.4 = 0 Then
        Set P3.0
        Set P3.1
        Set P3.2
        Reset Flagadzwiek
        End If
     End If
End If
'rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr

'DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD 
'Dzwiek dwa piski co 1sekunde!
If Flagadzwiek = 1 Then
Incr Dzw
     If Dzw = 100 Then       '100 co 1 sekunde
     Reset P3.5       'piszczy
     Else
           If Dzw = 110 Then       '110
           Set P3.5   'nie piszczy
           Else
               If Dzw = 120 Then       'czeka 100ms     120
               Reset P3.5       'piszczy przez 100ms
               Else
                  If Dzw = 130 Then       '130
                  Dzw = 0
                  Set P3.5
                  End If
               End If
           End If
     End If
Else
Dzw = 0
Set P3.5
End If
'dddddddddddddddddddddddddddddddddddddddddddddddd

Return

ODPOWIEDZ