Strona 2 z 3

: wtorek 09 gru 2014, 21:08
autor: vin324pl
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...

: poniedziałek 22 gru 2014, 09:55
autor: cob
Czy kod źródłowy tego sterownika jest jeszcze gdzieś dostępny? Link w pierwszym poście niestety nie działa.

: poniedziałek 22 gru 2014, 11:59
autor: barney
Poprawiłem link.

: poniedziałek 22 gru 2014, 12:15
autor: cob
Dzięki. Czy ten kod wymaga dolutowania dodatkowego kondensatora pełniącego rolę pamięci?

: poniedziałek 22 gru 2014, 12:25
autor: barney
Nie wymaga. Gdyby wymagał posiadał by w opisie gdzie go trzeba wlutować ;)

: poniedziałek 22 gru 2014, 13:05
autor: cob
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?

: poniedziałek 22 gru 2014, 14:19
autor: barney
cob pisze: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
Tak.

: poniedziałek 22 gru 2014, 22:11
autor: cob
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

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  			&#40;1<<PB1&#41;
#define PWM  			OCR0B
#define TRYB 			&#40;cfg_ram.ktory_tryb>>1&#41;
#define STP_SLT&#40;SLT&#41;	&#40;&#40;&#40;SLOT##SLT##_STRB&#41;<<3&#41;+&#40;SLOT##SLT##_LVL&#41;-1&#41;
//dodane
#define CAP_PIN     PB3
#define CAP_CHANNEL 0x03	// MUX 03 corresponds with PB3 &#40;Star 4&#41;
#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
&#123;
	u08 jasnosci    	&#91;8&#93;;
	u08 strb_time1  	&#91;3&#93;;
	u08 strb_factor1	&#91;3&#93;;
	u08 strb_time2     	&#91;3&#93;;
	u08 strb_factor2   	&#91;3&#93;;
&#125; TSET;
typedef struct
&#123;
	u08 ktory_tryb;
	u08 ile_trybow;
	u08 klikniecia;
	u08 rower;
	u08 sloty          	&#91;8&#93;;
	u08 menu;
	u08 menu_lvl		&#91;3&#93;;
&#125; TCFG;
TSET set_epr EEMEM =
&#123;
		&#123;LVL1, LVL2, LVL3, LVL4, LVL5, LVL6, LVL7, LVL8&#125;,
		&#123;STRB1_TIME1,      STRB2_TIME1,      STRB3_TIME1&#125;,
		&#123;STRB1_FACTOR1,    STRB2_FACTOR1,    STRB3_FACTOR1&#125;,
		&#123;STRB1_TIME2,      STRB2_TIME2,      STRB3_TIME2&#125;,
		&#123;STRB1_FACTOR2,    STRB2_FACTOR2,    STRB3_FACTOR2&#125;
&#125;;
TCFG cfg_epr EEMEM =
&#123;
		&#40;AKTUALNY_SLOT - 1&#41;<<1,
		SLOTY_WLACZONE - 1,
		0,
		TRYB_ROWEROWY,
		&#123;STP_SLT&#40;1&#41;, STP_SLT&#40;2&#41;, STP_SLT&#40;3&#41;, STP_SLT&#40;4&#41;, STP_SLT&#40;5&#41;, STP_SLT&#40;6&#41;, STP_SLT&#40;7&#41;, STP_SLT&#40;8&#41;&#125;,
		0,
		&#123;0, 0, 0&#125;
&#125;;
TCFG cfg_ram;
TSET set_ram;
u08 czas, licznik, jasnosc_obecna, numer_stroboskopu;
volatile u08 wdt_epr=0;

inline void odczytaj_epr &#40;void&#41;
&#123;
	eeprom_read_block&#40;&cfg_ram, &cfg_epr, sizeof&#40;cfg_ram&#41;&#41;;
	eeprom_read_block&#40;&set_ram, &set_epr, sizeof&#40;set_epr&#41;&#41;;
	cfg_ram.ile_trybow&=0b00000111;							// Proste poprawianie struktury na wypedek blednego zapisu EEPROMU
&#125;
inline void zapisz_epr &#40;void&#41; &#123;eeprom_write_block&#40;&cfg_ram, &cfg_epr, sizeof&#40;cfg_ram&#41;&#41;;&#125;
inline void wyzeruj_menu &#40;void&#41;
&#123;
	cfg_ram.menu=0;											// Wylaczenie programowania
	cfg_ram.menu_lvl&#91;1&#93;=0;
	cfg_ram.klikniecia=0;									// Wyzerowanie licznika klikniec
&#125;
inline void ignoruj_klik &#40;void&#41;
&#123;
	cfg_ram.ktory_tryb&=0b11111110;
	cfg_ram.klikniecia=0;
&#125;

