Atmega 32 zwykłe przekaźniki na bistabilne

Masz problem, z którym nie możesz sobie poradzić? Pisz śmiało!
ODPOWIEDZ
lukastob
Młodszy majsterkowicz
Posty: 3
Rejestracja: 30 paź 2014, 13:49

Atmega 32 zwykłe przekaźniki na bistabilne

Post autor: lukastob » 17 mar 2016, 19:45

Założenie projektu jest takie aby atmega zamieniała działanie 15 zwykłych przekaźników na przekaźniki bistabilne. Impuls sterujący ma przełączać wyjście, klasyczny 'toggle switch'. Układ posiada 15 wejść oraz odpowiadające im 15 wyjść. Wyjścia mikrokontrolera sterują układy ULN2003, a te przekaźniki interfejsowe 24VDC. Wejścia natomiast to przyciski dzwonkowe podłączone skrętką, impuls przycisku zwiera wejście do masy.
Jest to część systemu automatyki domowej do sterowania oświetleniem.
Problem polega na tym że przy testowaniu kilku podłączonych przycisków układ ogólnie działa prawidłowo ale czasem zdarzało się że jeden przycisk załączył dodatkowo inne wyjścia. Nie było w tym żadnej zauważalnej regularności i działo się stosunkowo rzadko (na ok 30 min testów zdażyło się może ze dwa razy)

Prosiłbym o sprawdzenie załączonego programu bo na razie to nie wiem czy to problem software czy bardziej hardware.

Kod: Zaznacz cały

//sterownik oświetlnia do domu 15 wejść , 15 wyjść 
//(pierwsze dwa bity portu C zostawionie dla SDA i SCL
//plik pins_arduino.h dla atmega32 w C:\Program Files (x86)\Arduino\hardware\arduino\variants\mega32

//deklaracja wejść i wyjść, numery w tablicach odpowiadają odpowiednim pinom portów w pins_arduino.h
const int wej[15]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14}; 
const int wyj[15]={31,30,29,28,27,26,25,24,23,22,21,20,19,18,15}; 

//deklaracja zmiennych pomocniczych odpowiadających wejściom dla realizacji debouncingu:
unsigned int zmPom[15]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

//funkcja realizujaca przełączania wyjść przez odpowiadające piny wejściowe:
void przelacz_wyjscie(int wej, int wyj, int i){
 
 if (digitalRead(wej) == LOW && zmPom[i]==0) {
    zmPom[i]=64500;   //inicjalizacja dla debounceingu (unsigned int 0 - 65535)
    digitalWrite(wyj, !digitalRead(wyj));
    }
    else {if (zmPom[i] != 0 && digitalRead(wej)==HIGH){
      zmPom[i]++; //opóźnienie na drgania styków
    }
   } 
}

void setup() {
  
  for (int i= 0; i < 15; i++){
   pinMode(wej[i],INPUT_PULLUP); 
  }  
  for (int i= 0; i < 15; i++){
   pinMode(wyj[i],OUTPUT); 
  }
}

//główna pętla:
void loop() {
  for(int i=0;i<15;i++){
  przelacz_wyjscie(wej[i],wyj[i],i);
  }
  
 
}
Ostatnio zmieniony 18 mar 2016, 16:21 przez lukastob, łącznie zmieniany 1 raz.

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


thetox
Młodszy majsterkowicz
Posty: 14
Rejestracja: 16 mar 2016, 09:33

Re: Atmega 32 zwykłe przekaźniki na bistabilne

Post autor: thetox » 18 mar 2016, 08:13

zmPom nie powinna być static?
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Atmega 32 zwykłe przekaźniki na bistabilne

Post autor: stiven » 18 mar 2016, 09:40

Static ma znaczenie dla zmiennych lokalnych, zmPom[] jest zadeklarowane globalnie.
lukastob
Młodszy majsterkowicz
Posty: 3
Rejestracja: 30 paź 2014, 13:49

Re: Atmega 32 zwykłe przekaźniki na bistabilne

Post autor: lukastob » 18 mar 2016, 15:25

Myślę że rodzaj deklaracji zmiennej pomocniczej nie będzie miał aż tak kluczowego znaczenia. Po kolejnych testach zaobserwowałem kolejny ewidentny błąd działania mianowicie po odłączeniu zasilania (rozwieram masę układu) i ponownym włączeniu pierwsze kilka wyjść załącza się losowo w różnych konfiguracjach a czasem pozostają prawidłowo zerami. Czy inicjalizacja pinów jako output jednocześnie je zeruje ?
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Atmega 32 zwykłe przekaźniki na bistabilne

Post autor: stiven » 18 mar 2016, 15:33

W momencie uruchomienia programu ustawiając w setup pin jako wyjście/output może on przyjąć przypadkowy stan, może to być i niski i wysoki. Dlatego żeby mieć pewność, że będzie na pinie na przykład stan niski, to w funkcji setup trzeba dodatkowo go ustawić na danym pinie.
lukastob
Młodszy majsterkowicz
Posty: 3
Rejestracja: 30 paź 2014, 13:49

Re: Atmega 32 zwykłe przekaźniki na bistabilne

Post autor: lukastob » 18 mar 2016, 16:44

Czyli w pętli ustawiającej wyjścia należałoby jeszcze dołożyć :

Kod: Zaznacz cały

digitalWrite(wyj[i], 0);
są może jakieś bardziej eleganckie komendy do ustawiania całych portów ?
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Atmega 32 zwykłe przekaźniki na bistabilne

Post autor: stiven » 18 mar 2016, 16:50

W arduino nie ma, jest tylko digitalWrite() dla pojedynczych pinów.
thetox
Młodszy majsterkowicz
Posty: 14
Rejestracja: 16 mar 2016, 09:33

Re: Atmega 32 zwykłe przekaźniki na bistabilne

Post autor: thetox » 18 mar 2016, 19:10

W arduino działają komendy portów avr. Poczytaj o DDRx, PORTx, PINx
ODPOWIEDZ

Strony partnerskie: