Forum elektroda.pl

Regulamin  | Punkty  | Dodaj...  | Ostatnie  | Szukaj  | Rejestracja  | Zaloguj

Ta strona używa cookie. Dowiedz się więcej o celu ich używania i zmianie ustawień cookie w przeglądarce.
Korzystając ze strony wyrażasz zgodę na używanie cookie, zgodnie z aktualnymi ustawieniami przeglądarki.

[ATmega8][Bascom] - AVT5341 sterownik bramy - 2 skrzydła


Napisz nowy temat  Odpowiedz do tematu      Strona Główna -> Forum elektroda.pl -> Mikrokontrolery Ogólne -> Mikrokontrolery AVR -> [ATmega8][Bascom] - AVT5341 sterownik bramy - 2 skrzydła
Autor
Wiadomość
haz000
Poziom 2
Poziom 2


Dołączył: 28 Lis 2012
Posty: 2

Post#1 Post autora tematu 28 Lis 2012 18:28   

[ATmega8][Bascom] - AVT5341 sterownik bramy - 2 skrzydła


Witam.

Mam prośbę do kogoś kto zna Bascom'a lub przerabiał program z kitu AVT5341 do współpracy z drugim skrzydłem bramy.
Nie znam się na programowaniu a potrzebuję zmodyfikowaną wersję wsadu do procesora.
Wg autora:
Cytat:
Modyfikacje
programu ograniczą się do:
– zmiany konfiguracji pinów PC0…PC2 z wyjść na wejścia A/C;
– nadania pinom PD2 i PD3 poziomu niskiego zamiast wysokiego,
– dodaniu zmiennych, analogicznych do istniejących,
– zrealizowaniu obsługi dodatkowych dwóch przekaźników,
– dodaniu odpowiednich opóźnień, zgodnie z potrzebami.


...no i problem polega na tym zrealizowaniu obsługi dodatkowych przekaźników.
Dodatkową modyfikacją jakiej potrzebuje to żeby 1 skrzydło działało niezależnie od drugiego,
czyli zabezpieczenie przeciążeniowe pierwszego nie wyłączało drugiego.
Po prostu nie mam krańcówek i wyłączanie silników chce wykonać za
pomocą tego zabezpieczenia przeciwprzeciążeniowego.

A to kod programu:
Kod Basic4GL - [rozwiń]
$regfile = "m8def.dat" 'korzystamy z AMTEGA8
$crystal = 1000000 'taktowanie wewnętrznym oscylatorem 1MHz
Config Pinb.6 = Input 'otwieranie bramy
Config Pinb.7 = Input 'zamykanie bramy
Config Pind.0 = Output 'przekaźnik PK1
Config Pind.1 = Output 'przekaźnik PK2
Config Pinb.0 = Output 'przekaźnik PK3
 
Config Pinc.0 = Output 'ustawienie nieużywanych pinów jako wyjścia
Config Pinc.1 = Output
Config Pinc.2 = Output
Config Pind.2 = Output
Config Pind.3 = Output
Config Pind.4 = Output
Config Pind.5 = Output
Config Pind.6 = Output
Config Pind.7 = Output
Config Pinb.1 = Output
Config Pinb.2 = Output
'
Config Adc = Single , Prescaler = Auto , Reference = Avcc 'konfiguracja wewnętrznego przetwornika A/c
Start Adc 'uruchomienie wewnętrznego przetwornika A/C
 
Reset Portd.0 'wyłączenie PK1
Reset Portd.1 'wyłączenie PK2
Reset Portb.0 'wyłączenie PK3
Set Portb.6 'włączenie wewnętrznych rezystorów podciągających
Set Portb.7
Set Portc.0
Set Portc.1
Set Portc.2
Set Portd.2
Set Portd.3
Set Portd.4
Set Portd.5
Set Portd.6
Set Portd.7
Set Portb.1
Set Portb.2
 
Dim Rez As Integer 'napięcie z rezystora R8
Dim Pot_min As Integer 'napięcie z potencjometru P1
Dim Pot_max As Integer 'napięcie z potencjometru P2
Dim Otw As Bit 'flaga otwierania
Dim Zam As Bit 'flaga zamykania
Dim Czas As Integer 'zmienna odliczająca czas do samozamknięcia
Dim Czas_pom As Bit 'flaga uaktywniająca odliczanie do samozamknięcia
 
Reset Otw 'wygaszenie flag
Reset Zam
Reset Czas_pom
Do 'początek nieskończonej pętli
Rez = Getadc(5) 'przechwycenie wartości napięć na wejściach ADC
Pot_max = Getadc(4)
Pot_min = Getadc(3)
 
If Rez >= Pot_max Then 'wykrywanie przeciążenia
Reset Portd.0 'wyłączenie silnika
Reset Portd.1
Waitms 100
Reset Portb.0 'wyłączenie zasilacza
Reset Otw 'wygaszenie flag otwierania/zamykania
Reset Zam
End If
 
If Rez <= Pot_min Then 'wykrywanie zakończenia pracy siłownika
Reset Portd.0 'wyłączenie silnika
Reset Portd.1
Waitms 100
Reset Portb.0 'wyłączenie zasilacza
Reset Otw 'wygaszenie flag otwierania/zamykania
Reset Zam
End If
 
Debounce Pinb.6 , 0 , Otw , Sub 'sprawdzenie stanu wejść z modułu radiowego
Debounce Pinb.7 , 0 , Zam , Sub 'jeżeli stan niski -> przeskocz
 
If Otw = 1 And Czas_pom = 0 Then 'po otwarciu uaktywniamy odliczanie do zamknięcia
Set Czas_pom
End If
 
If Czas_pom = 1 Then 'jeżeli flaga autozamykania jest aktywna,
Czas = Czas + 1 'z kadym obiegiem pętli dodajemy 1
End If
 
If Czas_pom = 1 And Czas >= 2500 Then 'po upływie czasu (kilku minut) uruchamiamy zamykanie
Czas_pom = 0
Czas = 0
Reset Zam 'ustawienie odpowiednich flag
Set Otw
Waitms 100
End If
 
If Otw = 0 And Zam = 0 Then
Reset Portd.0 'jeżeli zmienne są wyzerowane
Reset Portd.1 'pozostań w tym stanie
Reset Portb.0 'tj. silnik i zasilacz wyłączone
End If
 
If Otw = 1 And Zam = 0 Then 'jeżeli aktywne jest otwieranie bramy
Set Portb.0 'uruchom zasilacz
Waitms 100
Reset Portd.0 'włącz tylko PK2
Set Portd.1
End If
 
If Otw = 0 And Zam = 1 Then 'jeżeli aktywne jest zamykanie bramy
Set Portb.0 'uruchom zasilacz
Waitms 100
Set Portd.0 'włącz tylko PK1
Reset Portd.1
End If
 
If Otw = 1 And Zam = 1 Then 'jeżeli wystąpi taka sytuacja
Reset Portd.0 'wyłącz wszystko i wygaś flagi
Reset Portd.1
Reset Portb.0
Reset Otw
Reset Zam
Waitms 100
End If
 
Waitms 50 'opóźnienie główne
Loop
End 'koniec programu
 
Otw: 'po ururomieniu otwierania
Toggle Otw 'zmień stan flagi Otw na przeciwny
Waitms 100
Return
 
Zam: 'po uruchomieniu zamykania
Reset Czas_pom 'bezwarunkowo wygaś flagę autozamykania
Toggle Zam 'zmień stan flagi Zam na przeciwny
Waitms 100
Return

Powrót do góry
   
Freddy
Poziom 25
Poziom 25


Dołączył: 18 Lut 2003
Posty: 6168
Miasto: Kraków

Post#2 28 Lis 2012 20:23   

Re: [ATmega8][Bascom] - AVT5341 sterownik bramy - 2 skrzydła


haz000 napisał:
Witam.

Mam prośbę do kogoś kto zna Bascom'a lub przerabiał program z kitu AVT5341 do współpracy z drugim skrzydłem bramy.
Nie znam się na programowaniu a potrzebuję zmodyfikowaną wersję wsadu do procesora.
Wg autora:
Cytat:
Modyfikacje
programu ograniczą się do:
– zmiany konfiguracji pinów PC0…PC2 z wyjść na wejścia A/C;
– nadania pinom PD2 i PD3 poziomu niskiego zamiast wysokiego,
– dodaniu zmiennych, analogicznych do istniejących,
– zrealizowaniu obsługi dodatkowych dwóch przekaźników,
– dodaniu odpowiednich opóźnień, zgodnie z potrzebami.


...no i problem polega na tym zrealizowaniu obsługi dodatkowych przekaźników.
Dodatkową modyfikacją jakiej potrzebuje to żeby 1 skrzydło działało niezależnie od drugiego,
czyli zabezpieczenie przeciążeniowe pierwszego nie wyłączało drugiego.
Po prostu nie mam krańcówek i wyłączanie silników chce wykonać za
pomocą tego zabezpieczenia przeciwprzeciążeniowego.
...


Widać od razu Twoje lenistwo w tej kwestii.
Nie chciało Ci sie nawet przeczytać opisu kitu i liczysz na gotowca.
Autor wyraźnie napisał do czego i w jakich sytuacjach potrzebne są modyfikacje. !

Zaproponuj zmiany, a my Cie naprowadzimy i pomożemy usunąć błędy. Tutaj gotowców nie dostaniesz.
Powrót do góry
   
krd1
Poziom 2
Poziom 2


Dołączył: 17 Lut 2007
Posty: 3
Miasto: białystok

