Eine andere Uhr oder wenn es eine Schande für den Mikrocontroller ist

In der Schule liebte er Mikroelektronik, ging in den Radioclub und baute mehrere einfache Geräte zusammen. Dann erinnerten sich Universität, Arbeit, Ehe und sehr selten an sein Hobby.

Mit dem Aufkommen des Internets in meinem Haus fand ich die Details über Mikrocontroller heraus, sah mir die Preise an und war bestrebt, etwas auf dem AVR oder STM zu sammeln. Ich habe viele Foren und eine Auswahl von Projekten auf Mikrocontrollern erneut gelesen, aber alles stimmte nicht und ich konnte nicht verstehen, was nicht stimmte. Es scheint eine interessante Sache zu sein: ein Musik-Player, der Dateien von einer Speicherkarte abspielt, oder ein Wecker mit einem Thermometer, aber es gibt noch viel mehr, aber das Gefühl, dass ich das möchte, ist nicht entstanden ...

Ich stieß auf mehrere Artikel über Uhren auf Gasentladungsindikatoren der IN-Serie und dergleichen. Eine Kindheitserinnerung tauchte auf, als ich in einem Geschäft die Zahlen auf der Waage betrachtete, und sie sind dort in Form dünner Drähte getrennt, und einer von ihnen leuchtet.

Es ist entschieden - ich werde die Uhr machen. Gasentladungsanzeigen arbeiten mit einer Spannung von etwa 180 Volt. Für die Koordination mit der Steuerung wird daher am häufigsten der k155id1-Chip verwendet - der einzige Hochspannungs-Chip, ein Binär-Dezimal-Decoder. Um Hochspannung zu erhalten, verwenden die meisten Projekte auch einen separaten spezialisierten PWM-Chip. In vielen Projekten gibt es auch eine Echtzeituhr in Form eines separaten Chips oder einer fertigen Baugruppe.

Als ich die Beschreibung auf der Website des Geschäfts für einen einfachen Atmega8 las, stellte ich mir vor, dass es einen Analog-Digital-Wandler und eine Pulsweitenmodulation, serielle Schnittstellen usw. gibt, die meistens nur zur Ausführung des Taktprogramms verwendet werden, selbst wenn ein Decoder für die Anzeige extern installiert ist. Es war eine Schande für den Mikrocontroller, er ist so "mächtig" und sie erlauben ihm nicht, sich umzudrehen.

Infolgedessen begann ich unter Umgehung der Schaltung sofort, eine Leiterplatte in SprintLayout zu zeichnen, und dieses Paar wurde in ein paar Wochen geboren:

Bild aus E1.ru-Fotoalben

Auf einer Platine ist alles mit Strom versorgt, auf der anderen nur mit Indikatoren:

Bild aus E1.ru-Fotoalben

Der atmega8-Mikrocontroller in diesem Projekt verwendet alle drei Timer, von denen einer asynchron mit einem externen Taktquarz arbeitet. Der Controller selbst arbeitet mit einer Frequenz von 8 Megahertz aus der internen RC-Kette. PWM wird zur Erzeugung von Hochspannung im Aufwärtswandler verwendet, und die Spannung wird über einen Analogeingang gesteuert, und das Tastverhältnis wird bei Bedarf angepasst. Nun, 28 Beine reichten aus, um die vier IN 12-Anzeigen zu beleuchten, und ein paar weitere Glühbirnen blieben übrig.

So sieht es in zusammengesetzter Form aus:

Bild aus E1.ru-Fotoalben

Und es leuchtet auf:

Bild aus E1.ru-Fotoalben

Einige der Controller-Funktionen blieben sicherlich ungenutzt, aber es ist nicht so anstößig, wenn sich keine separate PWM und RTC in der Nähe befinden.

BB fügte einen Teil des Schemas hinzu, gemalt in einem Proteus, das Paar ging hart: Ich


nahm das Schlüsselschema von hier

SI-Projektcode
#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);
}

}
}

Source: https://habr.com/ru/post/de386755/


All Articles