23.05.2009, 01:12
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.05.2008
Адрес: Мурманск
Сообщений: 1,300
Сказал спасибо: 461
Сказали Спасибо 526 раз(а) в 273 сообщении(ях)
|
Сообщение от ivashka_1
|
ОА, но если что, я сам поправлю.
Да проблем и нет, просто у меня почему-то не работает вывод трехзначного числа на индикатор.
|
Покажите фрагмент кода, может вместе подправим. Практически нет разницы сколько выводить знаков на индикатор (3,4 или 5).
|
|
|
|
23.05.2009, 08:23
|
|
Частый гость
Регистрация: 05.05.2009
Сообщений: 29
Сказал спасибо: 3
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Вот кусочек кода.
Не срабатывает переход из прерывания в функцию Display. Пока это просто счетчик, главное чтобы контроллер показывал правильно цифры, а ADC подключить проще будет. Одну цифру на индикатор я вывел, в железе всё работает.
void Dig_init()
{
Dig[0] = a+b+c+d+e+f; // Если индикатор с общим анодом,
Dig[1] = b+c; // нужно сумму макросов отнять от
Dig[2] = a+b+g+e+d; // 255. Если с общим катодом, то
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 Display_init()
{
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];
}
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Place your code here
if (i ‹ 70)
{
i++;
}
else
{
i = 1;
if (Number ‹ 999)
Number++;
else
Number = 0;
// PORTB++;
Display(Number); // Увеличение отображаемого числа.
} // для if была
} //прерывание
А вообще хочу сделать два вольтметра на одном контроллере ...
|
|
|
|
23.05.2009, 12:25
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.05.2008
Адрес: Мурманск
Сообщений: 1,300
Сказал спасибо: 461
Сказали Спасибо 526 раз(а) в 273 сообщении(ях)
|
Сообщение от ivashka_1
|
Вот кусочек кода.
Не срабатывает переход из прерывания в функцию Display. Пока это просто счетчик, главное чтобы контроллер показывал правильно цифры, а ADC подключить проще будет. Одну цифру на индикатор я вывел, в железе всё работает.
.........
void Display_init()
{
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];
}
......
А вообще хочу сделать два вольтметра на одном контроллере ...
|
Вообще-то цифры лучше выводить так:
Код:
|
Disp5[Number/100)%10]; //сотни
Disp6[Number/10)%10]; //десятки
Disp7[Number%10]; //единицы |
и програмно переключать разряды индикатора.[/code][/quote]
|
|
|
|
23.05.2009, 12:38
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.05.2008
Адрес: Мурманск
Сообщений: 1,300
Сказал спасибо: 461
Сказали Спасибо 526 раз(а) в 273 сообщении(ях)
|
Сообщение от ivashka_1
|
......
void Dig_init()
{
Dig[0] = a+b+c+d+e+f; // Если индикатор с общим анодом,
Dig[1] = b+c; // нужно сумму макросов отнять от
Dig[2] = a+b+g+e+d; // 255. Если с общим катодом, то
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;
}
.......
|
Зачем фунция Dig_init()? Проще обьявить массив.
ОА:
Код:
|
const char Dig[] = {
0b11000000, //0 0
0b11111001, //1 1
0b10100100, //2 2
0b10110000, //3 3
0b10011001, //4 4
0b10010010, //5 5
0b10000010, //6 6
0b11111000, //7 7
0b10000000, //8 8
0b10010000 //9 9
} |
ОК:
Код:
|
const char Dig[] = {
0b00111111, //0 0
0b00000110, //1 1
0b01011011, //2 2
0b01001111, //3 3
0b01100110, //4 4
0b01101101, //5 5
0b01111101, //6 6
0b00000111, //7 7
0b01111111, //8 8
0b01101111 //9 9
} |
|
|
|
|
23.05.2009, 17:20
|
|
Частый гость
Регистрация: 05.05.2009
Сообщений: 29
Сказал спасибо: 3
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Программу я списывал с книги, так там в описании было написано, что МК деление выполняет долго (до нескольких тысяч тактов), а так получается быстрее.
|
|
|
|
23.05.2009, 18:15
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.05.2008
Адрес: Мурманск
Сообщений: 1,300
Сказал спасибо: 461
Сказали Спасибо 526 раз(а) в 273 сообщении(ях)
|
Сообщение от ivashka_1
|
Программу я списывал с книги, так там в описании было написано, что МК деление выполняет долго (до нескольких тысяч тактов), а так получается быстрее.
|
Вольтметр на Атмеге8 с тактовой 1 МГц свободно выполняет вышеприведенный код.
В Вашем случае, чтобы выполнялись прерывания - необходимо в настройках включить эти прерывания:
Код:
|
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x03;
TCNT0=0x00;
OCR0=0x00; |
А так разрешить прерывания:
Код:
|
TIMSK=0x01;
// Global enable interrupts
#asm("sei") |
|
|
|
|
23.05.2009, 18:29
|
|
Частый гость
Регистрация: 05.05.2009
Сообщений: 29
Сказал спасибо: 3
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Пробую переписать программу, ругается на скобки "["
Disp5[Number/100)%10]; //сотни
Disp6[Number/10)%10]; //десятки
Disp7[Number%10]; //единицы
Функция Dig_init срабатывает нормально ... пусть даже это и сложно.
|
|
|
|
23.05.2009, 20:05
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.05.2008
Адрес: Мурманск
Сообщений: 1,300
Сказал спасибо: 461
Сказали Спасибо 526 раз(а) в 273 сообщении(ях)
|
Сообщение от ivashka_1
|
Пробую переписать программу, ругается на скобки "["
Disp5[Number/100)%10]; //сотни
Disp6[Number/10)%10]; //десятки
Disp7[Number%10]; //единицы
Функция Dig_init срабатывает нормально ... пусть даже это и сложно.
|
Извиняюсь, подправьте:
Код:
|
Disp5[(Number/100)%10]; //сотни
Disp6[(Number/10)%10]; //десятки
Disp7[Number%10]; //единицы |
|
|
|
|
23.05.2009, 20:16
|
|
Частый гость
Регистрация: 05.05.2009
Сообщений: 29
Сказал спасибо: 3
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Пробовал ...
пишет "[" not expected
Скобка именно квадратная.
|
|
|
|
23.05.2009, 20:32
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Сообщение от ivashka_1
|
Программу я списывал с книги, так там в описании было написано, что МК деление выполняет долго (до нескольких тысяч тактов), а так получается быстрее.
|
Именно так и поэтому деление заменяют вычитанием и
не слушают басни о безграничных ресурсах МК.
Код:
|
Это свернутая версия atoi С стандарта ANSI но в отличие от оригинала работает быстрее.
Вызываш itoa2(5999) результат будет в asc[5]
Код
unsigned char asc[5];
void itoa2(unsigned int binval)
{
int step[]={10000,1000,100,10,1};
unsigned int temp,val;
unsigned char i,atemp;
val=binval;
for (i=0; i‹5; i++)
{
temp=step[i];
atemp='0';
while(val ›= temp)
{
atemp++;
val-=temp;
}
asc[i]=atemp;
}
} |
Взято здесь :
http://www.remexpert.com/ipb/topic1285.html
Используется давно и успешно.
Легко трансформируется на любое количество разрядов.
Для Йопа4 -по другому у меня ваш ник не читается.
Пора бы Кернигана и Ричи почитать что ли ?!
__________________
Осторожно , злой кот
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 17:05.
|
|