Post#3 05 Gru 2012 23:38   

Re: [ATmega8][Bascom] - AVT5341 sterownik bramy - 2 skrzydła


Może tak będzie dobrze:
Kod Basic4GL - [rozwiń]
$regfile = "m8def.dat" 'korzystamy z AMTEGA8
$crystal = 1000000 'taktowanie wewnętrznym oscylatorem 1MHz
Config Pinb.6 = Input 'otwieranie bramy
Config Pinb.7 = Input 'zamykanie bramy
Config Pind.0 = Output 'przeka?nik PK1 zamykanie
Config Pind.1 = Output 'przeka?nik PK2 otwieranie
Config Pinb.0 = Output 'przeka?nik PK3
Config Pind.2 = Output 'przekaznik Pk1 bis zamykanie
Config Pind.3 = Output 'przekaznik Pk2 bis otwieranie
 
Config Pinc.0 = Output 'ustawienie nieużywanych pinów jako wyj?cia
Config Pinc.1 = Output
Config Pinc.2 = Output
Config Pind.4 = Output
Config Pind.5 = Output
Config Pind.6 = Output
Config Pind.7 = Output
Config Pinb.1 = Output
Config Pinb.2 = Output
'
Config Adc = Single , Prescaler = Auto , Reference = Avcc 'konfiguracja wewnętrznego przetwornika A/c
 
Reset Portd.0 'wyłšczenie PK1
Reset Portd.1 'wyłšczenie PK2
Reset Portb.0 'wyłšczenie PK3
Reset Portd.2 'wyłączenie Pk1 bis
Reset Portd.3 'wyłączenie Pk2 bis
Set Portb.6 'włšczenie wewnętrznych rezystorów podcišgajšcych
Set Portb.7
Set Portc.0
Set Portc.1
Set Portc.2
Set Portd.4
Set Portd.5
Set Portd.6
Set Portd.7
Set Portb.1
Set Portb.2
 
Dim Rezl As Integer 'napięcie z rezystora R8
Dim Rezp As Integer 'napięcie z rezystora R3
Dim Pot_minl As Integer 'napięcie z potencjometru P1
Dim Pot_maxl As Integer 'napięcie z potencjometru P2
Dim Pot_minp As Integer 'napięcie z potencjometru P1 bis
Dim Pot_maxp As Integer 'napięcie z potencjometru P2 bis
Dim Otw As Bit 'flaga otwierania
Dim Zam As Bit 'flaga zamykania
Dim Czas As Integer 'zmienna odliczajšca czas do samozamknięcia
Dim Czas_pom As Bit 'flaga uaktywniajšca odliczanie do samozamknięcia
 
Reset Otw 'wygaszenie flag
Reset Zam
Reset Czas_pom
Do 'poczštek nieskończonej pętli
Rezl = Getadc(5) 'przechwycenie warto?ci napięć na wej?ciach ADC
Rezp = Getadc(0)
Pot_maxl = Getadc(4)
Pot_minl = Getadc(3)
Pot_maxp = Getadc(2)
Pot_minp = Getadc(1)
If Otw = 1 And Zam = 1 Then
Waitms 500
Start Adc 'uruchomienie wewnętrznego przetwornika A/C
End If
If Otw = 0 And Zam = 0 Then Stop Adc
If Rezl >= Pot_maxl Then 'wykrywanie przecišżenia lewej
Reset Portd.0 'wyłšczenie silnika lewej
Reset Portd.1
If Rezp >= Pot_maxp Then 'wykrywanie przeciążenia prawej
Reset Portd.2 'wyłączenie silnika prawej
Reset Portd.3
If Rezl >= Pot_maxl And Rezp >= Pot_maxp Then
Waitms 100
Reset Portb.0 'wyłšczenie zasilacza
Reset Otw 'wygaszenie flag otwierania/zamykania
Reset Zam
End If
End If
 
If Rezl <= Pot_minl Then 'wykrywanie zakończenia pracy siłownika lewej
Reset Portd.0 'wyłšczenie silnika lewej
Reset Portd.1
If Rezp <= Pot_minp Then 'wykrywanie zakończenia pracy siłownika prawej
Reset Portd.2 'wyłączenie silnika prawej
Reset Portd.3
If Rezl <= Pot_minl And Rezp <= Pot_minp Then
Waitms 100
Reset Portb.0 'wyłšczenie zasilacza
Reset Otw 'wygaszenie flag otwierania/zamykania
Reset Zam
End If
End If
 
Debounce Pinb.6 , 0 , Otw , Sub 'sprawdzenie stanu wej?ć z modułu radiowego
Debounce Pinb.7 , 0 , Zam , Sub 'jeżeli stan niski -> przeskocz
 
If Otw = 1 And Otw = 1 And Czas_pom = 0 Then 'po otwarciu uaktywniamy odliczanie do zamknięcia
Set Czas_pom
End If
End If
 
If Czas_pom = 1 Then 'jeżeli flaga autozamykania jest aktywna,
Czas = Czas + 1 'z kadym obiegiem pętli dodajemy 1
End If
 
If Czas_pom = 1 And Czas >= 2500 Then 'po upływie czasu (kilku minut) uruchamiamy zamykanie
Czas_pom = 0
Czas = 0
Reset Zam 'ustawienie odpowiednich flag
Set Otw
Waitms 100
End If
 
If Otw = 0 And Zam = 0 Then
Reset Portd.0 'jeżeli zmienne sš wyzerowane
Reset Portd.1 'pozostań w tym stanie
Reset Portd.2
Reset Portd.3
Reset Portb.0 'tj. silnik i zasilacz wyłšczone
End If
 
 
If Otw = 1 And Zam = 0 Then 'jeżeli aktywne jest otwieranie bramy
Set Portb.0 'uruchom zasilacz
Waitms 100
Reset Portd.0 'włšcz tylko PK2
Set Portd.1
Reset Portd.2
Waitms 900
Set Portd.3
End If
 
If Otw = 0 And Zam = 1 Then 'jeżeli aktywne jest zamykanie bramy
Set Portb.0 'uruchom zasilacz
Waitms 100
Set Portd.2
Reset Portd.3
Waitms 900
Set Portd.0 'włšcz tylko PK1
Reset Portd.1
End If
 
If Otw = 1 And Zam = 1 Then 'jeżeli wystšpi taka sytuacja
Reset Portd.0 'wyłšcz wszystko i wyga? flagi
Reset Portd.1
Reset Portd.2
Reset Portd.3
Reset Portb.0
Reset Otw
Reset Zam
Waitms 100
End If
 
Waitms 50 'opó?nienie główne
Loop
End 'koniec programu
 
Otw: 'po ururomieniu otwierania
Toggle Otw 'zmień stan flagi Otw na przeciwny
Waitms 100
Return
 
Zam: 'po uruchomieniu zamykania
Reset Czas_pom 'bezwarunkowo wyga? flagę autozamykania
Toggle Zam 'zmień stan flagi Zam na przeciwny
Waitms 100
End If
Return
 

Powrót do góry
   
haz000
Poziom 2
Poziom 2


Dołączył: 28 Lis 2012
Posty: 2

Post#4 Post autora tematu 06 Gru 2012 00:28   

Re: [ATmega8][Bascom] - AVT5341 sterownik bramy - 2 skrzydła


Witam,

dziękuję za odpowiedź i chęć do pomocy ale temat kontynuowałem już na innym forum i rozwiązałem to w trochę inny sposób. Faktycznie brak gotowca zmusił mnie do tego żeby trochę posiedzieć i popróbować samemu.
I tak:
- z kodu usunąłem część odpowiedzialną za autozamykanie
- z racji braku krańcówek wykasowałem obsługę wykrywania obniżonego napięcia
- dopisałem sterowanie dodatkowym skrzydłem
- pozostało do przerobienia załączanie pomiaru ADC tylko na czas pracy siłowników

Co do kodu wyżej:
Cytat:
If Otw = 1 And Zam = 1 Then
Waitms 500
Start Adc 'uruchomienie wewnętrznego przetwornika A/C
End If

to ma byc AND czy może OR?

Wyszło mi coś takiego:
Kod Basic4GL - [rozwiń]
$regfile = "m8def.dat" 'korzystamy z AMTEGA8
$crystal = 1000000 'taktowanie wewnętrznym oscylatorem 1MHz
Config Pinb.6 = Input 'otwieranie bramy
Config Pinb.7 = Input 'zamykanie bramy
Config Pind.0 = Output 'przekaźnik PK1
Config Pind.1 = Output 'przekaźnik PK2
Config Pinb.0 = Output 'przekaźnik PK3
Config Pind.2 = Output 'przekaźnik PK1 bis
Config Pind.3 = Output 'przekaźnik PK2 bis
Config Pind.4 = Output 'ustawienie nieużywanych pinów jako wyjścia
Config Pind.5 = Output
Config Pind.6 = Output
Config Pinc.3 = Output
Config Pinc.1 = Output
Config Pind.7 = Output
Config Pinb.1 = Output
Config Pinb.2 = Output
'
Config Adc = Single , Prescaler = Auto , Reference = Avcc 'konfiguracja wewnętrznego przetwornika A/c
Start Adc 'uruchomienie wewnętrznego przetwornika A/C
 