int main &#40;void&#41;
&#123;
	DDRB   |= AMC;                      					// kierunek pinu AMC wyjsciowy
    TCCR0A |= &#40;1<<WGM01&#41; | &#40;1<<WGM00&#41; | &#40;1<<COM0B1&#41;;		// fast PWM, Clear OC0B on Compare Match
    TCCR0B |= &#40;1<<CS00&#41;;         							// prescaler 1

	odczytaj_epr&#40;&#41;;                            				// Odczytanie zawartosci EEPROM
	if &#40;!cfg_ram.rower&#41;										// Jezeli driver nie jest zablokowany
	&#123;
		if &#40;&#40;cfg_ram.menu==3&#41; || &#40;cfg_ram.menu_lvl&#91;1&#93;>3&#41;&#41;	// Rozpiska z programowania
		&#123;													// Programowanie slotow
			if &#40;cfg_ram.menu_lvl&#91;1&#93;<4&#41; cfg_ram.sloty&#91;cfg_ram.menu_lvl&#91;0&#93;&#93;=&#40;cfg_ram.menu_lvl&#91;1&#93;<<3&#41; | cfg_ram.menu_lvl&#91;2&#93;;
			if &#40;cfg_ram.menu_lvl&#91;1&#93;==4&#41;						// Programowanie slotu rowerowego
			&#123;
				cfg_ram.rower=1;
				cfg_ram.ktory_tryb=&#40;cfg_ram.menu_lvl&#91;0&#93;<<1&#41;;
			&#125;
			else
				cfg_ram.ktory_tryb=0;						// Ustawianie slotu pierwszego jako aktywny
			if &#40;cfg_ram.menu_lvl&#91;1&#93;==5&#41; cfg_ram.ile_trybow=cfg_ram.menu_lvl&#91;0&#93;;
			wyzeruj_menu&#40;&#41;;									// Programowanie ilosci aktywnych slotow
		&#125;
		else
		&#123;													// Obsluga klikniec
			if &#40;cfg_ram.ktory_tryb & 0b00000001&#41; cfg_ram.ktory_tryb+=2; else cfg_ram.ktory_tryb++;
			if &#40;TRYB>cfg_ram.ile_trybow&#41; cfg_ram.ktory_tryb=1;
		&#125;
		if &#40;cfg_ram.klikniecia==MENU_IN&#41;					// Programowanie
		&#123;
			for &#40;licznik=0; licznik<MENU_SIG_RPT; licznik++&#41;
				&#123;
					PWM=MENU_LVL1;  _delay_ms &#40;MENU_TIME1&#41;;
					PWM=MENU_LVL2;	_delay_ms &#40;MENU_TIME2&#41;;
				&#125;
			cfg_ram.menu++;
			for &#40;licznik=0; licznik<MENU_CHOOSE_RPT; licznik++&#41;
				for &#40;czas=0; czas<8; czas++&#41;
				&#123;
					cfg_ram.menu_lvl&#91;cfg_ram.menu-1&#93;=czas;
					zapisz_epr&#40;&#41;;
					PWM=set_ram.jasnosci&#91;czas&#93;;  _delay_ms&#40;MENU_CHOOSE_TIME&#41;;
				&#125;
			wyzeruj_menu&#40;&#41;;									// Jezeli nic nie wybrano to wychodzimy
		&#125;
	&#125;
	else
		if &#40;cfg_ram.klikniecia==ROWER_STOP&#41;					// Wyjscie z trybu rowerowego
		&#123;
			cfg_ram.rower=0;
			cfg_ram.klikniecia=0;
		&#125;

	// Start up ADC for capacitor pin
	DIDR0 |= &#40;1 << CAP_DIDR&#41;;							// disable digital input on ADC pin to reduce power consumption
	ADMUX  = &#40;1 << REFS0&#41; | &#40;1 << ADLAR&#41; | CAP_CHANNEL; // 1.1v reference, left-adjust, ADC3/PB3
	ADCSRA = &#40;1 << ADEN &#41; | &#40;1 << ADSC &#41; | ADC_PRSCL;   // enable, start, prescale

	//dodane
	// Wait for completion
	while &#40;ADCSRA & &#40;1 << ADSC&#41;&#41;;
	// Start again as datasheet says first result is unreliable
	ADCSRA |= &#40;1 << ADSC&#41;;
	// Wait for completion
	while &#40;ADCSRA & &#40;1 << ADSC&#41;&#41;;
	if &#40;ADCH > CAP_THRESHOLD&#41; &#123;
		// Indicates they did a short press, go to the next mode
		cfg_ram.klikniecia++;
	&#125;
	else
	&#123;
		ignoruj_klik&#40;&#41;;
	&#125;
	ADCSRA &= ~&#40;1<<7&#41;; //ADC off

	// Charge up the capacitor by setting CAP_PIN to output
	DDRB  |= &#40;1 << CAP_PIN&#41;;	// Output
    PORTB |= &#40;1 << CAP_PIN&#41;;	// High
	//koniec dodane

    //cfg_ram.klikniecia++;	//usunięte
    zapisz_epr&#40;&#41;;											// Zapis EEPROM

	ADMUX  |= &#40;1<<REFS0&#41;| &#40;1<<MUX0&#41;  | &#40;1<<ADLAR&#41;;  		// 1.1V, PB2, 8bit
	ADCSRA |= &#40;1<<ADEN&#41; | &#40;1<<ADPS2&#41; | &#40;1<<ADPS0&#41;|&#40;1<<ADSC&#41;;// Wlaczenie ADC, prescaler 32, wykonanie pomiaru
	WDTCR  |= &#40;1<<WDTIE&#41;| &#40;1<<WDP1&#41;  | &#40;1<<WDP0&#41;;			// Watchdog - przerwanie, prescaler 8 -> przerwanie co ~128ms
	sei&#40;&#41;;													// Odblokowanie przerwan

	licznik=0;												// Ustalanie jasnosci i obecnosci stroboskopu
	jasnosc_obecna=set_ram.jasnosci&#91;cfg_ram.sloty&#91;TRYB&#93; & 0b00000111&#93;;
	numer_stroboskopu=cfg_ram.sloty&#91;TRYB&#93;>>3;
	if &#40;numer_stroboskopu&#41;
	&#123;
		numer_stroboskopu--;
		licznik=1;
	&#125;


	while &#40;1&#41;												// Swiecenie
	&#123;
		if &#40;wdt_epr&#41;
		&#123;
			wdt_epr=0;
			//ignoruj_klik&#40;&#41;; //usunięte
			zapisz_epr&#40;&#41;;
			//PWM=jasnosc_obecna/IGN_CLICK_FACTOR;  _delay_ms&#40;IGN_CLICK_SIG&#41;; //usunięte
		&#125;
		if &#40;licznik&#41;
		&#123;
			for &#40;czas=0; &#40;czas<set_ram.strb_time1&#91;numer_stroboskopu&#93;&#41; && &#40;!wdt_epr&#41;; czas++&#41; &#123;PWM=jasnosc_obecna/set_ram.strb_factor1&#91;numer_stroboskopu&#93;;  _delay_ms &#40;STRB_TIME1&#41;;&#125;
			for &#40;czas=0; &#40;czas<set_ram.strb_time2&#91;numer_stroboskopu&#93;&#41; && &#40;!wdt_epr&#41;; czas++&#41; &#123;PWM=jasnosc_obecna/set_ram.strb_factor2&#91;numer_stroboskopu&#93;;  _delay_ms &#40;STRB_TIME2&#41;;&#125;
		&#125;
		else
			PWM=jasnosc_obecna;
	&#125;
