Di sekolah ia menyukai mikroelektronika, pergi ke klub radio, mengumpulkan beberapa perangkat sederhana. Kemudian universitas, bekerja, menikah dan sangat jarang mengingat hobinya.Dengan munculnya Internet di rumah saya, saya menemukan rincian tentang mikrokontroler, melihat harga, dan ingin mengumpulkan sesuatu di AVR atau STM. Saya membaca kembali banyak forum dan pilihan proyek pada mikrokontroler, tetapi semuanya adalah sesuatu yang salah, dan saya tidak dapat memahami apa yang salah. Tampaknya menjadi hal yang menarik: pemutar musik yang memutar file dari kartu memori, atau jam alarm dengan termometer, tetapi ada banyak lagi, tetapi perasaan yang saya inginkan ini tidak muncul ...Saya menemukan beberapa artikel tentang jam tangan pada indikator debit gas dari seri IN dan sejenisnya, memori masa kanak-kanak muncul seperti di toko saya melihat angka-angka pada timbangan, dan mereka terpisah di sana dalam bentuk kabel tipis dan salah satunya bersinar.Diputuskan - saya akan melakukan jam. Indikator pelepasan gas beroperasi pada tegangan sekitar 180 volt, jadi untuk koordinasi dengan controller, chip k155id1 paling sering digunakan - satu-satunya chip tegangan tinggi, decoder biner-desimal. Untuk mendapatkan tegangan tinggi, sebagian besar proyek juga menggunakan chip PWM khusus. Dan di banyak proyek, ada juga jam waktu nyata dalam bentuk chip terpisah atau perakitan jadi.Membaca deskripsi di situs web toko untuk Atmega8 yang sederhana, saya membayangkan bahwa ada konverter analog-ke-digital dan modulasi lebar-pulsa, antarmuka serial, dll., Dan mereka paling sering digunakan hanya untuk menjalankan program jam, bahkan decoder untuk indikator dipasang secara eksternal. Itu memalukan bagi mikrokontroler, itu sangat "kuat" dan mereka tidak membiarkannya berbalik.Sebagai hasilnya, melewati sirkuit, saya segera mulai menggambar papan sirkuit tercetak di SprintLayout dan yang ini lahir dalam beberapa minggu:
Di satu papan semuanya dengan kekuatan, di sisi lain hanya indikator:
Mikrokontroler atmega8 dalam proyek ini menggunakan ketiga pengatur waktu, salah satunya bekerja secara sinkron dari kuarsa jam eksternal. Pengontrol itu sendiri beroperasi pada frekuensi 8 megahertz dari rantai RC internal. PWM digunakan untuk menghasilkan tegangan tinggi dalam booster converter, dan tegangan dikontrol oleh input analog, dan siklus kerja disesuaikan jika perlu. Nah, 28 kaki sudah cukup untuk menerangi empat indikator IN 12, dan beberapa bola lampu lainnya masih ada.Begini tampilannya ketika dirakit:
Dan menyala:
Beberapa fungsi pengontrol tentu tetap tidak digunakan, tetapi tidak begitu mengganggu ketika tidak ada PWM dan RTC yang terpisah di dekatnya.BB menambahkan bagian dari skema, dicat dengan proteus, pasangan itu menjadi sulit: Saya
mengambil skema utama dari siniKode proyek SI#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
//
void init_pwm (void)
{
//
DDRB=0xFF; //OC1A,OC1B,OC2 โ
TCCR1A=(1<<COM1B1)|(1<<WGM10)|(1<<WGM11); // OC1A
TCCR1B=(1<<CS10)|(1<<WGM12)|(1<<WGM13); // OC1B
//
OCR1A=250;
OCR1B=215; // 0 200/170 250/215
}
volatile unsigned char second, minute, hour, h, m;
int voltage_ADC, dimm;
// 2
ISR (TIMER2_OVF_vect)
{
if(second++ >= 59)
{
second = 0;
minute++;
}
if(minute > 59)
{
minute = 0;
hour++;
}
if(hour > 23)
hour = 0;
//set_time(hour,minute,second); //
}
ISR (TIMER0_OVF_vect)
{
PORTC |= (1 << PC2);
}
ISR (ADC_vect)//
{
voltage_ADC = ADCW;//
if(voltage_ADC<260 && OCR1A<300){OCR1A++;OCR1B=OCR1A-dimm;}
if(voltage_ADC>260 && OCR1A>170){OCR1A--;OCR1B=OCR1A-dimm;}
ADCSR |= (1<<ADSC);//
}
//
int main(void)
{
unsigned char r;
unsigned char mode;
init_pwm(); //
PORTD=0x00; // D 0, D
DDRD=0xFF; // D , 5
PORTC = 0b00000000; DDRC = 0b11101111;
TIMSK &= ~(1 << OCIE2)|(1 << TOIE2); // T2
ASSR |= (1 << AS2); // T2
TCNT2 = 0; //
TCCR2 |= (1 << CS22)|(0 << CS21)|(1 << CS20); // 128-(32768/128 = 256 /c)
TIMSK |= (1 << TOIE2); // 2
TCCR0|=(0<<CS02)|(1<<CS00);
//TIMSK |= (1 << TOIE0); // 2
//ads
ADMUX|= (1<<REFS0)|(1<<REFS1)|(1<<MUX2); //
//ADCSRA|=(1<<ADEN)|(1<<ADFR)|(1<<ADIE)|(1<<ADPS1)|(1<<ADPS0);
ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
sei(); //
hour = 23; //
minute = 13;
second = 23;
mode=1;
while (1) //
{
/*
PORTD |= (1 << PD1); // 1
PORTD &= ~ (1 << PD1); // 1
*/
dimm=35;
PORTC &= ~ (1 << PC2);
if(mode==1){m=minute; h=hour;}
if(mode==2){m=second; h=minute;}
if(mode==3){m=voltage_ADC%100; h=voltage_ADC/100;};
for (r=0;r<4;r++)
{
if(r==1)
{
PORTC |= (1 << PC3);//
if (m/10==0) PORTD |= (1 << PD3);//0
if (m/10==1) PORTD |= (1 << PD2);//1
if (m/10==2) PORTB |= (1 << PB1);//2
if (m/10==3) PORTB |= (1 << PB3);//3
if (m/10==4) PORTB |= (1 << PB4);//4
if (m/10==5) PORTD |= (1 << PD5);//5
if (m/10==6) PORTD |= (1 << PD6);//6
if (m/10==7) PORTD |= (1 << PD7);//7
if (m/10==8) PORTB |= (1 << PB0);//8
if (m/10==9) PORTD |= (1 << PD4);//9
}
if(r==0)
{
PORTC |= (1 << PC5);//
if (m%10==0) PORTD |= (1 << PD3);//0
if (m%10==1) PORTD |= (1 << PD2);//1
if (m%10==2) PORTB |= (1 << PB1);//2
if (m%10==3) PORTB |= (1 << PB3);//3
if (m%10==4) PORTB |= (1 << PB4);//4
if (m%10==5) PORTD |= (1 << PD5);//5
if (m%10==6) PORTD |= (1 << PD6);//6
if (m%10==7) PORTD |= (1 << PD7);//7
if (m%10==8) PORTB |= (1 << PB0);//8
if (m%10==9) PORTD |= (1 << PD4);//9
}
if(r==2)
{
PORTD |= (1 << PD1);//
if (h/10==0) PORTD |= (1 << PD3);//0
if (h/10==1) PORTD |= (1 << PD2);//1
if (h/10==2) PORTB |= (1 << PB1);//2
if (h/10==3) PORTB |= (1 << PB3);//3
if (h/10==4) PORTB |= (1 << PB4);//4
if (h/10==5) PORTD |= (1 << PD5);//5
if (h/10==6) PORTD |= (1 << PD6);//6
if (h/10==7) PORTD |= (1 << PD7);//7
if (h/10==8) PORTB |= (1 << PB0);//8
if (h/10==9) PORTD |= (1 << PD4);//9
}
if(r==3)
{
PORTD |= (1 << PD0);//
if (h%10==0) PORTD |= (1 << PD3);//0
if (h%10==1) PORTD |= (1 << PD2);//1
if (h%10==2) PORTB |= (1 << PB1);//2
if (h%10==3) PORTB |= (1 << PB3);//3
if (h%10==4) PORTB |= (1 << PB4);//4
if (h%10==5) PORTD |= (1 << PD5);//5
if (h%10==6) PORTD |= (1 << PD6);//6
if (h%10==7) PORTD |= (1 << PD7);//7
if (h%10==8) PORTB |= (1 << PB0);//8
if (h%10==9) PORTD |= (1 << PD4);//9
}
_delay_ms(3);
PORTC &= ~ (1 << PC3);
PORTC &= ~ (1 << PC1);
PORTC &= ~ (1 << PC5);
PORTD &= ~ (1 << PD1);
PORTB=0x00;PORTC=0x00;PORTD=0x00;
_delay_ms(1);
}
}
}