Страница 115 из 421
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт фев 24, 2011 14:21:44
ARV
ChipKiller писал(а):вывод идет не из-за типа переменной, а из-за формата, который Вы не указали sprintf(buffer, format-string[, argument...]);
ну да, а это что, по-вашему:
sprintf(lcd_buffer,"T1=%i",T1);
чел указал формат
int и огорчается, что у него числа с минусом... указал бы формат беззнакового int - не огорчался бы...
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт фев 24, 2011 14:30:12
ChipKiller
ARV писал(а):чел указал формат int и огорчается
... об этом я и писал, просто человек не понимает значения параметра
%i
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт фев 24, 2011 14:39:55
Александр 2677
Ух, что то у меня ничего не выходит

Может разжуёте мне, вставте эту строку в мой код. Здесь нужно добавлять ещё одну переменную или библиотеку? Извиняюсь за наглость

Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт фев 24, 2011 14:43:02
ChipKiller
2 Александр 2677 напишите
Код: Выделить всё
.....
int T1;
.....
sprintf(lcd_buffer,"T1=%u",T1);
... и попробуйте

Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт фев 24, 2011 14:46:12
Александр 2677
Ура, что б я без вас делал

Спасибо.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт фев 24, 2011 14:48:42
ChipKiller
... для sprintf(..) важен не тип T1, а спецификатор %u в Вашем случае.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт фев 24, 2011 16:14:36
FredyInKR
Наверно не той. Вот почитайте, расписано до мелочей.
да но то слишком круто... Тем более я не буду использовать регистры...
Вообщем с индикатором я разобрался. Теперь не могу понять с числами
вот нашел функцию хорошую... Мне бы зделать тоже только для 3-х и 4х значных
чисел. В упор не могу понять... Точнее не могу понять как работает операнд "-="
Код: Выделить всё
void Display (unsigned int Number) //Ф-ция для разложения десятичного цисла
{
unsigned char Num1, Num2, Num4, Num5;
Num1=0;
while (Number >= 10) //десятичную
{
Number -= 10;
Num1++;
}
Num2 = Number; //остаток
dis[1] = digits[Num1];
dis[2] = digits[Num2];
}
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт фев 24, 2011 16:26:13
Apparatchik
FredyInKR писал(а):да но то слишком круто... Тем более я не буду использовать регистры...
Там есть и без регистров, прочитайте всю статью.
FredyInKR писал(а):Точнее не могу понять как работает операнд "-="
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт фев 24, 2011 16:56:54
Apparatchik
FredyInKR писал(а):Теперь не могу понять с числами
вот нашел функцию хорошую... Мне бы зделать тоже только для 3-х и 4х значных чисел. В упор не могу понять...
Может я и неправ (тоже начинающий), но я бы сделал так:
Код: Выделить всё
char num[4]; // глобальный массив
void Display (unsigned int a)
{
char i;
while(a>0)
{
num[i]=a%10;
a/=10;
i++;
}
}
числа будут в ячейках массива num
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт фев 24, 2011 18:45:06
FredyInKR
Так вроде нельзя. Во первых у меня уже компилятор рвет. Хотя и функций не много и памяти особо не использую.
Далее пишу, допустим:
и вывожу на семисигментный индикатор первую цифру, получаю ерунду какую-то....
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт фев 24, 2011 19:03:34
Apparatchik
FredyInKR писал(а):и вывожу на семисигментный индикатор первую цифру, получаю ерунду какую-то....
Глянуть бы весь код
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт фев 24, 2011 19:09:10
FredyInKR
на этой функции то работает:
Код: Выделить всё
#include <tiny2313.h>
#include <delay.h>
unsigned char digits[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};
char dis[4]; //буфер экрана
int temp;
interrupt [TIM1_COMPA] void timer1_compa_isr(void) //Прерывание происходит 100 раз в сек,
{
TCNT1H=0x00;
TCNT1L=0x00;
}
void Display (unsigned int Number) //Ф-ция для разложения десятичного цисла
{
unsigned char Num1, Num2, Num4, Num5;
Num1=0;
while (Number >= 10) //десятичную
{
Number -= 10;
Num1++;
}
Num2 = Number; //остаток
dis[1] = digits[Num1];
dis[2] = digits[Num2];
}
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0xFF;
//PORTD = 0;
//DDRD = (1<<1)|(1<<0);
PORTD=0x00;
DDRD=0xFF;
// Timer/Counter 0 initialization... и т.д.
//..
Display(85); //какое нить число 2х значное
#asm("sei")
while (1)
{
#asm("cli");
PORTD=0b00000100 ;//даем лог 0 для катода 1 разряда
PORTB=dis[1]; //1 цифра
delay_ms(5);
PORTD=0b00001000 ; //даем лог 0 для катода 2 разряда
PORTB=dis[2]; //2 цифра
delay_ms(5);
}
}
так работает...
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт фев 24, 2011 19:12:57
ChipKiller
FredyInKR писал(а):так работает...
... скорее так
не работает и работать не будет
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт фев 24, 2011 19:21:13
ChipKiller
Apparatchik писал(а):Может я и неправ (тоже начинающий), но я бы сделал так:
Код: Выделить всё
char num[4]; // глобальный массив
void Display (unsigned int a)
{
char i;
while(a>0)
{
num[i]=a%10;
a/=10;
i++;
}
}
числа будут в ячейках массива num
... несколько неточностей
1. Нет обработки для отрицательных чисел (.. хотя может это и не нужно)
2. Число в массиве num будет "перевернутым"
чтобы избежать "перевертывания" массив нужно заполнять начиная с последнего элемента
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт фев 24, 2011 19:26:10
Apparatchik
ChipKiller писал(а):FredyInKR писал(а):так работает...
... скорее так
не работает и работать не будет
Присоединяюсь
ChipKiller писал(а):... несколько неточностей
1. Нет обработки для отрицательных чисел (.. хотя может это и не нужно)
2. Число в массиве num будет "перевернутым"
чтобы избежать "перевертывания" массив нужно заполнять начиная с последнего элемента
Ну я для примера, конечно нужно подстраивать под свои нужды.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт фев 24, 2011 19:31:21
FredyInKR
void Display (unsigned int Number) //Ф-ция для разложения десятичного цисла
{
unsigned char Num1, Num2;
Num1=0;
while (Number >= 10) //десятичную
{
Number -= 10;
Num1++;
}
Num2 = Number; //остаток
dis[1] = digits[Num1];
dis[2] = digits[Num2];
}