&#125;
ISR &#40;WDT_vect&#41;
&#123;
	static u08 batt=0, ign=0;								// Ignorowanie klikniecia
	if &#40;ign<IGN_CLICK_TIME&#41;	if &#40;++ign==IGN_CLICK_TIME&#41; wdt_epr=1;
	if &#40;&#40;++batt==BATT_PAUSE&#41; & &#40;!wdt_epr&#41;&#41;					// Sprawdzanie napiecia baterii
	&#123;
		batt=0;
		if &#40;ADCH<BATT_LEVEL&#41; &#123;PWM=jasnosc_obecna/BATT_FACTOR;  _delay_ms&#40;BATT_TIME&#41;;&#125;
		ADCSRA |= &#40;1<<ADSC&#41;;								// Podanie startu ADC
	&#125;
&#125;

: poniedziałek 22 gru 2014, 23:18
autor: barney
Lekko strzelając (bo to 1.5 roczny program jest) to wystarczy, że zamienisz tą linijkę

Kod: Zaznacz cały

if &#40;cfg_ram.ktory_tryb & 0b00000001&#41; cfg_ram.ktory_tryb+=2; else cfg_ram.ktory_tryb++;
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 :mrgreen:

: sobota 17 sty 2015, 19:25
autor: marcinleb
Witam was wszystkich. Czy mógłbym dostać jakiś prosty schemat układu z którym zadziała ten soft?

: sobota 17 sty 2015, 19:33
autor: Pyra
Witam
marcinleb pisze:Czy mógłbym dostać jakiś prosty schemat układu z którym zadziała ten soft?
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.
Pozdrawiam

: niedziela 11 lis 2018, 13:57
autor: barney
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

: poniedziałek 06 sty 2020, 21:46
autor: apacz93
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:
Obrazek

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.

: poniedziałek 06 sty 2020, 22:04
autor: ptja

: poniedziałek 06 sty 2020, 22:50
autor: ElSor
apacz93 pisze:2. Czy atmel studio jest okej czy trzeba inny program?
Wg mnie bardzo ok, szczególnie w przypadku posiadania programatorów/debugerów od Atmela.
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.