08.11.2011 залил исправленную прошивку, теперь тамбло не мерцает
Вложенный файл:
Имя файла:
081111.zip
Размер файла:1 KB
На плате не нарисованы резисторы от выводов МК к сегментам индикатора, ну забыл я их нарисовать, разрезал дорожки и допаял.
С выхода TL431 должно быть 2.7в
Программа работает, но видно как мирцает табло, так что, хотите можете сами править, не хотите, можете ждать вечность, пока я это сделаю.
Вложенный файл:
Имя файла:
pokazom.zip
Размер файла:17 KB
#include <mega8.h>
#include <delay.h>
#define ADC_VREF_TYPE 0x00
int afr[73] = {100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,153,154,155,156,157,158,159,160,161,163,165,166,168,169,170,172,173}; // массив AFR
int adc[73] = {132,134,136,139,143,145,148,151,154,157,160,162,165,168,171,173,176,178,180,183,185,187,190,192,194,196,198,200,203,205,207,209,211,213,214,216,218,219,221,223,225,227,229,230,231,233,234,236,237,238,239,240,241,242,243,244,245,246,247,247,248,249,250,251,252,253,254,255}; //массив ADC
int i,adcread,afrres;
/* перед компиляцией, препроцессор компилятора вставит вместо этой строчки текст "хидера" delay.h - этот файл содержит функции для создания пауз в программе.
Теперь чтобы сделать паузу вам нужно лишь написать :
delay_ms(x); // сделать паузу x милиСек
delay_us(x); // сделать паузу x микроСек
x - число от 0 до 65535 (тип unsigned int) */
#define a 32 // Эти макросы содержат числа, соответствующие двойке,
#define b 128 // возведенной в степень, равной номеру "ножки" того
#define c 2 // порта, к которому подключен сегмент индикатора с
#define d 8 // одноименным макросу названием. Для того, чтобы вывести
#define e 16 // какую-либо цифру на индикатор, нужно отправить в порт
#define f 64 // число 255 минус сумму соответствующих сегментам макросов.
#define g 1 // Эти числа позволяют сделать программу независимой от подключения.
#define DP 4 // Измените эти числа, если индикатор выводит букву "зю"
unsigned short int Number = 0 ;
unsigned char Dig[10];
// В этих переменных хранятся цифры, которые нужно отобразить
char Disp5, Disp6, Disp7;
// Функция выделяет цифры из трехзначного числа Number
void Display (unsigned short int Number)
{
unsigned char Num1, Num2, Num3;
Num1=Num2=0;
while (Number >= 100)
{
Number -= 100;
Num1++;
}
while (Number >= 10)
{
Number -= 10;
Num2++;
}
Num3 = Number;
Disp5 = Dig[Num1];
Disp6 = Dig[Num2];
Disp7 = Dig[Num3];
}
void io_init() //Инициализация портов ввода/вывода
{
DDRD = 0xFF;
PORTD = 0b11111111;
DDRB = 0b10011000;
PORTB = 0;
}
void timer0_init()
{
OCR2 = 150;
TCCR2 = 0b00001111;
TIMSK = 0b10000000;
}
void Dig_init()
{
Dig[0] = (a+b+c+d+e+f); // Сейчас у нас схема с общим катодом
Dig[1] = (b+c);
Dig[2] = (a+b+g+e+d);
Dig[3] = (a+b+g+c+d);
Dig[4] = (f+g+b+c);
Dig[5] = (a+f+g+c+d);
Dig[6] = (a+f+g+c+d+e);
Dig[7] = (a+b+c);
Dig[8] = (a+b+c+d+e+f+g);
Dig[9] = (a+b+c+d+f+g);
}
void main()
{
unsigned char j, k = 0;
Dig_init();
Display(0);
io_init();
timer0_init();
SREG = 0b10000000;
while(1)
{
ADCSRA=0b11001011; // 0b10001110
#asm("sei")
ADMUX = 0b00100000;
for (j = 0; j <= 50; j++){} // Задержка для отображения цифры
if (k == 3){ k = 0;
} else { k++;
}
PORTB = 0b00000000; //Очистка PC7, PC6, PC5
for (j = 0; j<=30; j++){} // Задержка для выключения транзистора
switch (k)
{
case 0: PORTB = 0b00001000; // Единицы
PORTD = Disp7;
break;
case 1: PORTB = 0b00010000; // Десятки
PORTD = Disp6+4;
break;
case 2: PORTB = 0b10000000; // Сотни
PORTD = Disp5;
}}
}
interrupt [TIM2_COMP] void tik(void)
{
Number = afrres ;
Display(Number); // Увеличение отображаемого числа.
}
interrupt [ADC_INT] void adc_isr(void) {
adcread=(int)ADCH;
// по результату измерения ADC находим AFR:
if (adcread<132) afrres=000;
else
{ if (adcread>254) afrres=999; else
{i=0;
while (adc
<=adcread)
{i++;}
afrres = afr[i-1];
}
}
}