не так точно работает. А вот так:
Код: Выделить всё
char num[4]; // глобальный массив
void Display (unsigned int a)
{
char i;
while(a>0)
{
num[i]=a%10;
a/=10;
i++;
}
}
- нет.
А проще как сделать???
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт фев 24, 2011 19:36:38
ChipKiller
FredyInKR писал(а):Код: Выделить всё
interrupt [TIM1_COMPA] void timer1_compa_isr(void) //Прерывание происходит 100 раз в сек,
{
TCNT1H=0x00;
TCNT1L=0x00;
}
... если вы в обработчике прерывания только перегружаете таймер, то в чем смысл такого обработчика?
Думаю Вам следует не ждать "халявы", а разобраться что такое динамическая индикация
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт фев 24, 2011 19:47:36
Apparatchik
FredyInKR писал(а):А проще как сделать???
Там весь код переделывать нужно начиная с обработчика прерывания. Те два присваивания имхо там ненужны, там нужно выводить информацию на дисплей. Ещо раз советую
прочитать ув. ARV там всё подробно разжевал. С момента
"3.1 Простейший способ" и по
"3.2 Способ с дешифратором" как раз ваш случай.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт фев 24, 2011 20:06:50
Amstron
Подскажите! Если я прописываю в eeprom число а потом у меня программа постоянно крутится в этом цикле, где снова идет команда записи этого же числа в эту же переменную, то это число сново не прописывается???
Я что имею в виду! То что проц сначала сравнивает инфу с переменной, если она такая же как и мне надо записать то он ее не прописывает?!
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт фев 25, 2011 16:43:34
ValBag
Amstron писал(а):Подскажите! Если я прописываю в eeprom число...
Если вы ждете ответа, то изложите вопрос понятнее. И что значит в вашем толковании "прописывается" в отличие от "записывается". А лучше приведите код.