alexlaw
Member
Мне показалось, что еще один микроконтроллер, например в паре с ESP, не будет лишним.
Поэтому решил разобраться с ATTINY2313A-PU.
Вот, что получилось.
Теперь попробую описать мои шаги к этому.
Скетч чтоб не потерялся
схема
Исходные данные
Продолжение следует...
Поэтому решил разобраться с ATTINY2313A-PU.
Вот, что получилось.
Скетч чтоб не потерялся
Код:
//http://arduinolearning.com/code/program-attiny2313-arduino.php
//https://blog.3d-logic.com/2015/01/21/arduino-and-the-tm1637-4-digit-seven-segment-display/
const int clock1 = 6;
const int data1 = 7;
/*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/ /*8*/ /*9*/
//uint8_t digits2[] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f };
uint8_t digits1[] = { 0x3f, 0x30, 0x5b, 0x79, 0x74, 0x6d, 0x6F, 0x38, 0x7f, 0x7D };
unsigned long t;
uint8_t minutes1;
uint8_t seconds1;
byte dot = 128;//двоеточие на дисплее индикатора
void setup() {
// put your setup code here, to run once:
pinMode(clock1, OUTPUT);
pinMode(data1, OUTPUT);
start(clock1,data1);
writeValue(clock1,data1,0x8c);
stop(clock1,data1);
// clear display
write(clock1,data1,0x00, 0x00, 0x00, 0x00);
t=0;
//запускаем таймер
setupInterrupt();
}
void loop() {
if ((t % 2)==0){
dot=128;
} else {dot=0;}
if (t==3600){t=0;}
minutes1 = (byte)((t / 60) % 60);
seconds1 = (byte)(t % 60);
write(clock1,data1,digits1[seconds1 % 10],digits1[seconds1 / 10] | dot,digits1[minutes1 % 10],digits1 [minutes1 / 10]);
delay(5);
}
void write(int clock,int data,uint8_t first, uint8_t second, uint8_t third, uint8_t fourth)
{
start(clock,data);
writeValue(clock,data,0x40);
stop(clock,data);
start(clock,data);
writeValue(clock,data,0xc0);
writeValue(clock,data,first);
writeValue(clock,data,second);
writeValue(clock,data,third);
writeValue(clock,data,fourth);
stop(clock,data);
}
void start(int clock,int data)
{
digitalWrite(clock,HIGH);//send start signal to TM1637
digitalWrite(data,HIGH);
delayMicroseconds(5);
digitalWrite(data,LOW);
digitalWrite(clock,LOW);
delayMicroseconds(5);
}
void stop(int clock,int data)
{
digitalWrite(clock,LOW);
digitalWrite(data,LOW);
delayMicroseconds(5);
digitalWrite(clock,HIGH);
digitalWrite(data,HIGH);
delayMicroseconds(5);
}
bool writeValue(int clock,int data,uint8_t value)
{
for(uint8_t i = 0; i < 8; i++)
{
digitalWrite(clock, LOW);
delayMicroseconds(5);
digitalWrite(data, (value & (1 << i)) >> i);
delayMicroseconds(5);
digitalWrite(clock, HIGH);
delayMicroseconds(5);
}
// wait for ACK
digitalWrite(clock,LOW);
delayMicroseconds(5);
pinMode(data,INPUT);
digitalWrite(clock,HIGH);
delayMicroseconds(5);
bool ack = digitalRead(data) == 0;
pinMode(data,OUTPUT);
return ack;
}
void setupInterrupt()
{
/*В состав таймера/счетчика входят следующие регистры ввода/вывода:
16битный счетный регистр TCNT1;
16битный регистр захвата ICR1;
два 16битных регистра сравнения — OCR1A и OCR1B;
три 8битных регистра управления — TCCR1A, TCCR1B и TCCR1C.
Каждый из 16битных регистров физически размещается в двух регист
рах ввода/вывода, названия которых получаются добавлением к названию
регистра буквы «H» (старший байт) и «L» (младший байт). Счетный
регистр таймера/счетчика T1 TCNT1, например, размещается в регистрах
TCNT1H:TCNT1L.*/
//Разрешение прерывания осуществляется установкой в 1 бита TOIE1
//TIMSK - регистр маски прерываний
TIMSK &= ~(1 << TOIE1);// Clear bit
//OCIE1B - Флаг разрешения прерывания по совпадению "В" Т1
//OCIE1A - Флаг разрешения прерывания по совпадению "А" Т1
TIMSK &= ~((1 << OCIE1A) | (1 << OCIE1B));// Clear bit
//Режим Normal
//Это наиболее простой режим работы 16битного таймера/счетчика.
//В данном режиме счетный регистр функционирует как обычный суммирующий счетчик.
TCCR1A &= ~((1 << WGM11) | (1 << WGM10));
TCCR1B &= ~((1 << WGM13) | (1 << WGM12));
//Fcpu = 8000000 Гц
//Период тактового сигнала микроконтроллера Tcpu = 1/Fcpu
//Период тактового сигнала таймера Т1 равен Tt1 = (1/Fcpu)/k = k/Fcpu
//256/8000000=0.032 мс
//Делим требуемый интервал времени (1000 мс) на длительность одного такта таймера
//1000/0.032=31250
//2^16 + 1 - 31250 = 34287;
//Выбор источника тактового сигнала таймера/счетчика T1 clk I/O /256
//clk I/O
//TCCR1B |= (1 << CS10);// Set bits
//TCCR1B &= ~((1 << CS11) | (1 << CS12));// Clear bit
//clk I/O /8
//TCCR1B |= (1 << CS11);// Set bits
//TCCR1B &= ~((1 << CS10) | (1 << CS12));// Clear bit
//clk I/O /64
//TCCR1B |= (1 << CS11) | (1 << CS10); // Set bits
//TCCR1B &= ~(1 << CS12); // Clear bit
//clk I/O /256
TCCR1B |= (1 << CS12);// Set bits
TCCR1B &= ~((1 << CS10) | (1 << CS11));// Clear bit
//clk I/O /1024
//TCCR1B |= (1 << CS12) | (1 << CS10); // Set bits
//TCCR1B &= ~(1 << CS11); // Clear bit
/* Save value globally for later reload in ISR */
TCNT1=34287;
//Флаг разрешения прерывания по переполнению
TIMSK |= (1 << TOIE1);// Set bits
}
//Install the Interrupt Service Routine (ISR) for Timer1 overflow.
ISR(TIMER1_OVF_vect) {
TCNT1=34287;
t++;
}
схема
Исходные данные
- ATTINY2313A-PU
- WAVGAT ардуино Nano Mini-USB С загрузчика Совместимость Nano 3,0 контроллер CH340 драйвер USB 16 мГц Nano v3.0
- TM1637 светодиодный дисплей модуль 7 сегмент 4 биты 0,36
- Мини USBISP USBASP (MX-USBISP-V4.00 надпись на плате, процессор - мега88)
- Windows 8.1 x64
- Arduino IDE 1.8.2
- Макетная плата
Продолжение следует...