Reset Portd.0 'wyłączenie PK1
Reset Portd.1 'wyłączenie PK2
Reset Portb.0 'wyłączenie PK3
Reset Portd.2 'wyłączenie PK1 bis
Reset Portd.3 'wyłączenie PK2 bis
Set Portb.6 'włączenie wewnętrznych rezystorów podciągających
Set Portb.7
Set Portc.3
Set Portc.1
Set Portd.2
Set Portd.3
Set Portd.4
Set Portd.5
Set Portd.6
Set Portd.7
Set Portb.1
Set Portb.2
 
Dim Rez As Integer 'napięcie z rezystora R8
Dim Rez_3 As Integer 'napiecie z rezystora R3
Dim Pot_max As Integer 'napięcie z potencjometru P2
Dim Pot_bis_max As Integer 'napięcie z potencjometru P2 bis
Dim Otw As Bit 'flaga otwierania
Dim Zam As Bit 'flaga zamykania
Dim Br1 As Bit 'flaga zatrzymania skrzydla 1
Dim Br2 As Bit 'flaga zatrzymania skrzydla 2
Dim Opoznienie As Bit 'opoznienie wykrywania przeciazenia po starcie silnika
 
 
Reset Otw 'wygaszenie flag
Reset Zam
Reset Br1
Reset Br2
Reset Opoznienie
 
 
Do 'początek nieskończonej pętli
Rez = Getadc(5) 'przechwycenie wartości napięć na wejściach ADC
Rez_3 = Getadc(0)
Pot_max = Getadc(4)
Pot_bis_max = Getadc(2)
 
 
If Rez >= Pot_max Then 'wykrywanie przeciążenia
Reset Portd.0
Reset Portd.1
Set Br1 'skrzydlo 1 zatrzymane
End If
 
 
If Rez_3 >= Pot_bis_max Then 'wykrywanie przeciążenia
Reset Portd.2
Reset Portd.3
Set Br2 'skrzydlo 2 zatrzymane
End If
 
 
If Br1 = 1 And Br2 = 1 Then 'jezeli skrzydlo 1 i 2 zatrzymane - wylacz PK3
Waitms 100
Reset Portb.0 'wyłączenie zasilacza
Reset Zam 'wygaszenie flag
Reset Otw
Reset Br1
Reset Br2
Reset Opoznienie
End If
 
 
Debounce Pinb.6 , 0 , Otw1 , Sub 'sprawdzenie stanu wejść z modułu radiowego
Debounce Pinb.7 , 0 , Zam1 , Sub 'jeżeli stan niski -> przeskocz
 
 
If Otw = 0 And Zam = 0 Then
Reset Portd.0 'jeżeli zmienne są wyzerowane
Reset Portd.1
Reset Portd.2 'pozostań w tym stanie
Reset Portd.3
Reset Portb.0
Reset Br1
Reset Br2
Reset Opoznienie 'tj. silnik i zasilacz wyłączone
End If
 
If Otw = 1 And Zam = 0 Then 'jeżeli aktywne jest otwieranie bramy
Set Portb.0 'uruchom zasilacz
Waitms 100
 
If Br1 = 0 Then 'jezeli nie zadzialalo zabezpieczenie przeciazeniowe
Reset Portd.0 'włącz tylko PK2
Set Portd.1
End If
 
If Br2 = 0 Then 'jezeli nie zadzialalo zabezpieczenie przeciazeniowe
Waitms 300 'odczekaj
Reset Portd.2 'włącz tylko PK2 bis - drugie skrzydlo
Set Portd.3
End If
 
If Opoznienie = 0 Then
Waitms 1500
Set Opoznienie 'opoznienie wykrywania przeciazenia po starcie silnika
End If
End If
 
If Otw = 0 And Zam = 1 Then 'jeżeli aktywne jest zamykanie bramy
Set Portb.0 'uruchom zasilacz
Waitms 100
 
 
If Br2 = 0 Then 'jezeli nie zadzialalo zabezpieczenie przeciazeniowe
Set Portd.2 'włącz tylko PK1 bis - drugie skrzydlo
Reset Portd.3
End If
 
If Br1 = 0 Then 'jezeli nie zadzialalo zabezpieczenie przeciazeniowe
Waitms 300 'odczekaj
Set Portd.0 'włącz tylko PK1
Reset Portd.1
End If
 
If Opoznienie = 0 Then 'opoznienie wykrywania przeciazenia po starcie silnika
Waitms 1500
Set Opoznienie
End If
End If
 
If Otw = 1 And Zam = 1 Then 'jeżeli wystąpi taka sytuacja
Reset Portd.0 'wyłącz wszystko i wygaś flagi
Reset Portd.1
Reset Portd.2
Reset Portd.3
Reset Portb.0
Reset Otw
Reset Zam
Reset Br1
Reset Br2
Reset Opoznienie
Waitms 100
End If
 
Waitms 50 'opóźnienie główne
Loop
End 'koniec programu
 
Otw1: 'po uruchomieniu otwierania
Toggle Otw 'zmień stan flagi Otw na przeciwny
Waitms 100 'wygas flagi przeciazenia
Return
 
Zam1: 'po uruchomieniu zamykania
Toggle Zam 'zmień stan flagi Zam na przeciwny
Waitms 100 'wygas flagi przeciazenia
Return


...ogólnie działa mniejwięcej jak zakładałem poza tym, że nie zmieniają się opóźnienia skrzydeł (przy otwarciu pierwsze prawe i po 300ms lewe a przy zamykaniu odwrotnie)
Powrót do góry
   
krd1
Poziom 2
Poziom 2


Dołączył: 17 Lut 2007
Posty: 3
Miasto: białystok

Post#5 06 Gru 2012 11:36   

Re: [ATmega8][Bascom] - AVT5341 sterownik bramy - 2 skrzydła


Witam. OR zdecydowanie inaczej ADC nie doczeka się uruchomienia.
Temat mnie zainteresował bo mam zamiar zautomatyzować swoją bramę wjazdową. Poczyniłem pierwsze kroki -zbudowałem siłowniki.Czas na automatykę . AVT5341 powinno spełnić moje oczekiwania i ograniczyć nakład pracy.Brak mi doświadczenia w programowaniu .Modyfikując gotowca uczę się , a niebawem tak jak tobie będzie mi potrzebny działający wsad.
Powrót do góry
   
krd1
Poziom 2
Poziom 2


Dołączył: 17 Lut 2007
Posty: 3
Miasto: białystok

Post#6 09 Gru 2012 18:03   

Re: [ATmega8][Bascom] - AVT5341 sterownik bramy - 2 skrzydła


Ma być tak;
Kod Basic4GL - [rozwiń]
$regfile = "m8def.dat" 'korzystamy z AMTEGA8
$crystal = 1000000 'taktowanie wewnętrznym oscylatorem 1MHz
Config Pinb.6 = Input 'otwieranie bramy
Config Pinb.7 = Input 'zamykanie bramy
Config Pind.0 = Output 'przeka?nik PK1
Config Pind.1 = Output 'przeka?nik PK2
Config Pind.2 = Output 'przeka?nik PK1bis
Config Pind.3 = Output 'przeka?nik PK2bis
Config Pinb.0 = Output 'przeka?nik PK3
 
Config Pind.4 = Output 'ustawienie nieużywanych pinów jako wyj?cia
Config Pind.5 = Output
Config Pind.6 = Output
Config Pind.7 = Output
Config Pinb.1 = Output
Config Pinb.2 = Output
'
Config Adc = Single , Prescaler = Auto , Reference = Avcc 'konfiguracja wewnętrznego przetwornika A/c
Start Adc 'uruchomienie wewnętrznego przetwornika A/C
 
Reset Portd.0 'wyłšczenie PK1
Reset Portd.1 'wyłšczenie PK2
Reset Portd.2 'wyłšczenie PK1bis
Reset Portd.3 'wyłšczenie PK2bis
Reset Portb.0 'wyłšczenie PK3
Set Portb.6 'włšczenie wewnętrznych rezystorów podcišgajšcych
Set Portb.7
Set Portd.4
Set Portd.5
Set Portd.6
Set Portd.7
Set Portb.1
Set Portb.2
 
Dim Rezl As Integer 'napięcie z rezystora R8
Dim Pot_minl As Integer 'napięcie z potencjometru P1
Dim Pot_maxl As Integer 'napięcie z potencjometru P2
Dim Rezp As Integer 'napięcie z rezystora R3
Dim Pot_minp As Integer 'napięcie z potencjometru P1bis
Dim Pot_maxp As Integer 'napięcie z potencjometru P2bis
Dim Otw As Bit 'flaga otwierania
Dim Zam As Bit 'flaga zamykania
Dim Czas As Integer 'zmienna odliczajšca czas do samozamknięcia
Dim Czas_pom As Bit 'flaga uaktywniajšca odliczanie do samozamknięcia
 
Reset Otw 'wygaszenie flag
Reset Zam
Reset Czas_pom
Do 'poczštek nieskończonej pętli
Rezl = Getadc(5) 'przechwycenie warto?ci napięć na wej?ciach ADC
Pot_maxl = Getadc(4)
Pot_minl = Getadc(3)
Rezp = Getadc(0) 'przechwycenie warto?ci napięć na wej?ciach ADC
Pot_maxp = Getadc(2)
Pot_minp = Getadc(1)
 
If Rezl >= Pot_maxl Then 'wykrywanie przecišżenia
Reset Portd.0 'wyłšczenie silnika
Reset Portd.1
Waitms 100
Reset Portb.0 'wyłšczenie zasilacza
Reset Otw 'wygaszenie flag otwierania/zamykania
Reset Zam
End If
 
