Driver z trybami - nowe spojrzenie

co i jak zrobiłem...
Slawek75
Posty: 16
Rejestracja: sobota 21 mar 2009, 07:53
Lokalizacja: Śląsk

Post autor: Slawek75 »

Wielkie dzięki za info o Driverze. Już zamówiłem sobie 2 szt.
Teraz tylko napisać oprogramowanie i można poszaleć ;-)
Muszę się teraz zastanowić nad jakimś body.
Awatar użytkownika
ElSor
Site Admin
Posty: 5041
Rejestracja: niedziela 13 wrz 2009, 12:52
Lokalizacja: Ozimek

Post autor: ElSor »

Analizujac sobie ten powyzszy kod doszedlem do wniosku ze wpis

Kod: Zaznacz cały

If T <> L Then Goto Pamiec 'zapis trybu do eprom jeśli się zmienił
powoduje ciagle odczyty zawartosci eepromu (chyba ze sie myle) ale jesli mam racje to zbyt zdrowe nie jest to dla pamieci i nalezaloby wprowadzic dodatkowa zmienna.

Mam tez pytanie dlaczego tryb L1 przypisuje tylko wartosc 253 do zmiennej A a nie max czyli 255 ?
Slawek75
Posty: 16
Rejestracja: sobota 21 mar 2009, 07:53
Lokalizacja: Śląsk

Post autor: Slawek75 »

Witam

Wczoraj przetestowałem idee obsługi sterownika jednym przyciskiem na podstawie programu Pyra 2.1. Cały program przeniosłem do ATmega8 z drobnymi modyfikacjami. Po pierwsze usunąłem wpisy dotyczące obsługi pamięci, oraz poprawiłem wpisy ustalenia wartości PWM dla trybu, bo program nie zawsze poprawnie przechodził z trybu do trybu. Ponadto dodałem obsługę drugiego kanału PWM, bo w założeniach będę miał 2 drivery i 2 emitery. Zmieniłem także logikę wejścia sterującego, o ile w pierwotnych założeniach program reagował na zanik napięcia na bazie tranzystora sterującego, czyli reagował na logiczńą 1 na wejściu kontrolera, to po programowych modyfikacjach reaguje na dowarcie tego wejścia do masy. Ułatwi to sterowanie osobnym przyciskiem (można powiedzieć, że zrobiłem z pozytywu-negatyw logiczny). Całość sprawuje się dobrze, chociaż jak to mówił mi pewien wykładowca jeszcze nie jest debiloodporne. Czasami po przejściu do najniższego lub najwyższgo trybu - czyli najbardziej skrajnych i wciśnięciu dłużej przycisku sterującego zaczynają się dziwne żeczy dziać z wyjściami sterowania PWM - muszę to jeszcze przejżeć. Poza tym chciałbym jeszcze dorobić na jednym z trybów Power-Down (co dla Atmegi8L taktowanego 4Mhz i zasilanego ok 3V daje prąd pobierany poniżej 0,5uA) celem uzyskania elektronicznego wyłacznika, tyklo nie wiem jeszcze jaki prąd będą pobierać same driwery w tym trybie, czyli kontroler power-down, drivery logiczne 0 na wejsciu sterowania PWM.
A teraz co do obsługi samej obsługi klawiatury jednoprzyciskowej to muszą powidzieć, że jest bardzo intuicyjna, pod warunkiem, że wcześniej się nauczymy dobierać czasy reakcji wciśnięcia przycisku - długość i czas kliku. Ogólnie jestem zadowolony, chociaż jeszcze nie podpiąłem driverów z emiterami, tylko testowałem z podłączonymi diodami Led na wyjściach obu kanałów PWM.
Pozdrawiam
Awatar użytkownika
jezjacek
Posty: 305
Rejestracja: czwartek 03 wrz 2009, 10:23
Lokalizacja: Białe Błota
Kontakt:

Post autor: jezjacek »

To może dołącz kod źródłowy.
Awatar użytkownika
Pyra
Site Admin
Posty: 8527
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post autor: Pyra »

ElSor pisze: Analizujac sobie ten powyzszy kod doszedlem do wniosku ze wpis

Kod: Zaznacz cały

If T <> L Then Goto Pamiec 'zapis trybu do eprom jeśli się zmienił
powoduje ciagle odczyty zawartosci eepromu (chyba ze sie myle) ale jesli mam racje to zbyt zdrowe nie jest to dla pamieci i nalezaloby wprowadzic dodatkowa zmienna.

Wnioski są poprawne do pewnego momentu. Odczyt EEpromu nie powoduje jego "zużycia" tylko zapis. Dlatego zapis dokonywany jest tylko w momencie wykrycia rozbieżności pomiędzy trybem pamiętanym a aktualnie ustalonym.
Można by wprowadzić dodatkowy podprogram realizujący jednorazowo porównanie po zmianie trybu, lecz rozbudowało by to program i nie jest to konieczne ze względów, które podałem wyżej.

ElSor pisze: Mam tez pytanie dlaczego tryb L1 przypisuje tylko wartosc 253 do zmiennej A a nie max czyli 255 ?
No cóż, organoleptycznie stwierdziłem, że taka wartość minimalnej jasności mi odpowiada najbardziej.
Tu wartości są odwrotnie proporcjonalne. Tak jakoś kiedy zacząłem pisać program umieściłem "clear up" i tak już zostało ;) w momencie kiedy zamiast diodą podłączoną do plusa i portu zacząłem starować MOSfetem odwróciły się proporcje....

umieszczony kod źródłowy jest w zasadzie sprawdzeniem idei sterowania i nie jest dopracowany do końca, dlatego umieściłem kod źródłowy.
Slawek75 pisze: Po pierwsze usunąłem wpisy dotyczące obsługi pamięci, oraz poprawiłem wpisy ustalenia wartości PWM dla trybu, bo program nie zawsze poprawnie przechodził z trybu do trybu.
Możesz wyjaśnić, nie za bardzo wiem co masz na myśli?

Wykrywanie klików jeszcze nie jest doskonałe, lecz u mnie działało poprawnie.

Pozdrawiam
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
Slawek75
Posty: 16
Rejestracja: sobota 21 mar 2009, 07:53
Lokalizacja: Śląsk

Post autor: Slawek75 »

Chodzi mi o to, że po dojściu do któregokolwiek ograniczenia program przestawał reagować, tzn można było dalej klikać i nic się nie działo. Np przechodząc do trybu High i klikając dalej czasami program przeskakiwał do najniższego trybu, a czasami się blokował. Być może że związane jest to z samym kontrolerem. Dopiero po dokonaniu wpisu:

Plus: 'tryb w górę
Incr L
If L > 6 Then L = 6
Goto Wlacz
Minus: 'tryb w dół
Decr L
If L < 1 Then L = 1

program poprawnie zaczął się przełączać (przynajmniej u mnie na ATmega8) i działa stabilnie.
Awatar użytkownika
Pyra
Site Admin
Posty: 8527
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post autor: Pyra »

Witam
Troche to dziwne, bo mój fragment:

If L > 5 Then L = 1
If L < 1 Then L = 5

Znakomicie sobie radził ze sprawdzaniem krańców zakresu i po dojściu do końca przeskakiwał na początek i odwrotnie, nie mam z tym problemów.

A dlaczego 1 i 6 czyżbyś dodał jakiś tryb?

Wrzuć może listing to przeanalizujemy.

Pozdrawiam
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
Slawek75
Posty: 16
Rejestracja: sobota 21 mar 2009, 07:53
Lokalizacja: Śląsk

Post autor: Slawek75 »

Tak dodałem jesden tryb migacza. Oto i listing

$regfile = "m8def.dat"
Dim A As Byte 'wartość PWM
Dim B As Byte 'licznik klików
Dim C As Byte 'zmienna pomocnicza
Dim L As Byte 'wskaźnik trybu

Config Pinb.1 = Output 'wy PWM1
Config Pinb.2 = Output 'wy Pwm2
Config Pind.2 = Input 'we sterujące

'A = 0
'B = 0
'L = 0
'C = 0

Set Portd.2 'podciągnięcie wejscia
Goto Wlacz 'ustalenie wartości PWM

Pwm:
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 8 'konfig TIMERA 1 jako PWM

Do
Pwm1a = A 'ustawienie wartości komparatora PWM
Pwm1b = A 'ustawienie wartości komparatora PWM
For C = 1 To 50 'pętla odczekująca na zapis trybu po zmianie
If Pind.2 = 0 Then Goto Zmiana 'sprawdzenie stanu pinb3
Waitms 4
Next C
Loop

Zmiana: 'rozpoznanie klików
B = 0 'zerowanie licznika klików
Zegar: 'pomiar czasu klika
For C = 1 To 50
If Pind.2 = 1 Then Goto Pomiar
Waitms 1
Next C

Kierunek:
If B = 1 Then Goto Plus
If B = 2 Then Goto Minus
Goto Pwm

Plus: 'tryb w górę
Incr L
If L > 6 Then L = 6
Goto Wlacz
Minus: 'tryb w dół
Decr L
If L < 1 Then L = 1

Wlacz: 'ustalenie wartości pwm dla trybu
If L < 1 Then L = 6
If L > 5 Then L = 6

If L = 1 Then Goto Migacz1
If L = 2 Then A = 127
If L = 3 Then A = 30
If L = 4 Then A = 5
If L = 5 Then Goto Migacz0
If L = 6 Then Goto Wylacz
Goto Pwm

Wylacz:
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Disconnect , Compare B Pwm = Disconnect , Prescale = 1
Do
For C = 1 To 50
If Pind.2 = 0 Then Goto Zmiana
Waitms 1
Next C
For C = 1 To 50
If Pind.2 = 0 Then Goto Zmiana
Waitms 1
Next C
Loop

Migacz0:
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1
Do
Pwm1a = 5
Pwm1b = 5
For C = 1 To 5 'czas ząłączenia
If Pind.2 = 0 Then Goto Zmiana
Waitms 1
Next C
Pwm1a = 0
Pwm1b = 0
For C = 1 To 250 'czas przerwy
If Pind.2 = 0 Then Goto Zmiana
Waitms 1
Next C
Loop

Migacz1:
Config Timer1 = Timer
Do
Set Portb.1
Set Portb.2
Waitms 10
Reset Portb.1
Reset Portb.2
Waitms 10
Set Portb.1
Set Portb.2
Waitms 10
Reset Portb.1
Reset Portb.2
Waitms 10
Set Portb.1
Set Portb.2
For C = 1 To 20 'czas załączenia
If Pind.2 = 0 Then Goto Zmiana
Waitms 1
Next C
Reset Portb.1
Reset Portb.2
For C = 1 To 250 'czas przerwy
If Pind.2 = 0 Then Goto Zmiana
Waitms 1
Next C
Loop

Pomiar:
If C < 10 Then Goto Pwm
B = B + 1
Waitms 5
For C = 1 To 50
If Pind.2 = 0 Then Goto Zegar
Waitms 1
Next C
Goto Kierunek

End



Wiele nie dodałem. Muszę tylko przerobić jescze procedurę wyłącz i doprowadzić do trybu power-down.
Awatar użytkownika
Pyra
Site Admin
Posty: 8527
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post autor: Pyra »

Slawek75 pisze: Wiele nie dodałem. Muszę tylko przerobić jescze procedurę wyłącz i doprowadzić do trybu power-down.
Ja oraz kurczak mieliśmy problemy przy wejściu w power down.
Po uśpieniu na wyjściowym porcie procka utrzymywało się napięcie zasilania (stan wysoki), ja konfigurowałem Timer jako Timer i dopiero Power down. Na ATTiny się sprawdziło.

Pozdrawiam

PS: chyba już wiem o co chodziło z rozpoznaniem klika, ATtiny ma ustawiony preskaler zegara systemowego 8, (CKDIV8) przez co wszystkie instrukcje "wait" działają dłużej, co w moim programie wziąłem pod uwagę, z tego względu powinieneś wszystkie instrukcje "waitms" powiększyć o stosunek różnicy zegarów w ATtiny (około 1,2mHz) i ATmega8 (to juz Ty będziesz wiedział ile ustawiłeś)
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
Slawek75
Posty: 16
Rejestracja: sobota 21 mar 2009, 07:53
Lokalizacja: Śląsk

Post autor: Slawek75 »

Kontroler był taktowany na poziomie 1Mhz z wewnętrznego RC oscylatora, więc czasy były porównywalne. Dopiero dodanie ograniczeń w obrębie naliczania wartości L "Plus" i "Minus" pomogly.
Co do trybu power-down to jeszcze nie próbowałem. Zacznę w momencie, gdy będę miał pomierzone wartości prądów przetwornic (dopiero czekam na przesyłkę). Być może szkoda będzie czasu na tworzenie takiego trybu, jak się okaże , że same drivery biorą kilka rzędów większy I w trybie PWM=0.

Teraz zerknąłem do fusebitów dla ATTiny13 i faktycznie przy taktowaniu 1.2Mhz i podziale systemowym przez 8 u Ciebie działało dużo (tak z 8 razy) wolniej.
Awatar użytkownika
Pyra
Site Admin
Posty: 8527
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post autor: Pyra »

Witam

W związku z tym, że idą święta, soft dostał ciało ;)
Bazą stał się projekt płytki jaki wykonałem modyfikując RC-G2, jednak tam był użyty ATtiny 13V w obudowie SSU (dzięki Calineczka), a ja mam kilka sztuk w obudowie SU (większa) więc trochę pokombinowałem. Mc Gyver był by ze mnie dumny ;)
Obrazek

Po przylutowaniu elementów i opiłowaniu PCB do wymaganych 14mm, gdyż tyle miejsca jest wewnątrz piguły Small Sun C-61, przyszła pora na połączenie tego w całość.
Obrazek

Przy okazji wyszło, że oryginalna przetwornica posiada ograniczenie prądu, które było fabrycznie ominięte podczas montażu.... :roll:
Podczas montażu dokonałem przeróbki, lutując przewód ujemny do punktu "OUT-" zamiast do minusa baterii.
Obrazek

Po dolutowaniu jeszcze kabelka pomiędzy + zasilania a bazę tranzystora sterującego zmianą trybów, złożyłem wszystko razem i..... żadnych niespodzianek, oprogramowanie chodzi poprawnie, tzn zgodnie z założeniami ;) Jedynym minusem, jest zmiana trybu po upływie pół sekundy od kliknięcia, gdyż tyle czasu program odczekuje na następny klik, w przypadku jego braku, zmienia tryb w górę, dwa kliki tryb w dół.
Darek doradzał, że jego rozwiązanie najpierw zmienia tryb, a potem czeka na kolejny klik, czyli zmiana trybu jest natychmiastowa, ewentualnie potem następuje zmiana grupy, lecz u mnie to by było trochę mniej praktyczne, gdyby po pierwszym kliku tryb wskoczył na wyższy, a przy drugim skoczył dwa tryby w dół :roll:

Teraz wystarczy tylko podłączyć pomiar napięcia przez wewnętrzny ADC i można w łatwy sposób zrealizować "oszczędzanie" baterii przy zbliżaniu się do wyczerpania, przez obniżanie trybu. Ale to już będzie następny projekt :roll:

Pozdrawiam
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
Slawek75
Posty: 16
Rejestracja: sobota 21 mar 2009, 07:53
Lokalizacja: Śląsk

Post autor: Slawek75 »

Witam
Ja niestety jeszcze nie wykonałem obudowy, ale już testowałem razem z przetwornicami. Dodałem jeszczd tryb power-down. Wartości PWM oczywiście tylko do testów poniżej zamieszczam listing:

'Program sterujący PWM w 2 kanalach
'Oscillator RC=1MHz
'hfuse=9D
'lfuse=E1

$regfile = "m8def.dat"
Dim A As Byte 'wartość PWM
Dim B As Byte 'licznik klików
Dim C As Word 'zmienna pomocnicza
Dim L As Byte 'wskaźnik trybu

Config Pinb.1 = Output 'wy PWM1
Config Pinb.2 = Output 'wy Pwm2
Config Pind.2 = Input 'we sterujące

Enable Interrupts
Config Int0 = Low Level

Set Portd.2
Goto Wlacz

Pwm:
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 8
Do
Pwm1a = A
Pwm1b = A
For C = 1 To 50
If Pind.2 = 0 Then Goto Zmiana
Waitms 5
Next C
Loop

Zmiana:
B = 0
Zegar:
For C = 1 To 50
If Pind.2 = 1 Then Goto Pomiar
Waitms 1
Next C

Kierunek:
If B = 1 Then Goto Plus
If B = 2 Then Goto Minus
Goto Pwm

Plus:
Incr L
If L > 6 Then L = 6
Goto Wlacz
Minus:
Decr L
If L < 1 Then L = 1

Wlacz:
If L < 1 Then L = 6
If L > 5 Then L = 6

If L = 1 Then Goto Strobo
If L = 2 Then A = 255
If L = 3 Then A = 50
If L = 4 Then A = 10
If L = 5 Then Goto Migacz0
If L = 6 Then Goto Wylacz
Goto Pwm

Wylacz:
Config Int0 = Low Level
Enable Int0
Reset Portb.1
Reset Portb.2
Powerdown
Disable Int0
Do
A = 0
Reset Portb.1
Reset Portb.2
For C = 1 To 200
If Pind.2 = 0 Then Goto Zmiana
Waitms 25
Next C
A = 0
Reset Portb.1
Reset Portb.2
For C = 1 To 200
If Pind.2 = 0 Then Goto Zmiana
Waitms 25
Next C
Loop

Migacz0:
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 8
Do
Pwm1a = 5
Pwm1b = 5
For C = 1 To 10
If Pind.2 = 0 Then Goto Zmiana
Waitms 1
Next C
For C = 1 To 400
If Pind.2 = 0 Then Goto Zmiana
Pwm1a = 0
Pwm1b = 0
Waitms 1
Next C
Loop

Strobo:
Config Timer1 = Timer
Do
For C = 1 To 5
Set Portb.1
Set Portb.2
Waitms 10
Reset Portb.1
Reset Portb.2
Waitms 10
Next C
For C = 1 To 10
If Pind.2 = 0 Then Goto Zmiana
Waitms 1
Next C
For C = 1 To 250
If Pind.2 = 0 Then Goto Zmiana
Waitms 1
Next C
Loop

Pomiar:
If C < 10 Then Goto Pwm
B = B + 1
Waitms 5
For C = 1 To 50
If Pind.2 = 0 Then Goto Zegar
Waitms 1
Next C
Goto Kierunek

End

Pozdrawiam
Awatar użytkownika
Pyra
Site Admin
Posty: 8527
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post autor: Pyra »

Wylacz:
Config Int0 = Low Level
Enable Int0
Reset Portb.1
Reset Portb.2
Powerdown
Disable Int0
Wyłącza Ci LEDy? bo mi za Chiny Ludowe nie chciało, port zostawał z wysokim poziomem...
Chyba, że to zależy od procka :roll:

Mam małą propozycję, wydaje mi się, że praktyczniej będzie wyłączać trzema klikami, bo wtedy będziesz miał możliwość wyłączenia latarki z każdego trybu i nie będziesz musiał przelatywać wszystkich. Wystarczy przy liniach plus i minus dołożyć :

If B = 3 Then Goto Wylacz

W końcu po to jest licznik klików

Pozdrawiam
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
Marcio
Posty: 31
Rejestracja: środa 01 kwie 2009, 09:22
Lokalizacja: Czeski Cieszyn

Post autor: Marcio »

Witam szanownych specjalistow! ;)
Jestem zachwycony mozliwoscia programowania driwerkow. Nie wychodze z fascynacji!
Szukam driverka dla mojej XP-G R5:
- 3 tryby: LOW (0,01A) MID (0,7A) HIGH (1,5A) (albo mozliwosc ustawic tryby jak w Akoray??)
- pamiec na ostatni tryb
- przelaczanie do innego trybu przez szybki dwuklik
- zasilanie 1x18650
- dobra regulacja
- sygnalizacja rozladowanego akusa
Jakby kto dla mnie cos takiego wyprodukowal, to sie chetnie odwdziecze.
Awatar użytkownika
Calineczka
Posty: 7578
Rejestracja: niedziela 11 lis 2007, 20:19
Lokalizacja: Wejherowo
Kontakt:

Post autor: Calineczka »

ODPOWIEDZ