En la escuela le gustaba la microelectrónica, fue al club de radio y montó varios dispositivos simples. Luego la universidad, el trabajo, el matrimonio y muy raramente recordaban su hobby.Con el advenimiento de Internet en mi casa, descubrí los detalles de los microcontroladores, miré los precios y me apasionó mucho recoger algo en el AVR o STM. Releyé muchos foros y selecciones de proyectos en microcontroladores, pero todo estaba mal y no podía entender qué estaba mal. Parece ser algo interesante: un reproductor de música que reproduce archivos de una tarjeta de memoria o un reloj despertador con un termómetro, pero hay mucho más, pero la sensación de que quiero esto no surgió ...Encontré varios artículos sobre relojes con indicadores de descarga de gas de la serie IN y similares, surgió un recuerdo de la infancia cuando en una tienda miré los números en las escalas, y están separados en forma de cables delgados y uno de ellos brilla.Está decidido, haré el reloj. Los indicadores de descarga de gas funcionan a un voltaje de aproximadamente 180 voltios, por lo que para la coordinación con el controlador, el chip k155id1 se usa con mayor frecuencia: el único chip de alto voltaje, un decodificador binario-decimal. Para obtener alto voltaje, la mayoría de los proyectos también usan un chip PWM especializado por separado. Y en muchos proyectos, también hay un reloj en tiempo real en forma de un chip separado o un ensamblaje terminado.Al leer la descripción en el sitio web de la tienda para un Atmega8 simple, imaginé que había un convertidor analógico a digital y modulación de ancho de pulso, interfaces seriales, etc., y que con frecuencia se usan solo para ejecutar el programa de reloj, incluso un decodificador para el indicador está configurado externamente. Fue una lástima para el microcontrolador, es tan "poderoso" y no permiten que cambie.Como resultado, sin pasar por el circuito, inmediatamente comencé a dibujar una placa de circuito impreso en SprintLayout y esta pareja nació en un par de semanas:
en una placa, todo está con energía, en la otra solo indicadores:
El microcontrolador atmega8 en este proyecto utiliza los tres temporizadores, uno de los cuales funciona de forma asíncrona desde un reloj de cuarzo externo. El controlador en sí opera a una frecuencia de 8 megahercios desde la cadena RC interna. PWM se utiliza para generar alto voltaje en el convertidor de refuerzo, y el voltaje se controla mediante una entrada analógica, y el ciclo de trabajo se ajusta si es necesario. Bueno, 28 patas fueron suficientes para iluminar los cuatro indicadores IN 12, y quedaron un par de bombillas más.Así es como se ve cuando se ensambla:
Y se ilumina:
algunas de las funciones del controlador ciertamente no se usaron, pero no es tan molesto cuando no hay PWM y RTC por separado cerca.BB agregó parte del esquema, pintado en un proteus, la pareja se puso difícil:
tomé el esquema clave de aquíCódigo del proyecto 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);
}
}
}