bLEDd13 - driver programowalny na ATtiny13
Dla sterownika AK-A1
https://www.fasttech.com/p/1122401
Jak obliczyć wartość w setup.h
#define BATT_LEVEL 134 // Napiecie przy ktorym zadziala zabezpieczenie
No chyba że jest identyczne z racji tych samych rezystorów...
https://www.fasttech.com/p/1122401
Jak obliczyć wartość w setup.h
#define BATT_LEVEL 134 // Napiecie przy ktorym zadziala zabezpieczenie
No chyba że jest identyczne z racji tych samych rezystorów...
Zestaw rowerowy:
Światła mijania/drogi publiczne - L2P 2,8A noctigon + daszek/ s2+ 3*xpl optyka owalna
Światła drogowe/teren - C8 3*xp-l 4,2A ledil 35mm
Światła mijania/drogi publiczne - L2P 2,8A noctigon + daszek/ s2+ 3*xpl optyka owalna
Światła drogowe/teren - C8 3*xp-l 4,2A ledil 35mm
Spytałem, bo softy z wieloklikami zazwyczaj mają takie wymaganie.
Swoją drogą co oznacza ignorowanie pierwszego kliknięcia? Chodzi o to samo co w fabrycznym sofcie, który jeśli latarka jest włączona przez dłuższą chwilę niejako ignoruje pierwsze kliknięcie, co związane jest z realizacją pamięci ostatniego trybu?
Swoją drogą co oznacza ignorowanie pierwszego kliknięcia? Chodzi o to samo co w fabrycznym sofcie, który jeśli latarka jest włączona przez dłuższą chwilę niejako ignoruje pierwsze kliknięcie, co związane jest z realizacją pamięci ostatniego trybu?
https://gitaradiy.pl - zapraszam
Dzięki. Chętnie zmodyfikowałbym Twoją wersję tak, żeby wykorzystywała taki dodatkowy kondensator i w ten sposób nie byłby pomijany pierwszy klik, co moim zdaniem jest lepszą opcją. Byłbym wdzięczny za sugestie odnośnie tego, co należałoby zmieinć jeśli taka modyfikacja jest możliwa bez gruntownych przeróbek.
Coś próbowałem na szybko zrobić sam usuwając kilka linijek i dodając trochę kodu z innej wersji (oznaczyłem odpowiednio usunięte/dodane), ale jeszcze nie jestem w stanie sprawdzić jak działa i na 99% nie działa. Jeszcze nie przeanalizowałem i nie zrozumiałem w pełni oryginanego kodu, więc to taki strzał.
main.c
Coś próbowałem na szybko zrobić sam usuwając kilka linijek i dodając trochę kodu z innej wersji (oznaczyłem odpowiednio usunięte/dodane), ale jeszcze nie jestem w stanie sprawdzić jak działa i na 99% nie działa. Jeszcze nie przeanalizowałem i nie zrozumiałem w pełni oryginanego kodu, więc to taki strzał.
main.c
Kod: Zaznacz cały
/*
* bLEDd 1.0
* Created on: 01-03-2013
* Autor: barney
* swiatelka.pl
*/
#include <avr/io.h>
#include <util/delay.h>
#include <avr/eeprom.h>
#include <avr/interrupt.h>
#include "setup.h"
#define AMC (1<<PB1)
#define PWM OCR0B
#define TRYB (cfg_ram.ktory_tryb>>1)
#define STP_SLT(SLT) (((SLOT##SLT##_STRB)<<3)+(SLOT##SLT##_LVL)-1)
//dodane
#define CAP_PIN PB3
#define CAP_CHANNEL 0x03 // MUX 03 corresponds with PB3 (Star 4)
#define CAP_DIDR ADC3D // Digital input disable bit corresponding with PB3
#define ADC_CHANNEL 0x01 // MUX 01 corresponds with PB2
#define ADC_DIDR ADC1D // Digital input disable bit corresponding with PB2
#define ADC_PRSCL 0x06 // clk/64
#define CAP_THRESHOLD 130
//koniec dodane
typedef uint8_t u08;
typedef struct
{
u08 jasnosci [8];
u08 strb_time1 [3];
u08 strb_factor1 [3];
u08 strb_time2 [3];
u08 strb_factor2 [3];
} TSET;
typedef struct
{
u08 ktory_tryb;
u08 ile_trybow;
u08 klikniecia;
u08 rower;
u08 sloty [8];
u08 menu;
u08 menu_lvl [3];
} TCFG;
TSET set_epr EEMEM =
{
{LVL1, LVL2, LVL3, LVL4, LVL5, LVL6, LVL7, LVL8},
{STRB1_TIME1, STRB2_TIME1, STRB3_TIME1},
{STRB1_FACTOR1, STRB2_FACTOR1, STRB3_FACTOR1},
{STRB1_TIME2, STRB2_TIME2, STRB3_TIME2},
{STRB1_FACTOR2, STRB2_FACTOR2, STRB3_FACTOR2}
};
TCFG cfg_epr EEMEM =
{
(AKTUALNY_SLOT - 1)<<1,
SLOTY_WLACZONE - 1,
0,
TRYB_ROWEROWY,
{STP_SLT(1), STP_SLT(2), STP_SLT(3), STP_SLT(4), STP_SLT(5), STP_SLT(6), STP_SLT(7), STP_SLT(8)},
0,
{0, 0, 0}
};
TCFG cfg_ram;
TSET set_ram;
u08 czas, licznik, jasnosc_obecna, numer_stroboskopu;
volatile u08 wdt_epr=0;
inline void odczytaj_epr (void)
{
eeprom_read_block(&cfg_ram, &cfg_epr, sizeof(cfg_ram));
eeprom_read_block(&set_ram, &set_epr, sizeof(set_epr));
cfg_ram.ile_trybow&=0b00000111; // Proste poprawianie struktury na wypedek blednego zapisu EEPROMU
}
inline void zapisz_epr (void) {eeprom_write_block(&cfg_ram, &cfg_epr, sizeof(cfg_ram));}
inline void wyzeruj_menu (void)
{
cfg_ram.menu=0; // Wylaczenie programowania
cfg_ram.menu_lvl[1]=0;
cfg_ram.klikniecia=0; // Wyzerowanie licznika klikniec
}
inline void ignoruj_klik (void)
{
cfg_ram.ktory_tryb&=0b11111110;
cfg_ram.klikniecia=0;
}
int main (void)
{
DDRB |= AMC; // kierunek pinu AMC wyjsciowy
TCCR0A |= (1<<WGM01) | (1<<WGM00) | (1<<COM0B1); // fast PWM, Clear OC0B on Compare Match
TCCR0B |= (1<<CS00); // prescaler 1
odczytaj_epr(); // Odczytanie zawartosci EEPROM
if (!cfg_ram.rower) // Jezeli driver nie jest zablokowany
{
if ((cfg_ram.menu==3) || (cfg_ram.menu_lvl[1]>3)) // Rozpiska z programowania
{ // Programowanie slotow
if (cfg_ram.menu_lvl[1]<4) cfg_ram.sloty[cfg_ram.menu_lvl[0]]=(cfg_ram.menu_lvl[1]<<3) | cfg_ram.menu_lvl[2];
if (cfg_ram.menu_lvl[1]==4) // Programowanie slotu rowerowego
{
cfg_ram.rower=1;
cfg_ram.ktory_tryb=(cfg_ram.menu_lvl[0]<<1);
}
else
cfg_ram.ktory_tryb=0; // Ustawianie slotu pierwszego jako aktywny
if (cfg_ram.menu_lvl[1]==5) cfg_ram.ile_trybow=cfg_ram.menu_lvl[0];
wyzeruj_menu(); // Programowanie ilosci aktywnych slotow
}
else
{ // Obsluga klikniec
if (cfg_ram.ktory_tryb & 0b00000001) cfg_ram.ktory_tryb+=2; else cfg_ram.ktory_tryb++;
if (TRYB>cfg_ram.ile_trybow) cfg_ram.ktory_tryb=1;
}
if (cfg_ram.klikniecia==MENU_IN) // Programowanie
{
for (licznik=0; licznik<MENU_SIG_RPT; licznik++)
{
PWM=MENU_LVL1; _delay_ms (MENU_TIME1);
PWM=MENU_LVL2; _delay_ms (MENU_TIME2);
}
cfg_ram.menu++;
for (licznik=0; licznik<MENU_CHOOSE_RPT; licznik++)
for (czas=0; czas<8; czas++)
{
cfg_ram.menu_lvl[cfg_ram.menu-1]=czas;
zapisz_epr();
PWM=set_ram.jasnosci[czas]; _delay_ms(MENU_CHOOSE_TIME);
}
wyzeruj_menu(); // Jezeli nic nie wybrano to wychodzimy
}
}
else
if (cfg_ram.klikniecia==ROWER_STOP) // Wyjscie z trybu rowerowego
{
cfg_ram.rower=0;
cfg_ram.klikniecia=0;
}
// Start up ADC for capacitor pin
DIDR0 |= (1 << CAP_DIDR); // disable digital input on ADC pin to reduce power consumption
ADMUX = (1 << REFS0) | (1 << ADLAR) | CAP_CHANNEL; // 1.1v reference, left-adjust, ADC3/PB3
ADCSRA = (1 << ADEN ) | (1 << ADSC ) | ADC_PRSCL; // enable, start, prescale
//dodane
// Wait for completion
while (ADCSRA & (1 << ADSC));
// Start again as datasheet says first result is unreliable
ADCSRA |= (1 << ADSC);
// Wait for completion
while (ADCSRA & (1 << ADSC));
if (ADCH > CAP_THRESHOLD) {
// Indicates they did a short press, go to the next mode
cfg_ram.klikniecia++;
}
else
{
ignoruj_klik();
}
ADCSRA &= ~(1<<7); //ADC off
// Charge up the capacitor by setting CAP_PIN to output
DDRB |= (1 << CAP_PIN); // Output
PORTB |= (1 << CAP_PIN); // High
//koniec dodane
//cfg_ram.klikniecia++; //usunięte
zapisz_epr(); // Zapis EEPROM
ADMUX |= (1<<REFS0)| (1<<MUX0) | (1<<ADLAR); // 1.1V, PB2, 8bit
ADCSRA |= (1<<ADEN) | (1<<ADPS2) | (1<<ADPS0)|(1<<ADSC);// Wlaczenie ADC, prescaler 32, wykonanie pomiaru
WDTCR |= (1<<WDTIE)| (1<<WDP1) | (1<<WDP0); // Watchdog - przerwanie, prescaler 8 -> przerwanie co ~128ms
sei(); // Odblokowanie przerwan
licznik=0; // Ustalanie jasnosci i obecnosci stroboskopu
jasnosc_obecna=set_ram.jasnosci[cfg_ram.sloty[TRYB] & 0b00000111];
numer_stroboskopu=cfg_ram.sloty[TRYB]>>3;
if (numer_stroboskopu)
{
numer_stroboskopu--;
licznik=1;
}
while (1) // Swiecenie
{
if (wdt_epr)
{
wdt_epr=0;
//ignoruj_klik(); //usunięte
zapisz_epr();
//PWM=jasnosc_obecna/IGN_CLICK_FACTOR; _delay_ms(IGN_CLICK_SIG); //usunięte
}
if (licznik)
{
for (czas=0; (czas<set_ram.strb_time1[numer_stroboskopu]) && (!wdt_epr); czas++) {PWM=jasnosc_obecna/set_ram.strb_factor1[numer_stroboskopu]; _delay_ms (STRB_TIME1);}
for (czas=0; (czas<set_ram.strb_time2[numer_stroboskopu]) && (!wdt_epr); czas++) {PWM=jasnosc_obecna/set_ram.strb_factor2[numer_stroboskopu]; _delay_ms (STRB_TIME2);}
}
else
PWM=jasnosc_obecna;
}
}
ISR (WDT_vect)
{
static u08 batt=0, ign=0; // Ignorowanie klikniecia
if (ign<IGN_CLICK_TIME) if (++ign==IGN_CLICK_TIME) wdt_epr=1;
if ((++batt==BATT_PAUSE) & (!wdt_epr)) // Sprawdzanie napiecia baterii
{
batt=0;
if (ADCH<BATT_LEVEL) {PWM=jasnosc_obecna/BATT_FACTOR; _delay_ms(BATT_TIME);}
ADCSRA |= (1<<ADSC); // Podanie startu ADC
}
}
Lekko strzelając (bo to 1.5 roczny program jest) to wystarczy, że zamienisz tą linijkę na taką, która będzie do który_tryb dodawać 2 tylko wtedy, kiedy po wstaniu procka kondensator był naładowany. Reszta zmian do odpowiednia obsługa tego kondka, przebudowa warunków zapisu eepromu (będzie można go rzadziej zapisywać) i kombinacje jak to w 1KB upchnąć
Generalnie polecam napisać swój driver, mniej nerwów stracisz
Kod: Zaznacz cały
if (cfg_ram.ktory_tryb & 0b00000001) cfg_ram.ktory_tryb+=2; else cfg_ram.ktory_tryb++;
Generalnie polecam napisać swój driver, mniej nerwów stracisz
Witam
Pozdrawiam
Jeśli sam chcesz go wykonać to tu masz schemat funkcjonalny (drugi, czyli oryginalny), ale soft ładujemy do sterowników serii nanjing opartych o 4 - 8 układów AMC i ATtiny13A.marcinleb pisze:Czy mógłbym dostać jakiś prosty schemat układu z którym zadziała ten soft?
Pozdrawiam
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
Piszmy po polsku, wszak jesteśmy Polakami.
Poprawiono link na życzenie.
Na dysku znalazłem jakąś wersję z niepasującą sumą kontrolną do tego co było oryginalnie wrzucone, wrzucam jako załącznik
Na dysku znalazłem jakąś wersję z niepasującą sumą kontrolną do tego co było oryginalnie wrzucone, wrzucam jako załącznik
- Załączniki
-
- bLEDd13.zip
- v2?
- (21.88 KiB) Pobrany 40 razy
Dzień dobry
Jest to mój pierwszy post na forum. Mam pytanie bo jestem absolutnie zielony jeśli chodzi o programowanie. Udało mi się zrozumieć jak przesyłać *.hex i *.eep na ATtiny13A za pomocą Arduino a także jak zrobić *.hex z kodu źródłowego C. Na BLF jest instrukcja i wystarczy skopiować kod do atmel studio i stworzyć hex a tutaj nie mam pojęcia jak zrobić eep i hex bo wyskakuje mi że:
1. Jak moża stworzyć z tego znów hex i eep po dostosowaniu do mojego przypadku?
2. Czy atmel studio jest okej czy trzeba inny program?
BŁAGAM o jakiś rady i dziękuję.
A chciałbym tylko dodać, że ten program jest genialny ale muszę zmienić ten parametr z baterią bo przy 3.26V już mi zaczyna migać, że słaba bateria.
Jest to mój pierwszy post na forum. Mam pytanie bo jestem absolutnie zielony jeśli chodzi o programowanie. Udało mi się zrozumieć jak przesyłać *.hex i *.eep na ATtiny13A za pomocą Arduino a także jak zrobić *.hex z kodu źródłowego C. Na BLF jest instrukcja i wystarczy skopiować kod do atmel studio i stworzyć hex a tutaj nie mam pojęcia jak zrobić eep i hex bo wyskakuje mi że:
1. Jak moża stworzyć z tego znów hex i eep po dostosowaniu do mojego przypadku?
2. Czy atmel studio jest okej czy trzeba inny program?
BŁAGAM o jakiś rady i dziękuję.
A chciałbym tylko dodać, że ten program jest genialny ale muszę zmienić ten parametr z baterią bo przy 3.26V już mi zaczyna migać, że słaba bateria.
Wg mnie bardzo ok, szczególnie w przypadku posiadania programatorów/debugerów od Atmela.apacz93 pisze:2. Czy atmel studio jest okej czy trzeba inny program?
Ad1 F_CPU już wiesz gdzie zdefiniować, do tego musisz oczywiście stworzyć plik "setup.h" w tym samym projekcie no i później już chyba nie będzie problemu.