If Rezp >= Pot_maxp Then 'wykrywanie przecišżenia
Reset Portd.2 'wyłšczenie silnika
Reset Portd.3
Waitms 100
Reset Portb.0 'wyłšczenie zasilacza
Reset Otw 'wygaszenie flag otwierania/zamykania
Reset Zam
End If
 
If Rezl <= Pot_minl Then 'wykrywanie zakończenia pracy siłownika
Reset Portd.0 'wyłšczenie silnika
Reset Portd.1
End If
 
If Rezp <= Pot_minp Then 'wykrywanie zakończenia pracy siłownika
Reset Portd.2 'wyłšczenie silnika
Reset Portd.3
End If
 
If Pind.0 = 0 And Pind.1 = 0 And Pind.2 = 0 And Pind.3 = 0 Then
Reset Portb.0 'wyłšczenie zasilacza
Reset Otw 'wygaszenie flag otwierania/zamykania
Reset Zam
End If
 
 
Debounce Pinb.6 , 0 , Otw , Sub 'sprawdzenie stanu wej?ć z modułu radiowego
Debounce Pinb.7 , 0 , Zam , Sub 'jeżeli stan niski -> przeskocz
 
If Otw = 1 And Czas_pom = 0 Then 'po otwarciu uaktywniamy odliczanie do zamknięcia
Set Czas_pom
End If
 
If Czas_pom = 1 Then 'jeżeli flaga autozamykania jest aktywna,
Czas = Czas + 1 'z kadym obiegiem pętli dodajemy 1
End If
 
If Czas_pom = 1 And Czas >= 4000 Then 'po upływie czasu (kilku minut) uruchamiamy zamykanie
Czas_pom = 0
Czas = 0
Reset Otw 'ustawienie odpowiednich flag
Set Zam
Waitms 100
End If
 
If Otw = 0 And Zam = 0 Then
Reset Portd.0 'jeżeli zmienne sš wyzerowane
Reset Portd.1 'pozostań w tym stanie
Reset Portd.2 'jeżeli zmienne sš wyzerowane
Reset Portd.3 'pozostań w tym stanie
Reset Portb.0 'tj. silnik i zasilacz wyłšczone
End If
 
If Otw = 1 And Zam = 0 Then 'jeżeli aktywne jest otwieranie bramy
Set Portb.0 'uruchom zasilacz
Waitms 100
Reset Portd.0 'włšcz tylko PK2
Set Portd.1
Waitms 1500
Reset Portd.2 'włšcz tylko PK2bis
Set Portd.3
End If
 
If Otw = 0 And Zam = 1 Then 'jeżeli aktywne jest zamykanie bramy
Set Portb.0 'uruchom zasilacz
Waitms 100
Set Portd.2 'włšcz tylko PK1
Reset Portd.3
Waitms 2400
Set Portd.0 'włšcz tylko PK1bis
Reset Portd.1
End If
 
If Otw = 1 And Zam = 1 Then 'jeżeli wystšpi taka sytuacja
Reset Portd.0 'wyłšcz wszystko i wyga? flagi
Reset Portd.1
Reset Portb.0
Reset Portd.2
Reset Portb.3
Reset Otw
Reset Zam
Waitms 100
End If
 
Waitms 50 'opó?nienie główne
Loop
End 'koniec programu
 
Otw: 'po ururomieniu otwierania
Toggle Otw 'zmień stan flagi Otw na przeciwny
Waitms 100
Return
 
Zam: 'po uruchomieniu zamykania
Reset Czas_pom 'bezwarunkowo wyga? flagę autozamykania
Toggle Zam 'zmień stan flagi Zam na przeciwny
Waitms 100
Return
[/code]
Ten kod spisuje się dobrze .Czekam na inne pomysły
Powrót do góry
   
boorys2424
Poziom 4
Poziom 4


Dołączył: 19 Lis 2010
Posty: 8

Post#7 25 Cze 2013 08:57   

Re: [ATmega8][Bascom] - AVT5341 sterownik bramy - 2 skrzydła


Witam.
Odświerzę troszkę temat.
AVT wypuściło drugą wersję oprogramowania do tego kitu.
Zawiera ono obsługę jednego i dwóch skrzydeł.
Wybór dokonywany jest automatycznie poprzez wykrycie obecności przystawki
(napięcie na rezystorze po pomiarowym).
Niestety program napisany jest w C, o którym nie mam zielonego pojęcia a chciałbym dopisać do niego blokadę autozamykania.
Może ktoś pomoże w tej kwestii?

Zamieszczam kod po poprawieniu, ponieważ oryginał miał błąd w kolejności załączania przekaźników w trybie dwuskrzydłowym (wyszło w testach):

Kod C - [rozwiń]
#include <avr/io.h>
#include <util/delay.h>
 
#define ZAL_TRAFO PORTB|=0b00000001
#define WYL_TRAFO PORTB&=0b11111110
 
#define ZAL_PK1 PORTD|=0b00000001
#define WYL_PK1 PORTD&=0b11111110
 
#define ZAL_PK2 PORTD|=0b00000010
#define WYL_PK2 PORTD&=0b11111101
 
#define ZAL_PK1_DOD PORTD|=0b00000100
#define WYL_PK1_DOD PORTD&=0b11111011
 
#define ZAL_PK2_DOD PORTD|=0b00001000
#define WYL_PK2_DOD PORTD&=0b11110111
 
#define PRZYC1 bit_is_clear(PINB, PINB6) //jego wciśnięcie = otwieranie
#define PRZYC2 bit_is_clear(PINB, PINB7) //zamykanie
 
#define JEST_REZ_DOD bit_is_clear(PINC, PINC0) //wykrycie płytki przystawki
 
#define POT_MIN ADMUX=0b00000011;
#define POT_MAX ADMUX=0b00000100;
#define REZ ADMUX=0b00000101;
#define POT_MIN_DOD ADMUX=0b00000001;
#define POT_MAX_DOD ADMUX=0b00000010;
#define REZ_DOD ADMUX=0b00000000;
 
#define IL_CYKLI 50000 //ilość cykli do samozamknięcia dla bramy jednoskrzydłowej
#define IL_CYKLI_DOD 25000 //ilość cykli do samozamknięcia dla bramy dwuskrzydłowej
//jeden cykl trwa ok. 6ms
//w trybie dwuskrzydłowym ok. 12ms
 
#define OPOZN_ZAL_TRAFA 1000 //ilość milisekund między uruchomieniem transformatora a włączeniem siłownika
#define OPOZN_M_SILOWNIKAMI 4500 //ilość milisekund między uruchomieniem jednego siłownika a startem drugiego
#define OPOZN_ROZRUCH 1000 //czas "niewrażliwości" układu na przeciążenie/niedociążenie siłownika w milisekundach
 
 
uint8_t tryb_pracy; //0 - brama jednoskrzydłowa; 1 - brama dwuskrzydłowa
uint16_t wart_rez, wart_pot_min, wart_pot_max; //wartości z ADC: rezystora, potencjometra MIN, potencjometra MAX
uint16_t wart_rez_dod, wart_pot_min_dod, wart_pot_max_dod; //wartości z ADC: rezystora, potencjometra MIN, potencjometra MAX dla płytki przystawki
uint8_t otw=0, zam=0, autozam=0; //flagi: otwierania, zamykania i autozamykania
uint8_t otw_dod=0, zam_dod=0; //flagi: otwierania i zamykania dla drugiego skrzydła
 
