bLEDd13 - driver programowalny na ATtiny13

co i jak zrobiłem...
Awatar użytkownika
vin324pl
Posty: 1000
Rejestracja: czwartek 14 lis 2013, 10:27
Lokalizacja: Myślenice

Post 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...
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
cob
Posty: 144
Rejestracja: wtorek 25 gru 2012, 22:17
Lokalizacja: Warszawa
Kontakt:

Post autor: cob »

Czy kod źródłowy tego sterownika jest jeszcze gdzieś dostępny? Link w pierwszym poście niestety nie działa.
Awatar użytkownika
barney
Posty: 268
Rejestracja: niedziela 18 lip 2010, 11:47
Lokalizacja: Łask

Post autor: barney »

Poprawiłem link.
cob
Posty: 144
Rejestracja: wtorek 25 gru 2012, 22:17
Lokalizacja: Warszawa
Kontakt:

Post autor: cob »

Dzięki. Czy ten kod wymaga dolutowania dodatkowego kondensatora pełniącego rolę pamięci?
Awatar użytkownika
barney
Posty: 268
Rejestracja: niedziela 18 lip 2010, 11:47
Lokalizacja: Łask

Post autor: barney »

Nie wymaga. Gdyby wymagał posiadał by w opisie gdzie go trzeba wlutować ;)
cob
Posty: 144
Rejestracja: wtorek 25 gru 2012, 22:17
Lokalizacja: Warszawa
Kontakt:

Post 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?
Awatar użytkownika
barney
Posty: 268
Rejestracja: niedziela 18 lip 2010, 11:47
Lokalizacja: Łask

Post 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.
cob
Posty: 144
Rejestracja: wtorek 25 gru 2012, 22:17
Lokalizacja: Warszawa
Kontakt:

Post 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;
Awatar użytkownika
barney
Posty: 268
Rejestracja: niedziela 18 lip 2010, 11:47
Lokalizacja: Łask

Post 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:
marcinleb
Posty: 1
Rejestracja: środa 07 sty 2015, 22:14
Lokalizacja: Polska

Post autor: marcinleb »

Witam was wszystkich. Czy mógłbym dostać jakiś prosty schemat układu z którym zadziała ten soft?
Awatar użytkownika
Pyra
Site Admin
Posty: 8527
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post 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
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
Awatar użytkownika
barney
Posty: 268
Rejestracja: niedziela 18 lip 2010, 11:47
Lokalizacja: Łask

Post 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
Załączniki
bLEDd13.zip
v2?
(21.88 KiB) Pobrany 40 razy
apacz93
Posty: 2
Rejestracja: niedziela 05 sty 2020, 02:04
Lokalizacja: Katowice

Post 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.
ptja
Posty: 2414
Rejestracja: poniedziałek 31 gru 2012, 12:44
Lokalizacja: Łódź

Post autor: ptja »

--
pozdrawiam,
Jarek Andrzejewski
Awatar użytkownika
ElSor
Site Admin
Posty: 5041
Rejestracja: niedziela 13 wrz 2009, 12:52
Lokalizacja: Ozimek

Post 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.
ODPOWIEDZ