Programem do lampek rowerowych

Coś Ci się zepsuło? Nie chce działać jak powinno? Opisz dokładnie swój problem a postaramy się pomóc...
timothy
Posty: 1
Rejestracja: czwartek 04 gru 2014, 18:23
Lokalizacja: Poznań

Post autor: timothy »

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 :D (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
Awatar użytkownika
Pyra
Site Admin
Posty: 8527
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post autor: Pyra »

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
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
ODPOWIEDZ