Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 23.05.2009, 01:12  
IOPA4
Почётный гражданин KAZUS.RU
 
Аватар для IOPA4
 
Регистрация: 07.05.2008
Адрес: Мурманск
Сообщений: 1,300
Сказал спасибо: 461
Сказали Спасибо 526 раз(а) в 273 сообщении(ях)
IOPA4 на пути к лучшему
По умолчанию

Сообщение от ivashka_1
ОА, но если что, я сам поправлю.
Да проблем и нет, просто у меня почему-то не работает вывод трехзначного числа на индикатор.
Покажите фрагмент кода, может вместе подправим. Практически нет разницы сколько выводить знаков на индикатор (3,4 или 5).
Реклама:
IOPA4 вне форума  
Непрочитано 23.05.2009, 08:23  
ivashka_1
Частый гость
 
Регистрация: 05.05.2009
Сообщений: 29
Сказал спасибо: 3
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
ivashka_1 на пути к лучшему
По умолчанию

Вот кусочек кода.
Не срабатывает переход из прерывания в функцию 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 была
} //прерывание



А вообще хочу сделать два вольтметра на одном контроллере ...
ivashka_1 вне форума  
Непрочитано 23.05.2009, 12:25  
IOPA4
Почётный гражданин KAZUS.RU
 
Аватар для IOPA4
 
Регистрация: 07.05.2008
Адрес: Мурманск
Сообщений: 1,300
Сказал спасибо: 461
Сказали Спасибо 526 раз(а) в 273 сообщении(ях)
IOPA4 на пути к лучшему
По умолчанию

Сообщение от 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]
IOPA4 вне форума  
Непрочитано 23.05.2009, 12:38  
IOPA4
Почётный гражданин KAZUS.RU
 
Аватар для IOPA4
 
Регистрация: 07.05.2008
Адрес: Мурманск
Сообщений: 1,300
Сказал спасибо: 461
Сказали Спасибо 526 раз(а) в 273 сообщении(ях)
IOPA4 на пути к лучшему
По умолчанию

Сообщение от 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
}
IOPA4 вне форума  
Непрочитано 23.05.2009, 17:20  
ivashka_1
Частый гость
 
Регистрация: 05.05.2009
Сообщений: 29
Сказал спасибо: 3
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
ivashka_1 на пути к лучшему
По умолчанию

Программу я списывал с книги, так там в описании было написано, что МК деление выполняет долго (до нескольких тысяч тактов), а так получается быстрее.
ivashka_1 вне форума  
Непрочитано 23.05.2009, 18:15  
IOPA4
Почётный гражданин KAZUS.RU
 
Аватар для IOPA4
 
Регистрация: 07.05.2008
Адрес: Мурманск
Сообщений: 1,300
Сказал спасибо: 461
Сказали Спасибо 526 раз(а) в 273 сообщении(ях)
IOPA4 на пути к лучшему
По умолчанию

Сообщение от 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")
IOPA4 вне форума  
Непрочитано 23.05.2009, 18:29  
ivashka_1
Частый гость
 
Регистрация: 05.05.2009
Сообщений: 29
Сказал спасибо: 3
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
ivashka_1 на пути к лучшему
По умолчанию

Пробую переписать программу, ругается на скобки "["
Disp5[Number/100)%10]; //сотни
Disp6[Number/10)%10]; //десятки
Disp7[Number%10]; //единицы


Функция Dig_init срабатывает нормально ... пусть даже это и сложно.
ivashka_1 вне форума  
Непрочитано 23.05.2009, 20:05  
IOPA4
Почётный гражданин KAZUS.RU
 
Аватар для IOPA4
 
Регистрация: 07.05.2008
Адрес: Мурманск
Сообщений: 1,300
Сказал спасибо: 461
Сказали Спасибо 526 раз(а) в 273 сообщении(ях)
IOPA4 на пути к лучшему
По умолчанию

Сообщение от 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];      //единицы
IOPA4 вне форума  
Непрочитано 23.05.2009, 20:16  
ivashka_1
Частый гость
 
Регистрация: 05.05.2009
Сообщений: 29
Сказал спасибо: 3
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
ivashka_1 на пути к лучшему
По умолчанию

Пробовал ...
пишет "[" not expected
Скобка именно квадратная.
ivashka_1 вне форума  
Непрочитано 23.05.2009, 20:32  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
dosikus на пути к лучшему
По умолчанию

Сообщение от 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 -по другому у меня ваш ник не читается.
Пора бы Кернигана и Ричи почитать что ли ?!
__________________
Осторожно , злой кот
dosikus вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Видео уроки dosikus Микроконтроллеры, АЦП, память и т.д 61 23.01.2012 21:06
Видео уроки (flash) Proteus 7.1 fmssp Proteus 5 13.08.2007 03:56
AVR уроки Рюмика chipic128 Proteus, KiCAD и другие ECAD 9 07.03.2007 21:46
уроки от LABCENTRE(PIC12F675+C) dosikus Микроконтроллеры, АЦП, память и т.д 22 09.10.2006 10:16


Часовой пояс GMT +4, время: 17:05.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot