Oto mój najnowszy projekt: driver do latarki na pojedynczą diodę.
ATtiny13A sterujący dwoma układami AMC7124.
Założenia:
1. 3 tryby 120mA, 360mA i 720mA
2. krótkie przyciśnięcie przycisku - zmiana trybu
3. długie (2 sek) naciśnięcie to wyłączenie sterownika
4. układ przystosowany do programowania ATtiny wlutowanego na płytce
5. zasilanie to pojedynczy aku 18650
Pierwsze podejście do schematu:
Program sterujący ATtiny:
Kod: Zaznacz cały
/*
* Driver_Alfa_C.cpp
*
* Created: 2014-12-27 13:40:38
* Author: magus
*/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
// set 1MHz
#define F_CPU 1000000L
// power down after 2 sec push
// prescaler set to 64
// 2xF_CPU/64/256 -> 122
#define PWR_DWN_DELAY 122
volatile int timer=0;
volatile char counter=0;
volatile char but_state=0;
volatile char put_to_sleep=0;
//--------------------------
char button_down(){return (PINB&1<<PB3)>0;}
//--------------------------
void tick_counter(){
// counter modulo 4
++counter;
counter&=3;
// update port
PORTB=(PORTB & 252)+counter;
}
//--------------------------
ISR(TIM0_OVF_vect) {
if(++timer>PWR_DWN_DELAY){
// long push -> power down
// 00 to out
counter=3;
tick_counter();
// power down
put_to_sleep=1;
}
}
//--------------------------
ISR(PCINT0_vect){
char bd=button_down();
if(bd){
if(but_state==0){
// start timer
timer=0;
TIMSK0 |=1<<TOIE0;
TCCR0B |= (1<<CS01) | (1<<CS00);
but_state=1;
}
}else{
// check timer
// min delay is 32ms to handle bouncing
if(timer>1){
tick_counter();
// turn off TIM0_OVF
TIMSK0&=253;
// button released
but_state=0;
}
}
}
//--------------------------
//--------------------------
//--------------------------
int main(void)
{
//########### I/O ###########
// PB0-PB1 -> out
DDRB |= (1<<PB0) | (1<<PB1);
// int on pin3
PCMSK |= (1<<PCINT3);
GIMSK |= (1<<PCIE);
// timer int
// prescale timer to 1/64 the clock rate
// TCCR0B |= (1<<CS01) | (1<<CS00);
//##########################
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sei();
while(1){
if(put_to_sleep){
sleep_mode();
put_to_sleep=0;
}
}
}
Czy zworka P0 jest potrzebna? Separuje ATtiny podczas jego programowania.
Czy w ATtiny13 podłączenie wejścia RESET do Vcc przez rezystor jest konieczne?