Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
04.02.2011, 12:28
|
|
Частый гость
Регистрация: 08.11.2008
Сообщений: 16
Сказал спасибо: 13
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Помогите пожалуйста с подключением семисегментного двухразрядного индикатора
Здравствуйте, я ещё только осваиваю азы программирования микроконтроллеров AVR на Си и Ассемблере, поэтому многое не знаю.
Мне требуется собрать устройство, которое будет выводить количество нажатий на кнопку до 99 на семисегментный двухразрядный индикатор.
Я не знаю, как в программе перевести восьмиразрядный код, в десяти разрядный. Контроллер выбрал ATtiny2313 Скиньте пожалуйста примеры управления такими индикатороми...
__________________
&&&&&&
takker
|
|
|
|
04.02.2011, 12:57
|
|
Вид на жительство
Регистрация: 07.03.2005
Сообщений: 300
Сказал спасибо: 13
Сказали Спасибо 117 раз(а) в 62 сообщении(ях)
|
Re: Помогите пожалуйста с подключением семисегментного двухразрядного индикатора
Программа предназначалась для другой. Нет ограничения меньше 0 и больше 99. Разберетесь, сделаете.
|
|
|
Эти 2 пользователя(ей) сказали Спасибо mironov за это сообщение:
|
|
|
04.02.2011, 13:01
|
|
Временная регистрация
Регистрация: 24.09.2010
Сообщений: 60
Сказал спасибо: 1
Сказали Спасибо 23 раз(а) в 19 сообщении(ях)
|
Re: Помогите пожалуйста с подключением семисегментного двухразрядного индикатора
Попробуйте так
unsigned char code[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x3 9};
void chartostr(unsigned char value)
{
digit0=value%10;
value=(value-digit0)/10;
digit1=value%10;
value=(value-digit1)/10;
digit2=code[value%10];
digit0=code[digit0];
digit1=code[digit1];
}
Или так
void chartostr(unsigned char value)
{
digit0=value%10;
value=(value-digit0)/10;
digit1=value%10;
value=(value-digit1)/10;
digit2=(value%10)+0x30;
digit0=digit0+0x30;
digit1=digit1+0x30;
}
|
|
|
Эти 2 пользователя(ей) сказали Спасибо aleksey_gregul за это сообщение:
|
|
|
04.02.2011, 13:04
|
|
Вид на жительство
Регистрация: 07.03.2005
Сообщений: 300
Сказал спасибо: 13
Сказали Спасибо 117 раз(а) в 62 сообщении(ях)
|
Re: Помогите пожалуйста с подключением семисегментного двухразрядного индикатора
Вот еще семисегментные с вычитанием
|
|
|
Эти 2 пользователя(ей) сказали Спасибо mironov за это сообщение:
|
|
|
04.02.2011, 13:15
|
|
Частый гость
Регистрация: 08.11.2008
Сообщений: 16
Сказал спасибо: 13
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: Помогите пожалуйста с подключением семисегментного двухразрядного индикатора
Спасибо большое, разберусь
__________________
&&&&&&
takker
|
|
|
|
07.02.2011, 07:57
|
|
Частый гость
Регистрация: 08.11.2008
Сообщений: 16
Сказал спасибо: 13
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: Помогите пожалуйста с подключением семисегментного двухразрядного индикатора
Сообщение от mironov
|
Программа предназначалась для другой. Нет ограничения меньше 0 и больше 99. Разберетесь, сделаете.
|
А каким компилятором пользуетесь?
Я пользуюсь WinAVR, но он меня не удовлетворяет, тем что много примеров из интернета не может откомпилировать, когда другие компиляторы в них разбираются... Я компилирую программы через него, и потом .hex файлы зашиваю в контроллер через Uniprof... Посоветуйте пожалуйста какой-небудь другой компилятор...
__________________
&&&&&&
takker
Последний раз редактировалось takker; 07.02.2011 в 08:04.
|
|
|
|
07.02.2011, 08:29
|
|
Частый гость
Регистрация: 08.11.2008
Сообщений: 16
Сказал спасибо: 13
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: Помогите пожалуйста с подключением семисегментного двухразрядного индикатора
Скачал cvavr, не знаю как откомпилировать в файл .hex , там всё на албанском...(
__________________
&&&&&&
takker
|
|
|
|
07.02.2011, 09:38
|
|
Вид на жительство
Регистрация: 07.03.2005
Сообщений: 300
Сказал спасибо: 13
Сказали Спасибо 117 раз(а) в 62 сообщении(ях)
|
Re: Помогите пожалуйста с подключением семисегментного двухразрядного индикатора
Сообщение от takker
|
А каким компилятором пользуетесь?
|
CVAVR 1.25.9 и книгой Лебедева
|
|
|
Эти 2 пользователя(ей) сказали Спасибо mironov за это сообщение:
|
|
|
07.02.2011, 23:40
|
|
Вид на жительство
Регистрация: 14.10.2009
Сообщений: 338
Сказал спасибо: 35
Сказали Спасибо 92 раз(а) в 73 сообщении(ях)
|
Re: Помогите пожалуйста с подключением семисегментного двухразрядного индикатора
Вот примерчик кода который считает приходящие на INT0 импульсы в течении 30 секунд и затем 40 секунд показывает эти данные.
Основа от Hardlock-а
PHP код:
|
/************************************************** ***
Chip type : ATtiny2313
AVR Core Clock frequency: 8,000000 MHz
Memory model : Tiny
External RAM size : 0
Data Stack size : 32
************************************************** ***/
#define TRUE (!FALSE)
#define FALSE 0
#define BYTE unsigned char
#define WORD unsigned short int
#define BOOLEAN char
#define LED_delay 250
//тут мы выбираем с общим анодом или катодом схема
#define Anode
//#define Cathode
#include ‹tiny2313.h›
#include ‹stdio.h›
#include ‹delay.h›
//unsigned int Test_Counter = 12;
unsigned long int displaydata = 0; // Digital count number to be displayed
unsigned long int TimerDelayer=0; // Timer delay for generating 1ms
BYTE Display_Buffer[4] = {
0xFA, // digit 1 initial 0
0xFA, // digit 2 initial
0xFA, // digit 3 initial
0xFA
};
//Сюда вгоняем карту символов
BYTE CharacterMap[14] = {
0xFA, //0
0x82, //1
0xB9, //2
0xAB, //3
0xC3, //4
0x6B, //5
0x7B, //6
0xA2, //7
0xFB, //8
0xEB, //9
0x00, //blank
0x01 //-
// 0x53, //h
// 0x09 //г
};
void ShowDisplayData(void)
{
#ifdef Cathode
PORTB = Display_Buffer[0];
PORTD.5 = 0;
delay_us(LED_delay);
PORTD.5 = 1;
PORTB = Display_Buffer[1];
PORTD.1 = 0;
delay_us(LED_delay);
PORTD.1 = 1;
PORTB = Display_Buffer[2];
PORTD.0 = 0;
delay_us(LED_delay);
PORTD.0 = 1;
PORTB = Display_Buffer[3];
PORTD.4 = 0;
delay_us(LED_delay);
PORTD.4 = 1;
#endif
#ifdef Anode
PORTB = ~Display_Buffer[0];
PORTD.5 = 1;
delay_us(LED_delay);
PORTD.5 = 0;
PORTB = ~Display_Buffer[1];
PORTD.1 = 1;
delay_us(LED_delay);
PORTD.1 = 0;
PORTB = ~Display_Buffer[2];
PORTD.0 = 1;
delay_us(LED_delay);
PORTD.0 = 0;
PORTB = ~Display_Buffer[3];
PORTD.4 = 1;
delay_us(LED_delay);
PORTD.4 = 0;
#endif
}
void RefreshDisplay(void)
{
unsigned long int lastnum, num;
BYTE DigitCount = 4;
num = displaydata;
// Если надо в схеме показ ведущих нулей то....
Display_Buffer[0]=0xFA;
Display_Buffer[1]=0xFA;
Display_Buffer[2]=0xFA;
Display_Buffer[3]=0xFA;
if ((displaydata › 0)&&(displaydata ‹ 1000000))
{
while (num›0)
{
while (num›10000)
{ // Автоматический выбор предела измерения
num=num/10;
}
DigitCount--;
lastnum = num % 10;
num = (num - lastnum) / 10;
Display_Buffer[DigitCount]=CharacterMap[lastnum];
}
}
else if (displaydata › 1000000)
{
Display_Buffer[0]=1;
Display_Buffer[1]=1;
Display_Buffer[2]=1;
Display_Buffer[3]=1;
}
if (TimerDelayer›30000)
{ //Снимаем точки на всех разрядах
Display_Buffer[0]&=0b11111011;
Display_Buffer[1]&=0b11111011;
Display_Buffer[2]&=0b11111011;
Display_Buffer[3]&=0b11111011;
// Автоматически вычисляем куда поставить точку
if (displaydata‹10000)
{Display_Buffer[2]+=0b100;}
if ((displaydata›10000)&&(displaydata‹100000))
{Display_Buffer[1]+=0b100;}
if ((displaydata›100000)&&(displaydata‹1000000))
{
Display_Buffer[0]+=0b100;
}
} else
{ //Пока ведется счет - показываем все точки сразу
Display_Buffer[0]|=0b00000100;
Display_Buffer[1]|=0b00000100;
Display_Buffer[2]|=0b00000100;
Display_Buffer[3]|=0b00000100;
}
ShowDisplayData();
}
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// По прерыванию плюсуем показания
if (TimerDelayer‹30000)
displaydata++;
}
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0=0x7D;
// считаем 1ms
TimerDelayer++;
if (TimerDelayer›70000)
{ //Тут мы в 70000 загнали время Счет+Показания из этого времени счет только 30000
displaydata=0;
TimerDelayer=0;
};
}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
PORTA=0b00000011;
DDRA= 0b00000011;
PORTB=0b00000000;
DDRB= 0b11111111;
#ifdef Cathode
PORTD=0b01111111;
DDRD= 0b00110011;
#endif
#ifdef Anode
PORTD=0b01001100;
DDRD= 0b00110011;
#endif
// Clock value: 125,000 kHz
TCCR0A=0x00;
TCCR0B=0x03;
TCNT0=0x7D;
OCR0A=0x00;
OCR0B=0x00;
// Clock value: 0 kHz
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// External Interrupt(s) initialization
GIMSK=0x40;
MCUCR=0x00;
EIFR=0x40;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x02;
//Other
USICR=0x00;
ACSR=0x80;
#asm("sei")
while (1)
{
//We do not need any regular code here actually ))))
RefreshDisplay();
};
}
|
Какие пины управляют разрядами видно в коде.
В архиве распиновка подключения сегментов.
__________________
Найди путь или проложи сам!
|
|
|
Эти 2 пользователя(ей) сказали Спасибо MasterMushi за это сообщение:
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Помогите, пожалуйста, создать АОН на AVR
|
ArtUrl1986 |
Микроконтроллеры, АЦП, память и т.д |
23 |
30.04.2016 18:48 |
Помогите, пожалуйста, с PICом и дисплеем
|
VaL_KX |
Proteus |
4 |
15.11.2010 22:33 |
Помогите пожалуйста с программой!
|
Тимик |
Микроконтроллеры, АЦП, память и т.д |
1 |
11.08.2010 08:08 |
ATtiny2313 в качестве драйвера семисегментного индикатора
|
Djakovskij |
Микроконтроллеры, АЦП, память и т.д |
173 |
26.07.2010 12:47 |
Помогите пожалуйста , очень нужна прога для RS232
|
pavel ognev |
Микроконтроллеры, АЦП, память и т.д |
23 |
04.02.2010 09:15 |
Часовой пояс GMT +4, время: 17:44.
|
|