Witam wszystkich.
Na początku wspomnę że pracę z programowaniem i pisaniem programów zaczynam właśnie od tego programu. Nigdy wcześniej nie programowałem ani nie zajmowałem się programowaniem ani budowaniem układów elektronicznych także jestem prawie całkowitym laikiem. Choć powiem że spędziłem nad przebudową tego programu i układu kilkanaście godzin.
Pozwoliłem dla własnych celów wykorzystać ów programik do sterowania oświetleniem do swojego roweru. Do oświetlenia roweru zostaną wykorzystane 3 diody Power LED, Jedna 3W wraz z kolimatorem na przód roweru, druga o mocy 1 W również z kolimatorem na tył roweru i trzecia jako gadżet będzie zamontowana pod siodełkiem jako podświetlanie roweru (moc 3W w kolorze niebieskim). Zmodyfikowałem ten programik pod własne potrzeby (kod poniżej). Sterownik pracuje w dwóch podstawowych trybach + 2 tryby pomocnicze.
1. Stroboskop na przód i tył a podświetlanie roweru oświetlenie narastające od 0 - 100% i malejące od 100- 0%.
2. Światło 100% stałe na przód i stroboskop na tył podświetlenie jak wyżej
3. Tryb pomocniczy 1(używany w momencie gdy napięcie na bat. spadnie poniżej pewnego napięcia) stroboskop 2hz z wyłączonym całkowicie podświetlaniem
4. Tryb pomocniczy 2 który ma za zadanie wyłączyć wszystkie diody w momencie gdy napięcie spadnie poniżej poziomu krytycznego.
Tyle jeżeli chodzi o opis, czas na pytania:
1. Wydaje mi się że moje zmiany w programiku sprawiły że sterownik nie zawsze (jeżeli w ogóle) nie będzie sprawdzał napięcia na ogniwie (na czym mi bardzo zależy aby chronić ogniwo), jak zmodyfikować ten programik aby jednak ogniwo było chronione?
2. Jak prawidłowo dodać dwa warunki do ochrony ogniwa, Jeżeli dodaje drugi warunek "If U1 < 705 Then Goto Awaryjny " wówczas sterownik nie działa...
3. Czy da się ten kod w pewnym stopniu zoptymalizować? Chciałbym dołożyć kilka trybów i za dużo miejsca niestety już nie ma (ok 16% wolnej przestrzeni, mikroprocesor Attiny13A)
Oto kodzik, część kodu jest wygaszona apostrofem tak aby ewentualnie moc
'ATtiny 13A 9,6MHz divide 8
'ADC1 pomiar napięcia zasilania (Uz - 0,6)/4
'PB0 - Kanał PWM
'PB1 - wyjście na przód roweru
'PB4 - wyjście na tył roweru
'PB3 - we klik
Dim B As Byte 'licznik klików
Dim C As Byte 'zmienna pomocnicza
Dim L As Byte 'wskaźnik trybu
Dim U1 As Word 'zmierzone napięcie ogniwa, napięcie średnie
Dim U As Word 'suma 8 pomiarów
Config Portb.0 = Output 'wy PWMA 700mA
Config Portb.1 = Output
Config Portb.4 = Output 'wy PWMB 350mA
Config Pinb.2 = Input 'we ADC
Config Pinb.3 = Input 'we sterujące
Gosub Wylaczanie_diod 'wylaczenie diod, po zalaczeniu zasilania nic sie nie dzieje
Goto Pwm
Wlacz: 'ustalenie wartości PWM
If L > 4 Then L = 1 'sprawdzanie zakresu trybów
If L < 1 Then L = 4
On L Goto Pwm , Tryb1 , Tryb2 , Awaryjny , Wylaczenie 'skok do ustawienia artości trybu
Pwm: 'konfig przetwornika
Config Adc = Single , Prescaler = 8 , Reference = Internal
Gosub Nap 'wyczyszczenie bufora ADC
U = 0
Gosub Zero
Do 'zapełnienie sumy pomiarów do średniej
Gosub Nap
Incr C
Loop Until C = 7
Config Timer0 = Pwm , Compare A Pwm = Clear Down , Prescale = 1 'konfig PWM
Pocz:
Do 'pętla główna
Gosub Zero 'Zerowanie licznika czasu
Do 'pętla odczekująca na zapis trybu po zmianie
If Pinb.3 = 0 Then Goto Zmiana 'sprawdzenie klika
Gosub 20ms 'odjęcie średniej wartości od sumy pomiarów
Gosub Nap
U = U - U1
'If U1 < 1000 Then Goto Wylaczenie 'sprawdzanie min napięcia aku (tu dzielnik 10k /2,7k)
If U1 < 705 Then Goto Awaryjny
Incr C
Loop Until C = 200
Loop
Zmiana: 'rozpoznanie klików
B = 0 'zerowanie licznika klików
Stop Adc 'zatrzymanie przetwornika ADC
Zegar: 'pomiar czasu klika
Gosub Zero
Do
If Pinb.3 = 1 Then Goto Pomiar
Gosub 10ms
Incr C
Loop Until C = 150 'max czas klika
Kierunek:
On B Goto Pwm , Plus , Minus 'skok do procedur obsługi klików
Goto Pwm
Plus: 'tryb w górę
Incr L
Goto Wlacz
Minus: 'tryb w dół
Decr L
Goto Wlacz
Pomiar: 'sprawdzanie min czasu przerwy
If C < 5 Then Goto Pwm
B = B + 1
Gosub 20ms
Gosub Zero
Do
If Pinb.3 = 0 Then Goto Zegar 'oczekiwanie na kolejny klik
Gosub 10ms
Incr C
Loop Until C = 25
Goto Kierunek
Tryb1:
Gosub Resetowanie
Do
For B = 0 To 255 Step 15
If Pinb.3 = 0 Then Goto Zmiana
Pwm0a = B
Gosub Miganie5hz
Next B
For B = 255 To 0 Step -15
If Pinb.3 = 0 Then Goto Zmiana
Pwm0a = B
Gosub Miganie5hz
Next B
Loop
Tryb2:
Portb.1 = 0
Do
For B = 0 To 255 Step 15
If Pinb.3 = 0 Then Goto Zmiana
Pwm0a = B
Gosub Miganie_tyl
Next B
For B = 255 To 0 Step -15
If Pinb.3 = 0 Then Goto Zmiana
Pwm0a = B
Gosub Miganie_tyl
Next B
Loop
Awaryjny:
Pwm0a = 0
Gosub Resetowanie
Do
If Pinb.3 = 0 Then Goto Zmiana
Gosub Miganie2hz
Loop
Wylaczenie:
Pwm0a = 0
Gosub Wylaczanie_diod
Goto Pwm
Nap:
U1 = Getadc(1) ' pomiar napięcia aku
U = U + U1
U1 = U
Shift U1 , Right , 3 'wylicznie średniej wartości, dzielenie przez 8
Return
10ms:
Waitms 10 'opóźnienie 10ms
Return
20ms: 'opóźnienie 20ms
Waitms 20
Return
Zero:
C = 0
Return
Miganie_tyl: ' miganie tylko tylne swiatlo
Toggle Portb.4
Waitms 200
Return
Miganie2hz:
Toggle Portb.1
Toggle Portb.4
Waitms 500
Return
Miganie5hz:
Toggle Portb.1
Toggle Portb.4
Waitms 200
Return
Wylaczanie_diod:
Portb.1 = 1
Portb.4 = 1
Return
Resetowanie: ' potrzebne aby synchronizować diody
Reset Portb.1
Reset Portb.4
Return
End 'KONIEC
Programem do lampek rowerowych
Witam
Wydzieliłem z tematu PRzeróbka AK-47
Ad. 1. Sterownik nie sprawdza napięcia, gdyż dzieje się to w "pętli głównej", która jest na zawsze opuszczana włączeniu trybu.
Ad. 2. Jak mierzysz napięcie? Co masz na myśli, pisząc o drugim warunku?
Ad. 3. Można zoptymalizować, ale niewiele, dlatego przeszedłem na język "C". Podstawą jest wyrzucenie pamięciożernych instrukcji do jednego podprogramu np. Waitms... Piszesz podprogram:
czekaj:
Waitms 100
Return
Potem wykonujesz go 2 lub 5 x w programach wymagających 200 czy 500ms.
Pozdrawiam
Wydzieliłem z tematu PRzeróbka AK-47
Ad. 1. Sterownik nie sprawdza napięcia, gdyż dzieje się to w "pętli głównej", która jest na zawsze opuszczana włączeniu trybu.
Ad. 2. Jak mierzysz napięcie? Co masz na myśli, pisząc o drugim warunku?
Ad. 3. Można zoptymalizować, ale niewiele, dlatego przeszedłem na język "C". Podstawą jest wyrzucenie pamięciożernych instrukcji do jednego podprogramu np. Waitms... Piszesz podprogram:
czekaj:
Waitms 100
Return
Potem wykonujesz go 2 lub 5 x w programach wymagających 200 czy 500ms.
Pozdrawiam
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
Piszmy po polsku, wszak jesteśmy Polakami.