uint16_t odliczanie; //zmienna odliczająca do samozamknięcia
uint8_t poprz_przyc1=1, poprz_przyc2=1; //zmienne do przechowywania "poprzednich" stanów przycisków
uint8_t akt_przyc1=1, akt_przyc2=1; //zmienne do przechowywania "aktualnych" stanów przycisków
// 0 - przycisk wciśnięty ; 1 - przycisk zwolniony
 
 
void odczyt_przyc(void){ //funkcja odczytująca stan przycisków
//odczyt następuje poprzez sprawdzenie stanu "poprzedniego" i "obecnego" -
//stąd kopiowanie zawartości, która w "obecnej" iteracji staje się już "poprzednią"
poprz_przyc1 = akt_przyc1;
poprz_przyc2 = akt_przyc2;
if(PRZYC1){akt_przyc1 = 0;} else {akt_przyc1 = 1;}
if(PRZYC2){akt_przyc2 = 0;} else {akt_przyc2 = 1;}
}
 
 
int main(void){
 
DDRB = 0b00111111; //konfiguracja rejestrów kierunku
DDRC = 0b000000;
DDRD = 0b11111111;
 
PORTB = 0b11111110; //ustawienie wartości na wyjściach portów
PORTC = 0b111111;
PORTD = 0b11110000;
 
_delay_ms(100);
 
if(JEST_REZ_DOD){ //jeżeli wykryto płytkę przystawki
tryb_pracy = 1;
} else {
tryb_pracy = 0; //jeżeli nie wykryto
DDRC |= 0b000111;
PORTC |= 0b111111;
}
 
REZ; //ustawienie rejestru ADMUX
ADCSR = 0b11100011; //załączenie ADC ; start Free Running Mode ; wybór trybu Free Running ; brak przerwania ; wyłączenie przerwania od ADC ; podział przez 8
 
 
// ***************************************************************
// ********** Tryb bramy jednoskrzydłowej ************************
// ***************************************************************
 
 
while(tryb_pracy == 0){
 
odczyt_przyc();
//--------------------
if(poprz_przyc1 == 1 && akt_przyc1 == 0){ //decyzja podejmowana na zboczu opadającym tuż po wcinięciu przycisku na pilocie
autozam = 0;
if(otw == 0 && zam == 0){autozam = 1; odliczanie = 0;} //autozamykanie uruchomi się tylko wtedy, gdy brama wcześniej stała
otw++;
 
 
if(otw == 1 && zam == 0){ //konfiguracja do otwierania bramy
ZAL_TRAFO;
_delay_ms(OPOZN_ZAL_TRAFA);
WYL_PK1;
ZAL_PK2;
_delay_ms(OPOZN_ROZRUCH);
}
 
}
 
//--------------------
 
if(poprz_przyc2 == 1 && akt_przyc2 == 0){ //decyzja podejmowana na zboczu opadającym tuż po wciśnięciu przycisku na pilocie
autozam = 0;
zam++;
 
 
if(otw == 0 && zam == 1){ //konfiguracja do zamykania bramy
ZAL_TRAFO;
_delay_ms(OPOZN_ZAL_TRAFA);
ZAL_PK1;
WYL_PK2;
_delay_ms(OPOZN_ROZRUCH);
}}
 
//--------------------
 
if((otw == 1 && zam == 1) || otw >= 2 || zam >= 2){ //konfiguracja do natychmiastowego zatrzymania bramy: albo naciśnięcie drugiego przycisku, albo ponowne tego samego
WYL_PK1;
WYL_PK2;
WYL_TRAFO;
zam = 0;
otw = 0;
autozam = 0;
odliczanie = 0;
_delay_ms(500);
}
 
//--------------------
 
REZ; //odczyt napięcia z rezystora
_delay_ms(2);
wart_rez = (ADCL | (ADCH<<8));
 
 
POT_MIN; //odczyt napięcia z potencjometru P1 (prąd minimalny)
_delay_ms(2);
wart_pot_min = (ADCL | (ADCH<<8));
 
 
POT_MAX; //odczyt napięcia z potencjometru P2 (prąd maksymalny)
_delay_ms(2);
wart_pot_max = (ADCL | (ADCH<<8));
 
//--------------------
 
if(wart_rez >= wart_pot_max || wart_rez <= wart_pot_min){ //po wykryciu przeciążenia lub niedociążenia - zatrzymaj
WYL_PK1;
WYL_PK2;
WYL_TRAFO;
if(otw == 0 && zam == 1){ //jeżeli brama się zamykała, to wyłącz samozamykanie
autozam = 0;
odliczanie = 0;
}
zam = 0;
otw = 0;
}
 
//--------------------
 
if(autozam == 1 && odliczanie < IL_CYKLI && otw == 0 && zam == 0){ odliczanie++;}
 
if(autozam == 1 && odliczanie >= IL_CYKLI){
ZAL_TRAFO;
_delay_ms(OPOZN_ZAL_TRAFA);
ZAL_PK1;
WYL_PK2;
_delay_ms(OPOZN_ROZRUCH);
autozam = 0;
odliczanie = 0;
otw = 0; //ustawienie flag zamykania - pomocne, jeżeli będzie się chciało zatrzymać ten proces przyciskiem na pilocie
zam = 1;
}
}
 
 
 
// ***************************************************************
// ************ Tryb bramy dwuskrzydłowej ************************
// ***************************************************************
 
 
while(tryb_pracy == 1){
 
odczyt_przyc();
 
//--------------------
if(poprz_przyc1 == 1 && akt_przyc1 == 0){ //decyzja podejmowana na zboczu opadającym tuż po wcinięciu przycisku na pilocie
autozam = 0;
if(otw == 0 && zam == 0 && otw_dod == 0 && zam_dod == 0){autozam = 1; odliczanie = 0;} //autozamykanie uruchomi się tylko wtedy, gdy brama wcześniej stała
otw++;
otw_dod++;
 
if(otw == 1 && zam == 0 && otw_dod == 1 && zam_dod == 0){ //konfiguracja do otwierania bramy
ZAL_TRAFO;
_delay_ms(OPOZN_ZAL_TRAFA);
WYL_PK1;
ZAL_PK2;
_delay_ms(OPOZN_M_SILOWNIKAMI);
WYL_PK1_DOD;
ZAL_PK2_DOD;
_delay_ms(OPOZN_ROZRUCH);
}
}
 
 
//--------------------
 
if(poprz_przyc2 == 1 && akt_przyc2 == 0){ //decyzja podejmowana na zboczu opadającym tuż po wciśnięciu przycisku na pilocie
autozam = 0;
zam++;
zam_dod++;
 
if(otw == 0 && zam == 1 && otw_dod == 0 && zam_dod == 1){ //konfiguracja do zamykania bramy
ZAL_TRAFO;
_delay_ms(OPOZN_ZAL_TRAFA);
ZAL_PK1_DOD;
WYL_PK2_DOD;
_delay_ms(OPOZN_M_SILOWNIKAMI);
ZAL_PK1;
WYL_PK2;
_delay_ms(OPOZN_ROZRUCH);
}}
 
//--------------------
 
if((otw == 1 && zam == 1) || otw >= 2 || zam >= 2 || (otw_dod == 1 && zam_dod == 1) || otw_dod >= 2 || zam_dod >= 2){ //konfiguracja do natychmiastowego zatrzymania bramy: albo naciśnięcie drugiego przycisku, albo ponowne tego samego
WYL_PK1;
WYL_PK2;
WYL_PK1_DOD;
WYL_PK2_DOD;
WYL_TRAFO;
zam = 0;
otw = 0;
otw_dod = 0;
zam_dod = 0;
autozam = 0;
odliczanie = 0;
_delay_ms(500);
}
 
//--------------------
 
REZ; //odczyt napięcia z rezystora
_delay_ms(2);
wart_rez = (ADCL | (ADCH<<8));
 
 
POT_MIN; //odczyt napięcia z potencjometru P1 (prąd minimalny)
_delay_ms(2);
wart_pot_min = (ADCL | (ADCH<<8));
 
 
POT_MAX; //odczyt napięcia z potencjometru P2 (prąd maksymalny)
_delay_ms(2);
wart_pot_max = (ADCL | (ADCH<<8));
 
 
REZ_DOD; //odczyt napięcia z rezystora
_delay_ms(2);
wart_rez_dod = (ADCL | (ADCH<<8));
 
 
POT_MIN_DOD; //odczyt napięcia z potencjometru P1 (prąd minimalny)
_delay_ms(2);
wart_pot_min_dod = (ADCL | (ADCH<<8));
 
 
POT_MAX_DOD; //odczyt napięcia z potencjometru P2 (prąd maksymalny)
_delay_ms(2);
wart_pot_max_dod = (ADCL | (ADCH<<8));
 
//--------------------
 
if(wart_rez >= wart_pot_max || wart_rez <= wart_pot_min){ //po wykryciu przeciążenia lub niedociążenia na jednym skrzydle - zatrzymaj je
WYL_PK1;
WYL_PK2;
 
if((otw == 0 && zam == 1) || (otw_dod == 0 && zam_dod == 1)){ //jeżeli brama się zamykała, to wyłącz samozamykanie
autozam = 0;
odliczanie = 0;
}
 
zam = 0;
otw = 0;
}
 
//--------------------
 
if(wart_rez_dod >= wart_pot_max_dod || wart_rez_dod <= wart_pot_min_dod){ //po wykryciu przeciążenia lub niedociążenia na drugim skrzydle - zatrzymaj je
WYL_PK1_DOD;
WYL_PK2_DOD;
 
if((otw == 0 && zam == 1) || (otw_dod == 0 && zam_dod == 1)){ //jeżeli brama się zamykała, to wyłącz samozamykanie
autozam = 0;
odliczanie = 0;
}
 
zam_dod = 0;
otw_dod = 0;
}
 
//--------------------
 
if(otw == 0 && zam == 0 && otw_dod == 0 && zam_dod == 0 ){ //wyłączenie transformatora, jeżeli obydwa skrzydła stoją
WYL_TRAFO;
}
 
//--------------------
 
if(autozam == 1 && odliczanie < IL_CYKLI_DOD && otw == 0 && zam == 0 && otw_dod == 0 && zam_dod == 0){ odliczanie++;}
 
if(autozam == 1 && odliczanie >= IL_CYKLI_DOD){
ZAL_TRAFO;
_delay_ms(OPOZN_ZAL_TRAFA);
ZAL_PK1_DOD;
WYL_PK2_DOD;
_delay_ms(OPOZN_M_SILOWNIKAMI);
ZAL_PK1;
WYL_PK2;
_delay_ms(OPOZN_ROZRUCH);
autozam = 0;
odliczanie = 0;
otw = 0; //ustawienie flag zamykania - pomocne, jeżeli będzie się chciało zatrzymać ten proces przyciskiem na pilocie
zam = 1;
otw_dod = 0;
zam_dod = 1;
}
 
 
}}


Na koniec jeszcze pliki od AVT

Załączniki:
Powrót do góry
   
Google


Google Adsense


Post# 25 Cze 2013 08:57   





Powrót do góry
   
yokoon
Poziom 20
Poziom 20


Dołączył: 24 Mar 2004
Posty: 864
Miasto: Legnica

Post#8 25 Cze 2013 10:37   

Re: [ATmega8][Bascom] - AVT5341 sterownik bramy - 2 skrzydła


Czy sprawdzałeś błędy w swoim programie ?
Tak na szybko to:
Zmienne otw i zam mają taką samą nazwę jak sub katalogi otw: i zam:
Dłaczego typ zmiennych stosujesz jako Integer?
Czyżby były też ujemne ?
Trochę zmieniłem, sprawdź go.

