Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Potrzebna pomoc ATTINY2313 prog by BASCOM.

08 May 2007 21:08 1549 8
  • Level 11  
    Mam problem z działaniem układu. Płytkę i program zrobiłem/napisałem sam. Układ to sterownik rolety oparty na mikrokontrolerze ATTINY2313 zaprogramowany w języku BASCOM. Program pisałem w BASCOM AVR. Nie wiem gdzie może kryć się przyczyna od strony programowej czy może sprzętowej. Gotowy jestem dostarczyć kod źródłowy oraz pliki PCB płytki. Na początek zapytuje czy jest ktoś chętny pomóc mi w rozwiązaniu tego problemu? [/b]
  • Level 21  
    Na czym polega Twój problem, bo w swoim poście tego nie napisałeś...
    Ustawiłeś wszystkie fusebity jak należy?
  • Level 11  
    ' D.CH.ELECTRONICS INC
    ' Program sterownika rolety licznikiem jest port EEDR

    Config Portb = &B11111100 ' ustawiam pind.7 i 6 jako wejści dla S1 i S2
    Portb = &B11111111 ' stan spoczynkowy [1]
    Config Portd = &B1111111 ' wszystkie piny portu D jako wyjścia
    Portd = &B1110011 ' stan spoczynkowy [1]

    ' EEDR = 0 automatycznie po podłaczeniu zasilania w porcie jest [0]

    Do 'początek pętli głównej
    Debounce Pinb.7 , 0 , Licznik , Sub 'odkłucenie wejścia licznika impulsów
    Debounce Pinb.6 , 0 , Mikrostyk , Sub 'odkłucenie mikrostyku S1
    Loop
    End

    Licznik: 'pętla licznika

    If Pind.3 = 1 Then 'jesli aktywny portd.3 wtedy
    Incr Eedr 'zacznij zwiękrzać licznik od [0]
    If Eedr = 28 Then 'jeśli licznik przekroczy wartość xxx wtedy
    Portd.3 = 0 'deaktywuj portd.3
    Eedr = 0 'zeruj licznik
    End If
    End If

    If Pind.2 = 1 Then 'jeśli aktywny portd.2 wtedy
    Incr Eedr 'zacznij zwiękrzać licznik od [0]
    If Eedr = 24 Then 'jeśli licznik przekroczy wartość xxx wtedy
    Portd.2 = 0 'deaktywuj portd.3
    Eedr = 0 'zeruj licznik
    End If
    End If


    Return

    Mikrostyk: 'pętla podprogramu mikrostyku
    If Pind.2 = 1 Or Pind.3 = 1 Then 'jesli silnik pracuje (aktywne pinyd 2 lub 3) nic nie rub powruć do głównej petli
    Return
    End If
    Toggle Acsr.0 'odwróć stan portu
    If Acsr.0 = 1 Then Portd.2 = 1
    If Acsr.0 = 0 Then Portd.3 = 1
    Return

    Dodano po 9 [minuty]:

    Tak wygląda kod źródłowy do tego układu. Układ steruje pracą silnika DC pracującego na napięciu 12V. Sterowanie odbywa się poprzez zmianę polaryzacji za pomocą dwóch przekaźników. Przy silniku jest dołączony mikrostyk który zlicza ilość impólsów Układ wzbudzany jest za pomoca jednego mikrostyku. Pierwsze nacisnięcie roleta jedzie w dół (procek liczy określona liczbe impulsów) i zatrzymuje silnik drugie naciśnięcie zmiana polaryzacji na silniku (czyli drugi przekaźnik) i roleta jedzie w górę

    Istota całego problemu polega na tym że czasami roleta po prostu jeździ w nieskończoność tak jakby licznik się wieslił czy jak. Silnik cały czas wtedy pracuje i pomaga tylko odłączenie zasilania bądź reset.
  • Level 34  
    Config Portb = &B11111100 ' ustawiam pind.7 i 6 jako wejści dla S1 i S2

    Tak na pierwszy rzut oka instrukcja konfiguruje pinb.7 i pinb.6 jako wyjścia a pinb.0 i pinb.1 jako wejścia (pozostałe jako wyjścia), a nie jak podano w komentarzu.
    Debounce Pinb.7 , 0 , Licznik , Sub 'odkłucenie wejścia licznika impulsów
    Debounce Pinb.6 , 0 , Mikrostyk , Sub 'odkłucenie mikrostyku S1
    Odczytuje stan rejestru PIN, który wymuszany jest na końcówkach przez stan rejestru PORT, a nie przez S1 i S2 chyba, że stan wysoki na wyjściu na siłę zwierają do masy.
  • Level 11  
    Więc tak:
    PortB.7 - podpięty do licznika impulsów silnika na gołó prosto pod port
    PortB.6 - mikrostyk odkłucony komendą debounce i kondensatorem 100nF
    PortD.2 - przekaźnik 1
    portD.3 - Przekaźnik 2

    To może jeszcze kondensator pod port licznika?
  • Level 34  
    Quote:
    PortB.7 - podpięty do licznika impulsów silnika na gołó prosto pod port
    PortB.6 - mikrostyk odkłucony komendą debounce i kondensatorem 100nF


    Więc powinny to być wejścia, a w programie ustawiłeś te końcówki jako wyjścia!
  • Level 11  
    Jestem bardzo mało doświadczonym programistom stąd te pytania. W moim programie jest tak:
    Config Portb = &B11111100 ' ustawiam pind.7 i 6 jako wejści dla S1 i S2
    Portb = &B11111111 ' stan spoczynkowy [1]

    Czyli z tego co rozumiem powinno być tak
    Config Portb = &B11111111 ' ustawiam pind.7 i 6 jako wejści dla S1 i S2
    Portb = &B11111111 ' stan spoczynkowy [1]

    To powinno rozwiązać problem?

    Dodano po 49 [minuty]:

    OK. Zmieniłem program jak poniżej:
    Config Portb = &B11111111 ' ustawiam pind.7 i 6 jako wejści dla S1 i S2
    Portb = &B11111111 ' stan spoczynkowy [1]
    Config Portd = &B1111111 ' wszystkie piny portu D jako wyjścia
    Portd = &B1110011 ' stan spoczynkowy [1]
    Wykonałem 20 pełnych cykli (1 cykl dół-góra) pracy rolety zakończonych powodzeniem. Jeżeli do tygodnia czasu błąd się nie pojawi to znaczy że winna była ta konfiguracja wejść. Co ciekawe jak ustawiłem tak:
    Config Portb = &B11111111 ' ustawiam pind.7 i 6 jako wejści dla S1 i S2
    Portb = &B11111111 ' stan spoczynkowy [1]
    Config Portd = &B1110011 ' wszystkie piny portu D jako wyjścia
    Portd = &B1110011 ' stan spoczynkowy [1]
    wtedy układ totalnie zwariował i roleta jeździła jak chciała. No ale w wcześniejszej konfiguracji jest jak narazie OK.
  • Level 34  
    Quote:
    Config Portb = &B11111100 ' ustawiam pind.7 i 6 jako wejści dla S1 i S2


    Powinno być tak:

    Config Portb = &B00111111

    Wejście to 0, wyjście to 1. Najmniej znaczący bit ma numer 0, najbardziej znaczący to 7

    00111111
    76543210