Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Sterownik zamka szyfrowego.

Pth 11 Sie 2006 15:59 1571 6
  • #1 11 Sie 2006 15:59
    Pth
    Poziom 26  

    Oddawna zbieram się do zrbobienia zamka szyfrowego otwierającego np drzwi po wpisaniu np 4-cyfrowego kodu.
    Dawno temu zrobiłem już samą klawiaturkę.

    Sterownik postanowiłem zrobić na attiny2313 ponieważ jest tani, ma uart i to jest narazie jedyny mikrokontroler który potrafie obsługiwać.

    Poniżej zamieszczam schemat tego sterownika.
    Bedzie tam gniazdo programujące z lpt takżeby nie tzreba było za kazdym razem wywlekac procesora z podstawki.

    Czy taka aplikacja może być?

    Klawiaturka składa się z 12 przycisków od 0-9 , * , #. Jest tam tez głośniczek i dwukolorowa dioda pokazująca czy zamek jest otwarty czy nie.

    Napisałem już program w bascomie avr ale okazał się za duży do tego procka (ponad 2 Kb)

    Ukłąd ma działac tak że po wpisaniu odpowiedniego kodu otwiera sie tranzystor i na wyjsciu D6 pojawia sie stan wysoki co zmieniastan lamki w klawiaturce. potem np po 10 sec. tranzystor sie wyłacza.

    0 6
  • #2 11 Sie 2006 17:28
    crazy_phisic
    VIP Zasłużony dla elektroda

    Przekaznik powinnien byc właczony w kolektorze tranzystora. Popraw też schemat bo nie wiadomo które linie sa połączone a które nie - brak węzłów.
    Co do programu... to chyba napisałeś system operacyjny skoro takie proste zadania zajęły ci ponad 2k .
    Pozdrawiam

    0
  • #3 11 Sie 2006 19:16
    Pth
    Poziom 26  

    no to w takim razie jakieś propozycje na porgram?

    0
  • #4 11 Sie 2006 20:30
    crazy_phisic
    VIP Zasłużony dla elektroda

    Podaj schemat blokowy programu i jak możesz źródło w pliku, to na pewno coś wspólnie poradzimy ;)

    0
  • #5 20 Sie 2006 20:23
    Pth
    Poziom 26  

    No napisałem program któy zajmuje 97% z 2Kb dostepnego flash'a w attiny2313 :) powinien działać! :)

    Byłbym wdzięczny gdyby ktoś na to spojżał.

    Code:


    ' CODE LOCK
       ' Ports confuguration, konfiguracja portów

          ' B ports, porty B
    Config Portb.0 = Input   ' 1
    Config Portb.1 = Input   ' 2
    Config Portb.2 = Input   ' 3
    Config Portb.3 = Input   ' 4
    Config Portb.4 = Input   ' 5
    Config Portb.5 = Input   ' 6
    Config Portb.6 = Input   ' 7
    Config Portb.7 = Input   ' 8

    Portb.0 = 1              ' 1
    Portb.1 = 1              ' 2
    Portb.2 = 1              ' 3
    Portb.3 = 1              ' 4
    Portb.4 = 1              ' 5
    Portb.5 = 1              ' 6
    Portb.6 = 1              ' 7
    Portb.7 = 1              ' 8

          ' D ports, porty D
    Config Portd.0 = Input   ' 9
    Config Portd.1 = Input   ' *
    Config Portd.2 = Input   ' 0
    Config Portd.3 = Input   ' #
    Config Portd.4 = Output  ' transistor output, wyjście sterujące tranzystorem
    Config Portd.5 = Output  ' speaker output, wyjscie glosnikowe
    Config Portd.6 = Output  ' LED output, wyjscie sterujace LED

    Portd.0 = 1              ' 9
    Portd.1 = 1              ' *
    Portd.2 = 1              ' 0
    Portd.3 = 1              ' #
    Portd.4 = 0              ' transistor output, wyjście sterujące tranzystorem
    Portd.5 = 0              ' speaker output, wyjscie glosnikowe
    Portd.6 = 0              ' LED output, wyjscie sterujace LED

       ' Variables , zmienne
    Dim A As Integer         ' help variable no.1, zmienna pomocnicza nr.1
    Dim B As Byte            ' code digit no., numer cyfr z kodu
    Dim Code As Integer      ' code, kod
    Dim T1 As Integer        ' time 1, czas 1
    Dim T2 As Integer        ' opening time, czas otwarcia zamka

    Begin:

    A = 0
    B = 0
    Code = 1234
    T1 = 25                  ' debounce
    T2 = 4                   ' seconds, sekundy



       ' Main program, glowny program


    Do

       If Pinb.0 = 0 Then    '1
          Waitms T1
         If B = 0 Then A = A + 1000
         If B = 1 Then A = A + 100
         If B = 2 Then A = A + 10
         If B = 3 Then A = A + 1
         P1:
         If Pinb.0 = 0 Then Goto P1
         Incr B
       End If

       If Pinb.1 = 0 Then    '2
          Waitms T1
         If B = 0 Then A = A + 2000
         If B = 1 Then A = A + 200
         If B = 2 Then A = A + 20
         If B = 3 Then A = A + 2
         P2:
         If Pinb.1 = 0 Then Goto P2
         Incr B
       End If

       If Pinb.2 = 0 Then    '3
          Waitms T1
         If B = 0 Then A = A + 3000
         If B = 1 Then A = A + 300
         If B = 2 Then A = A + 30
         If B = 3 Then A = A + 3
         P3:
         If Pinb.2 = 0 Then Goto P3
         Incr B
       End If

       If Pinb.3 = 0 Then    '4
          Waitms T1
         If B = 0 Then A = A + 4000
         If B = 1 Then A = A + 400
         If B = 2 Then A = A + 40
         If B = 3 Then A = A + 4
         P4:
         If Pinb.3 = 0 Then Goto P4
         Incr B
       End If

       If Pinb.4 = 0 Then    '5
          Waitms T1
         If B = 0 Then A = A + 5000
         If B = 1 Then A = A + 500
         If B = 2 Then A = A + 50
         If B = 3 Then A = A + 5
         P5:
         If Pinb.4 = 0 Then Goto P5
         Incr B
       End If

       If Pinb.5 = 0 Then    '6
          Waitms T1
         If B = 0 Then A = A + 6000
         If B = 1 Then A = A + 600
         If B = 2 Then A = A + 60
         If B = 3 Then A = A + 6
         P6:
         If Pinb.5 = 0 Then Goto P6
         Incr B
       End If

       If Pinb.6 = 0 Then    '7
          Waitms T1
         If B = 0 Then A = A + 7000
         If B = 1 Then A = A + 700
         If B = 2 Then A = A + 70
         If B = 3 Then A = A + 7
         P7:
         If Pinb.6 = 0 Then Goto P7
         Incr B
       End If

       If Pinb.7 = 0 Then    '8
          Waitms T1
         If B = 0 Then A = A + 8000
         If B = 1 Then A = A + 800
         If B = 2 Then A = A + 80
         If B = 3 Then A = A + 8
         P8:
         If Pinb.7 = 0 Then Goto P8
         Incr B
       End If

       If Pind.0 = 0 Then    '9
          Waitms T1
         If B = 0 Then A = A + 9000
         If B = 1 Then A = A + 900
         If B = 2 Then A = A + 90
         If B = 3 Then A = A + 9
         P9:
         If Pind.0 = 0 Then Goto P9
         Incr B
       End If

       If Pind.1 = 0 Then    '*
          Waitms T1
         Goto Begin
         P10:
         If Pind.1 = 0 Then Goto P10
         Incr B
       End If

       If Pind.2 = 0 Then    '0
          Waitms T1
         P11:
         If Pind.2 = 0 Then Goto P11
         Incr B
       End If


       If Pind.3 = 0 Then    '#
         Goto Check
       End If
    Loop

    Check:

       If Code = A Then
         Portd.4 = 1
         Portd.6 = 1
         Wait T2
         Portd.4 = 0
         Portd.6 = 0
         Goto Begin
       End If



    End                      ' End program

    0
  • #6 20 Sie 2006 21:10
    crazy_phisic
    VIP Zasłużony dla elektroda

    zamiast if'ów zastosuj select-case, również wszystkie warunki typu: If B = 0 Then A = A + 100
    można załatwić jedna funkcją do której będziesz podawał wartoćś B i aktualną cyfrę a która zwróci wartość A

    0
  • #7 21 Sie 2006 10:59
    Pth
    Poziom 26  

    nie do końca radze sobie jeszcze case'ami... mógłbys mi przeredagowac ten programik?


    postanowiłem jednak jako procesora użyć cos wiekszego i z większa pojemnoscia : mianowicie Atmega8535.
    wybrałem go dlatego, że ma wiecej wejść/wyjść a pozatym chciałem jeszcze zrealizowac obsługe wyświetlacza LCD w tym zamku więc musiałem zmienić mikrokontroler.
    chiałem aby była możliwość zmiany hasła bez użycia komputera etc..c choć w sumie do tgo bede potrzebował obsługi eepomu co jest dla mnie jeszcze nieogarnięte ale jakoś to zrobię :P:P:P

    0