Kod Basic4GL - [rozwiń]
$regfile = "m8def.dat" 'korzystamy z AMTEGA8
$crystal = 1000000
 
Dim Rezl As Integer 'napięcie z rezystora R8
Dim Pot_minl As Integer 'napięcie z potencjometru P1
Dim Pot_maxl As Integer 'napięcie z potencjometru P2
Dim Rezp As Integer 'napięcie z rezystora R3
Dim Pot_minp As Integer 'napięcie z potencjometru P1bis
Dim Pot_maxp As Integer 'napięcie z potencjometru P2bis
Dim Otw As Bit 'flaga otwierania
Dim Zam As Bit 'flaga zamykania
Dim Czas As Integer 'zmienna odliczajšca czas do samozamknięcia
Dim Czas_pom As Bit 'flaga uaktywniajšca odliczanie do samozamknięc
 
Declare Sub Otworz
Declare Sub Zamkni
 
Config Pinb.0 = Output 'przeka?nik PK3
Config Pinb.1 = Output
Config Pinb.2 = Output
Config Pinb.6 = Input 'otwieranie bramy
Config Pinb.7 = Input 'zamykanie bramy
 
Ddrd = &B11111111
 
'Config Pind.0 = Output 'przeka?nik PK1
'Config Pind.1 = Output 'przeka?nik PK2
'Config Pind.2 = Output 'przeka?nik PK1bis
'Config Pind.3 = Output 'przeka?nik PK2bis
'Config Pind.4 = Output 'ustawienie nieużywanych pinów jako wyj?cia
'Config Pind.5 = Output
'Config Pind.6 = Output
'Config Pind.7 = Output
 
'
Config Adc = Single , Prescaler = Auto , Reference = Avcc 'konfiguracja wewnętrznego przetwornika A/c
Start Adc 'uruchomienie wewnętrznego przetwornika A/C
 
Rezl = Getadc(5) 'przechwycenie warto?ci napięć na wej?ciach ADC
Pot_maxl = Getadc(4)
Pot_minl = Getadc(3)
Rezp = Getadc(0) 'przechwycenie warto?ci napięć na wej?ciach ADC
Pot_maxp = Getadc(2)
Pot_minp = Getadc(1)
 
Reset Portd.0 'wyłšczenie PK1
Reset Portd.1 'wyłšczenie PK2
Reset Portd.2 'wyłšczenie PK1bis
Reset Portd.3 'wyłšczenie PK2bis
Reset Portb.0 'wyłšczenie PK3
 
Set Portb.1
Set Portb.2
Set Portb.6 'włšczenie wewnętrznych rezystorów podcišgajšcych
Set Portb.7
 
Set Portd.4
Set Portd.5
Set Portd.6
Set Portd.7
 
Reset Otw 'wygaszenie flag
Reset Zam
Reset Czas_pom
 
Do 'poczštek nieskończonej pętli
 
If Rezl >= Pot_maxl Then 'wykrywanie przecišżenia
Reset Portd.0 'wyłšczenie silnika
Reset Portd.1
Waitms 100
Reset Portb.0 'wyłšczenie zasilacza
Reset Otw 'wygaszenie flag otwierania/zamykania
Reset Zam
End If
 
If Rezp >= Pot_maxp Then 'wykrywanie przecišżenia
Reset Portd.2 'wyłšczenie silnika
Reset Portd.3
Waitms 100
Reset Portb.0 'wyłšczenie zasilacza
Reset Otw 'wygaszenie flag otwierania/zamykania
Reset Zam
End If
 
If Rezl <= Pot_minl Then 'wykrywanie zakończenia pracy siłownika
Reset Portd.0 'wyłšczenie silnika
Reset Portd.1
End If
 
If Rezp <= Pot_minp Then 'wykrywanie zakończenia pracy siłownika
Reset Portd.2 'wyłšczenie silnika
Reset Portd.3
End If
 
If Pind.0 = 0 And Pind.1 = 0 And Pind.2 = 0 And Pind.3 = 0 Then
Reset Portb.0 'wyłšczenie zasilacza
Reset Otw 'wygaszenie flag otwierania/zamykania
Reset Zam
End If
 
 
Debounce Pinb.6 , 0 , Otworz , Sub 'sprawdzenie stanu wej?ć z modułu radiowego
Debounce Pinb.7 , 0 , Zamkni , Sub 'jeżeli stan niski -> przeskocz
 
If Otw = 1 And Czas_pom = 0 Then 'po otwarciu uaktywniamy odliczanie do zamknięcia
Set Czas_pom
End If
 
If Czas_pom = 1 Then 'jeżeli flaga autozamykania jest aktywna,
Czas = Czas + 1 'z kadym obiegiem pętli dodajemy 1
End If
 
If Czas_pom = 1 And Czas >= 4000 Then 'po upływie czasu (kilku minut) uruchamiamy zamykanie
Czas_pom = 0
Czas = 0
Reset Otw 'ustawienie odpowiednich flag
Set Zam
Waitms 100
End If
 
If Otw = 0 And Zam = 0 Then
Reset Portd.0 'jeżeli zmienne sš wyzerowane
Reset Portd.1 'pozostań w tym stanie
Reset Portd.2 'jeżeli zmienne sš wyzerowane
Reset Portd.3 'pozostań w tym stanie
Reset Portb.0 'tj. silnik i zasilacz wyłšczone
End If
 
If Otw = 1 And Zam = 0 Then 'jeżeli aktywne jest otwieranie bramy
Set Portb.0 'uruchom zasilacz
Waitms 100
Reset Portd.0 'włšcz tylko PK2
Set Portd.1
Waitms 1500
Reset Portd.2 'włšcz tylko PK2bis
Set Portd.3
End If
 
If Otw = 0 And Zam = 1 Then 'jeżeli aktywne jest zamykanie bramy
Set Portb.0 'uruchom zasilacz
Waitms 100
Set Portd.2 'włšcz tylko PK1
Reset Portd.3
Waitms 2400
Set Portd.0 'włšcz tylko PK1bis
Reset Portd.1
End If
 
If Otw = 1 And Zam = 1 Then 'jeżeli wystšpi taka sytuacja
Reset Portd.0 'wyłšcz wszystko i wyga? flagi
Reset Portd.1
Reset Portb.0
Reset Portd.2
Reset Portb.3
Reset Otw
Reset Zam
Waitms 100
End If
 
Waitms 50 'opó?nienie główne
Loop
End 'koniec programu
 
Otworz: 'po ururomieniu otwierania
Toggle Otw 'zmień stan flagi Otw na przeciwny
Waitms 100
Return
 
Zamkni: 'po uruchomieniu zamykania
Reset Czas_pom 'bezwarunkowo wyga? flagę autozamykania
Toggle Zam 'zmień stan flagi Zam na przeciwny
Waitms 100
Return

Powrót do góry
   
marcinjóźwiak
Poziom 4
Poziom 4


Dołączył: 21 Lip 2005
Posty: 10
Miasto: bełchów

Post#9 01 Gru 2013 13:38   

Re: [ATmega8][Bascom] - AVT5341 sterownik bramy - 2 skrzydła


witam!
Pisze do was ponieważ potrzebuję pomocy.
Zrobiłem ten układ zaprogramowałem ale potrzebuje żeby w mojej bamie działały krańcówki
wiec wykorzystałem nie używane porty pd4,pd5,pd6 i pd7 jako wejścia .
I teraz z chwilą gdy brama się zamknie odpowiedni port zostanie zwarty do masy np pind.4 i nastąpi wyłączenie odpowiedniego przekaźnika.
W bascomie napisałem tak:

If pind.4 = 0 Then
Set Pind.0
End If

i tu pojawia sie problem ponieważ przekaźnik cyklicznie załącza się i wyłącza
co może być przyczyną takiego zjawiska?
Jestem początkującym elektronikiem więc dopiero zaczynam z mikrokontrolerami avr.
Dodam tylko że listing do bascoma ściągnąłem z elektrody z postu powyżej wiec nie zamieszczałem go tutaj poraz kolejny.
Powrót do góry
   
emarcus
Poziom 20
Poziom 20


Dołączył: 29 Lis 2008
Posty: 1053
Miasto: Tecumseh, Ca

Post#10 02 Gru 2013 02:46   

Re: [ATmega8][Bascom] - AVT5341 sterownik bramy - 2 skrzydła


marcinjóźwiak napisał:
witam!
Pisze do was ponieważ potrzebuję pomocy.
.................
W bascomie napisałem tak:

If pind.4 = 0 Then
Set Pind.0
End If

i tu pojawia sie problem ..............



Nie wiem co i gdzie podłączasz, lecz:

Set Pind.0

Wszystkie bity rejestru PIND.(x) są "Read Only" a zatem nie mogą byc zmieniane z poziomu programu. Mogą byc manipulowane zewnętrznymi przełącznikami lub impulsami a następnie odczytywany ich stan logiczny przez uC; tak jak 'pind.4'.
W tym przypadku jeżeli PORTD.0 jest wyjściem, to poprawny wpis byłby:
"Set PORTD.0" , lub równowazny: PORTD.0 = 1

e marcus
Powrót do góry
   
marcinjóźwiak
Poziom 4
Poziom 4


Dołączył: 21 Lip 2005
Posty: 10
Miasto: bełchów

Post#11 04 Gru 2013 17:30   

Re: [ATmega8][Bascom] - AVT5341 sterownik bramy - 2 skrzydła


Już wiem gdzie jest mój błąd.
A czy ktoś z was kombinował może z dodaniem krańcówek do tego projektu i chciałby się podzielić listingiem?
Bo powiem szczerze problem mnie przerasta.....
Powrót do góry
   
Google


Google Adsense


Post# 04 Gru 2013 17:30   





Powrót do góry
   
leos66
Poziom 9
Poziom 9


Dołączył: 29 Sie 2007
Posty: 32
Miasto: września

Post#12 09 Sty 2014 11:42   

Re: [ATmega8][Bascom] - AVT5341 sterownik bramy - 2 skrzydła


Cześć!

Napisałem kod do tego sterownika w Baskom'ie . Program obsługuje opcje krańcówek zrealizowanych na kontaktronach, opcję zakładki bramy dwuskrzydłowej i fotokomórki. Wyrzuciłem z softu wyłączenie od prądu min i wszystko uzależniam od krańcówek. Nie wykrywam też ilości skrzdeł, z założenia są dwa. Po uruchomieniu pojawił się pewien problem. Aby działały krańcówki konieczna okazała się modyfikacja płytki, wyprowadzenie dodatkowych wejść. W układzie testowym zbudowanym na bazie EVBavr04 gdzie programuje procka wszystko śmiga pięknie ale kiedy przekładam procek do płytki AVT program się wysypuje. Myślę, że to może być problem zakłóceń. Czy ktoś miał podobny problem? Jeśli chodzi o kod do sterownika chętnie podzielę się moim softem.
Może ktoś go przetestuje u siebie lub napisze krytyczne uwagi. Jestem otwarty na konstruktywną krytykę.

10.01.14

Witam!
Chyba znalazłem rozwiązanie, problemu. Program funkcjonuje poprawnie. Problemem okazał się brak rezystorów podciągających 5V dla wszystkich nowo wprowadzonych wejść czyli czytanie krańcówek oraz fotokomórki. Konieczne jest dodanie 5 rezystorów 4,7k pomiędzy wejściami a potencjałem 5V.
Czyli zgodnie z tym co zawiera kod programu dla wejść PD.4, PD.5, PD.6, PD.7 oraz PB.1
Jutro zmodernizuję układ i postaram się potwierdzić rozwiązanie.

Dodano po 8 [minuty]:

marcinjóźwiak Jeśli do tej pory nie rozwiązałeś problemu to mam nadzieję, że mój projekt będzie dla ciebie pomocny.

......................
Odnośnie problemów z zakłóceniami po przeróbkach płytki sterownika, udało mi sie je wyeliminować. Jak przypuszczałem pomogło dołożenie rezystorów podciągających napięcie 5V na dodanych nowych wejściach czyli krańcówkach i fotokomórce. Myślę, że program można jeszcze modyfikować, zresztą mam już nowe pomysły. Jeśli będą zainteresowani mogę umieścić foto mojej płytki po modyfikacjach oraz schemat.

===========================================================
Poniższy listing zawiera błąd odsyłam do postu z dnia 9 luty 2014 z poprawką.

Załączniki:
Powrót do góry
   
Google


Google Adsense


Post# 09 Sty 2014 11:42   





Powrót do góry
   
mariusz997
Poziom 12
Poziom 12


Dołączył: 11 Lut 2004
Posty: 97
Miasto: Kraków

Post#13 14 Sty 2014 15:08   

Re: [ATmega8][Bascom] - AVT5341 sterownik bramy - 2 skrzydła


Witam
Jeśli to nie problem to proszę o zamieszczenie schematu i płytki.
Z góry dzięki
Pozdrawiam
Mariusz
Powrót do góry
   
leos66
Poziom 9
Poziom 9


Dołączył: 29 Sie 2007
Posty: 32
Miasto: września

Post#14 14 Sty 2014 22:09   

Re: [ATmega8][Bascom] - AVT5341 sterownik bramy - 2 skrzydła


Witam!

Myślę, że rysowanie całego schematu nie ma sensu. Proponuję pobrać schemat z AVT5341 ja dorzucam tylko fragment z poprawką oraz fotki. Oczywiście cztery wejścia dla krańcówek no i jedno dla fotokonórki jak wynika z kodu. W razie dalszych pytań jestem do dyspozycji.

[ATmega8][Bascom] - AVT5341 sterownik bramy - 2 skrzydła [ATmega8][Bascom] - AVT5341 sterownik bramy - 2 skrzydła [ATmega8][Bascom] - AVT5341 sterownik bramy - 2 skrzydła
Powrót do góry
   
leos66
Poziom 9
Poziom 9


Dołączył: 29 Sie 2007
Posty: 32
Miasto: września

Post#15 09 Lut 2014 22:07   

Re: [ATmega8][Bascom] - AVT5341 sterownik bramy - 2 skrzydła


Witam!

Jak słusznie zauważył mariusz997 w programie był istotny błąd. Polega on na możliwości ponownego uruchomienia zamykania bramy w czasie działania foto. Dlatego w po naprawie wstawiam listing versję 1.1

Załączniki:
Powrót do góry
   
sw224
Poziom 8
Poziom 8


Dołączył: 26 Cze 2005
Posty: 25
Miasto: Cieszyn

Post#16 10 Lut 2014 00:47   

Re: [ATmega8][Bascom] - AVT5341 sterownik bramy - 2 skrzydła


Witam nie wiem czy dobrze rozumiem ten typ podłączenia ale jeśli wszystkie kontaktrony i fotokomórka są zasilone i rozwarte od masy to powinny silniki cały czas się kręcić aż do zwarcia kontaktronów. U mnie po naciśnięciu otwierania na chwilę kręci się jeden silnik a po naciśnięciu zamykania drugi czym to może być spowodowane ?
Powrót do góry
   
leos66
Poziom 9
Poziom 9


Dołączył: 29 Sie 2007
Posty: 32
Miasto: września

Post#17 10 Lut 2014 20:32   

Re: [ATmega8][Bascom] - AVT5341 sterownik bramy - 2 skrzydła


Tak, bez foto będzie działało. Jeśli wejście foto nie zostanie zwarte do masy to sterowanie działa. Pozostaje pytanie co z ochroną osób, samochodu i td. Zawsze należy pomyśleć, że dzieci mają fantazję. Nie mówię tu o jakichś normach bezpieczeństwa ale o elementarnej ostrożności. Radzę więc jednak zabezpieczyć sterowanie choćby za pomocą bariery laserowej za parę złotych też z AVT.

Dodano po 8 [minuty]:

sw224 napisał:
U mnie po naciśnięciu otwierania na chwilę kręci się jeden silnik a po naciśnięciu zamykania drugi czym to może być spowodowane ?


A czy wejścia od krańcówek są podciągnięte przez opornik do +5V ?.
Zanim to zrobiłem też przekaźniki zachowywały się podobnie.
Jeśli tak to proszę o więcej informacji, może uda się coś rozwikłać.
Powrót do góry
   
sw224
Poziom 8
Poziom 8


Dołączył: 26 Cze 2005
Posty: 25
Miasto: Cieszyn

Post#18 10 Lut 2014 21:00   

Re: [ATmega8][Bascom] - AVT5341 sterownik bramy - 2 skrzydła


Tak wszystko podłączone jak na schemacie przez oporniki 4,7 kΩ co prawda bez kontaktronów i pinów w płytce ale to chyba nie ma większego wpływu próbowałem też startować ze zwartymi jednymi i drugimi wejściami czyli jak by była brama zamknięta lub otwarta i cały czas to samo jedynie fotokomórka jeśli zwarta to wyłącza układ.
Powrót do góry
   
leos66
Poziom 9
Poziom 9


Dołączył: 29 Sie 2007
Posty: 32
Miasto: września

Post#19 11 Lut 2014 02:22   

Re: [ATmega8][Bascom] - AVT5341 sterownik bramy - 2 skrzydła


Ja zacząłbym od sprawdzenia poziomu napięcia na wejściach procesora D4,5,6,7.
Powinny być na poziomie 4-5V przy otwartych stykach kontaktronów.
Może dla pewności wgrać program z wyremowanym obszarem ograniczenia prądowego (usunąć wiersze) czyli zostawić:
...
Do
If Foto = 0 then
...
Powrót do góry
   
sw224
Poziom 8
Poziom 8


Dołączył: 26 Cze 2005
Posty: 25
Miasto: Cieszyn

Post#20 11 Lut 2014 11:19   

Re: [ATmega8][Bascom] - AVT5341 sterownik bramy - 2 skrzydła


Witam ponownie napięcia na wejściach procesora D4,5,6,7 prawidłowe a po modyfikacji programu silniki chodzą cały czas ale naprzemiennie czyli jak włączę otwieranie idzie jeden silnik a jak zamykanie drugi krańcówki działają tak jak powinny fotokomórka też. Czyli ogólnie tak samo jak w oryginalnym programie tylko przeciążenie ich nie rozłącza .
Na prośbę Autora dla bezpieczeństwa kod usuwam .
Powrót do góry
   
sw224
Poziom 8
Poziom 8


Dołączył: 26 Cze 2005
Posty: 25
Miasto: Cieszyn

Post#21 11 Lut 2014 23:16   

Re: [ATmega8][Bascom] - AVT5341 sterownik bramy - 2 skrzydła


a więc po kolejnych kilku próbach okazało się że bez zabezpieczenia przeciążeniowego startują dwa silniki tylko straszne długie opóźnienie jest ustawione ale działa wszystko otwieranie zamykanie krańcówki i fotokomórka . Ale z wykrywaniem przeciążenia zaraz wyłącza pierwszy silnik i drugi już nie zdąży wystartować regulacja potencjometrami nic nie daje moje pytanie czy w programie idzie zwiększyć próg czułości przeciążenia bo próbuje ale nie wychodzi mi to za bardzo .
Powrót do góry
   
leos66
Poziom 9
Poziom 9


Dołączył: 29 Sie 2007
Posty: 32
Miasto: września

Post#22 12 Lut 2014 02:45   

Re: [ATmega8][Bascom] - AVT5341 sterownik bramy - 2 skrzydła


Witam!

Odnośnie czasu - proponuję zmienną czas ustawić doświadczalnie (jest to ilość przejść programu w pętli) zgodnie z wymaganiami bezpiecznego otwierania i zamykania zakładki. U mnie docelowo wyszło około 50. Pierwotna wartość 200 miała służyć bezpieczeństwu aby nikt z forumowiczów nie wyrwał zakładki.

Odnośnie prądu -jeśli dobrze rozumiałem mówiąc o zwiększaniu progu czułości masz na myśli znieczulenie? Myślę, że powinieneś zacząć od pomiarów. Podaj proszę wartości napięć podczas pracy siłowników dla C0,2,4,5 oraz prąd w obwodzie każdego siłownika. Dla bezpieczeństwa nieużywane wejścia C3 i C1 skręć na potencjometrach blisko 5V. No i napisz jak wyszło...

PS. Mam też prośbę abyś albo dobrze opisał albo usunął listing bez zabezpieczeń prądowych na wypadek "żeby kogoś drzwi nie ścisły"
Pozdrawiam!
Powrót do góry
   
sw224
Poziom 8
Poziom 8


Dołączył: 26 Cze 2005
Posty: 25
Miasto: Cieszyn

Post#23 12 Lut 2014 16:20   

Re: [ATmega8][Bascom] - AVT5341 sterownik bramy - 2 skrzydła


Witam oczywiście chodziło o znieczulenie ,kod usunąłem żeby kogoś drzwi nie ścisły . Wracając do napięć to o ile dobrze rozumuje chodzi o napięcia na procesorze , tylko chwilowo do testów mam podpięte dwa różne silniki docelowo będą takie jak podpięty pod płytę główną a napięcia są następujące C0-0,12v;C2-0,28v;C4-0,05v;C5-0,7v;prąd w obwodzie silnika płyty głównej 6A a przystawki ten który będzie zmieniony 1,9A.
Pozdrawiam
Powrót do góry
   
leos66
Poziom 9
Poziom 9


Dołączył: 29 Sie 2007
Posty: 32
Miasto: września

Post#24 12 Lut 2014 19:38   

Re: [ATmega8][Bascom] - AVT5341 sterownik bramy - 2 skrzydła


Witam!
Trzeba zadbać, żeby wartości C4 była > C5 a C2>C0. Inny problem to brak w programie znieczulenia na impuls prądowy w momencie startu silnika, mogący sięgać nawet 10xI. Jeśli okaże się, że problem wynika z prądu rozruchowego to posiedzę nad tym i wrzucę modyfikację softu.
Powrót do góry
   
sw224
Poziom 8
Poziom 8


Dołączył: 26 Cze 2005
Posty: 25
Miasto: Cieszyn

Post#25 12 Lut 2014 21:41   

Re: [ATmega8][Bascom] - AVT5341 sterownik bramy - 2 skrzydła


Witam to jedne by się zgadzały z drugimi gorzej. Podczas testów właśnie przy starcie zawsze wyłączało zabezpieczenie sinik nigdy za bardzo nie zdążył się rozkręcić a już gowyłączyło tak że chyba będzie to wina tego właśnie impulsu .

Witam ponownie mam już drugi silnik i na nim pobór jest 4 A .Przydało by się jeszcze wyłączanie napędu po ponownym naciśnięciu tego samego przycisku bo przynajmniej u mnie jak włączy się napęd to jedynie idzie go puścić w drugą stronę ale zatrzymać bez krańcówek albo fotokomórki się nie da.
Pozdrawiam.
Powrót do góry
   
leos66
Poziom 9
Poziom 9


Dołączył: 29 Sie 2007
Posty: 32
Miasto: września

Post#26 25 Lut 2014 20:37   

Re: [ATmega8][Bascom] - AVT5341 sterownik bramy - 2 skrzydła


Witam!

Kolejna modyfikacja softu ze znieczuleniem kontroli prądu na 3 cykle programu po starcie.

Odnośnie zatrzymania to oczywiście sprawdzę ale obsługa jednoczesności czyli wciśnięcie otwierania po zamykaniu lub odwrotnie powinna zatrzymać cykl.
Proszę to przetestować i ewentualnie zgłosić uwagi. Postaram się je uwzględnić w kolejnej wersji jeśli będzie konieczna.

Załączniki:
Powrót do góry
   
sw224
Poziom 8
Poziom 8


Dołączył: 26 Cze 2005
Posty: 25
Miasto: Cieszyn

Post#27 26 Lut 2014 16:15   

Re: [ATmega8][Bascom] - AVT5341 sterownik bramy - 2 skrzydła


Witam oczywiście przetestuję dziękuje za modyfikację.
Pozdrawiam
Powrót do góry
   
Google


Google Adsense


Post# 26 Lut 2014 16:15   





Powrót do góry
   
leos66
Poziom 9
Poziom 9


Dołączył: 29 Sie 2007
Posty: 32
Miasto: września

Post#28 01 Mar 2014 20:36   

Re: [ATmega8][Bascom] - AVT5341 sterownik bramy - 2 skrzydła


Witam!
Program powinien przerwać zamykanie/otwieranie w przypadku hazardu sterowania i tak się stanie. Niedoskonałość polega na tym, że prawdopodobnie u kolegi sygnały inicjujące trwają na tyle długo, że nie tylko wyłączają jeden kierunek ale za chwilę załączają przeciwny. Jeśli impuls jest krótszy niż 1s zjawisko nie występuje. Najprostszym rozwiązaniem będzie dopisanie na końcu procedury Res1: polecenia Waitms 1200

Kod Basic4GL - [rozwiń]
[/syntax]
Res1:
Reset Pkzl
Reset Pkol
Reset Pkop
Reset Pkzp
Reset Zam
Reset Otw
Reset Jazda_o
Reset Jazda_z
Czas = 0
Lc_p = 0
Lc_l = 0
Waitms 1200
[syntax=basic4gl]


Nie jest to do końca eleganckie ale powinno działać. Jak znajdę chwilę czasu to napiszę coś mądrzejszego.
Powrót do góry
   
sw224
Poziom 8
Poziom 8


Dołączył: 26 Cze 2005
Posty: 25
Miasto: Cieszyn

Post#29 02 Mar 2014 12:36   

Re: [ATmega8][Bascom] - AVT5341 sterownik bramy - 2 skrzydła


Witam po dodaniu Waitms 1200 zadziałało zatrzymuje pracę po naciśnięciu przeciwnego kierunku . Niestety przeciążenie dalej wyłącza tylko po nieco dłuższym czasie ale i tak nie zdąży włączyć drugiego silnika i już stop , ja będę miał docelowo zabezpieczenie przeciążeniowe mechaniczne ale co dwa to nie jedno.
Pozdrawiam
Powrót do góry
   
leos66
Poziom 9
Poziom 9


Dołączył: 29 Sie 2007
Posty: 32
Miasto: września

Post#30 02 Mar 2014 23:15   

Re: [ATmega8][Bascom] - AVT5341 sterownik bramy - 2 skrzydła


Na chwilę obecną mam propozycję (aby zwiększyć, ale tylko w celch testowych) ilość cykli prgoramu znieczulonych na prąd i spradzić w tym czasie napięcia na pinach pomiaru prądu. No i na tej podstawie dokonać regulacji ograniczeń na potencjometrach. Następnie zmniejszać ilość cykli znieczulenia. Może w kolegi przypadku 3 cykle to zbyt mało. Radzę jadnak nie przesadzać bo to w końcu ma być zabezpieczenie. Czekam na pomyślne wiadomości.
Powrót do góry
   
Napisz nowy temat  Odpowiedz do tematu      Strona Główna -> Forum elektroda.pl -> Mikrokontrolery Ogólne -> Mikrokontrolery AVR -> [ATmega8][Bascom] - AVT5341 sterownik bramy - 2 skrzydła
Strona 1 z 2 Idź do strony 12  Następny
Podobne tematy
Sterownik bramy garażowej Atmega8 (5)
Sterownik bramy, ATMega8, prośba o ocenę płytki (13)
Bascom - sterownik bramy , zapytanie o konfiguracje programowa (18)
[Atmega8][C/AVR Studio 5] Sterownik bramy, niezrozumiałe zachowanie się uC (27)
[ATmega8][Bascom] Sterownik na podczerwień (36)
[Atmega8][Bascom] - Sterownik pieca, menu (12)
[Atmega8][bascom] Sterownik 160 diod led. (43)
[ATmega8][BASCOM] Problem z wyświetlaczem LCD [Sterownik CO] (24)
[Atmega8][BASCOM] Sterownik silnika DC reg. potencjometrem (2)
[Atmega8][Bascom] Sterownik pieca z podajnikiem szufladowym (11)


Administrator || Moderatorzy || Regulamin forum || Regulamin ogólny || Informacja o cookies || Reklama || Kontakt

Page generation time: 0.634 seconds

elektroda.pl temat RSS