Замена константы

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Аватара пользователя
Сообщения: 120
Зарегистрирован: Сб апр 20, 2013 16:38:32
Откуда: Страна Чудес

Сообщение ATMEL86 »

ну вот же выводим на экран.

lcd_gotoxy(0,1);
resultat=((5.00*adc_data[1])/1024.00);
sprintf(lcd_buffer,"Channel #2 = %.2f",resultat, ch_2);
lcd_puts(lcd_buffer)
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай

Сообщение Danko »

Давайте так:
продублируйте кусок кода но только с комментариями к каждой строке из такого расчета, что комментарий Вы пишите не себе, а мне, а я при этом полный ноль в Си так, что комментарии нужны очень подробные с описанием каждой переменной, что куда и зачем..
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Контактная информация:
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 120
Зарегистрирован: Сб апр 20, 2013 16:38:32
Откуда: Страна Чудес

Сообщение ATMEL86 »

Chip type : ATmega16
Program type : Application
AVR Core Clock frequency: 8,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/

#include <mega16.h>
#include <stdio.h>
#include <delay.h>
#include <alcd.h>
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm

//*--- Глобальные переменные ---*
char lcd_buffer[41]; //-***Буфер обмена LCD
int ch_1; //-***Переменная хранения данных ADC0
int ch_2; //-***Переменная хранения данных ADC1


flash unsigned char *fmt_2f="Channel #2 = %.2f";
flash unsigned char *fmt_3f="Channel #2 = %.3f";





//********* Переменные АЦП ***********
#define FIRST_ADC_INPUT 0 //--***Первый канал АЦП ADC0
#define LAST_ADC_INPUT 1 //--***Второй канал АЦП ADC1
unsigned int adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1]; //--Переменная хранения АЦП данных
#define ADC_VREF_TYPE 0x00
float result,resultat;


//***---Обслуживания прерывания для автоматического сканирования каналов---***
interrupt [ADC_INT] void adc_isr(void)
{
static unsigned char input_index=0;
adc_data[input_index]=ADCW;//---Чтение результата АЦП преобразования
// Select next ADC input
if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT)) //-Селективный выбор следующего входа АЦП
input_index=0;
ADMUX=(FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff))+input_index;
delay_us(10); //---***Выдержка времени для стабилизации входного напряжения
ADCSRA|=0x40; //---****Старт АЦП преобразования
}



//***---- Чтение результатов АЦП преобразования----***
void adc_convertation(void)
{
ch_1=adc_data[0]; //---Запись в переменную ch_1 результата ADC 1-го канала
ch_2=adc_data[1]; //---Запись в переменную ch_2 результата ADC 2-го канала
}


// Объявите ваши глобальные переменные здесь

void main(void)
{

// Объявите ваши локальные переменные здесь

PORTA=0b00000000;
DDRA=0b00000000;


PORTB=0b00000000;
DDRB=0b00000000;


PORTC=0b00000000;
DDRC=0b00000000;


PORTD=0b11110000;
DDRD=0b00001111;

// ADC initialization
// ADC Clock frequency: 125,000 kHz
// ADC Voltage Reference: AREF pin
// ADC Auto Trigger Source: ADC Stopped
ADMUX=FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff);
ADCSRA=0xCE;

// Alphanumeric LCD initialization
// Connections specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTB Bit 6
// RD - PORTB Bit 5
// EN - PORTB Bit 4
// D4 - PORTB Bit 3
// D5 - PORTB Bit 2
// D6 - PORTB Bit 1
// D7 - PORTB Bit 0
// Characters/line: 20
lcd_init(20);


#asm("sei") //***Глобально включено прерывание
lcd_clear();



while (1)
{
adc_convertation();//---Чтение результатов АЦП преобразования

lcd_gotoxy(0,0);
result=((5.00*adc_data[0])/1024.00);
sprintf(lcd_buffer,"Channel #1 = %.2f",result, ch_1);
lcd_puts(lcd_buffer); // з






lcd_gotoxy(0,1); // выбор строки
resultat=((5.00*adc_data[1])/1024.00); //считаем
sprintf(lcd_buffer,"Channel #2 = %.2f",resultat, ch_2); // собираем в кучу
lcd_puts(lcd_buffer); // Выводим в строку


if (PIND.4==0) { // порт на котором подключена кнопка


PORTD.0=1; //включаем светодиод
delay_ms(10); // задержка антидребезг кнопок
sprintf(lcd_buffer,fmt_2f,resultat, ch_2); //нажата кнопка подставляем константу fmt_2f
}
else
{
sprintf(lcd_buffer,fmt_3f,resultat, ch_2); //не нажата кнопка подставляем fmt_3f
}







}
}
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай

Сообщение Danko »

подставляем константу fmt_2f
куда?
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Аватара пользователя
Сообщения: 120
Зарегистрирован: Сб апр 20, 2013 16:38:32
Откуда: Страна Чудес

Сообщение ATMEL86 »

sprintf(lcd_buffer,"Channel #2 = %.2f",resultat, ch_2);
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай

Сообщение Danko »

Код: Выделить всё

sprintf(lcd_buffer,"Channel #1 = %.2f",result, ch_1);
распишите мне (и себе) зачем там нужен
%
точка
что такое 2
что такое f

???
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Контактная информация:
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 120
Зарегистрирован: Сб апр 20, 2013 16:38:32
Откуда: Страна Чудес

Сообщение ATMEL86 »

если на входе ацп 0,1вольт и установлено %.2f на дисплее 0,10вольт %.1f -0,1вольт
f - значением аргумента является вещественное десятичное число с плавающей точкой
%f число с плавающей точкой в десятичной записи
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай

Сообщение Danko »

sprintf(lcd_buffer,"Channel #2 = %.2f",resultat, ch_2); // собираем в кучу
собираем в кучу
что собираем : сено или солому

замените комментарий на такой если бы Вы отвечали у доски перед преподавателем
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 120
Зарегистрирован: Сб апр 20, 2013 16:38:32
Откуда: Страна Чудес

Сообщение ATMEL86 »

sprintf(lcd_buffer,"Channel #2 = %.2f",resultat, ch_2); // получаем данные, resultat и ch_2 формируем строку
и выводим с помощью lcd_puts(lcd_buffer);
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай

Сообщение Danko »

Сказать, что ответ правильный я не могу и в тоже время, что он не правильный я тоже не могу.

Почему я хотел от Вас услышать что такое % в данной строке.

не что такое %f а именно процент.

Если опустится до бытового языка то процент это то место начиная с которого в строке Channel #2 = %.2f пойдет замена процента на значение первой переменной идущей после кавычек т.е. на resultat и отсюда сразу вытекает вопрос куда будут подставляться значение второй переменной т.е. ch_2 ?
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 120
Зарегистрирован: Сб апр 20, 2013 16:38:32
Откуда: Страна Чудес

Сообщение ATMEL86 »

Получается что ch_2 весит у меня в воздухе... :dont_know:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай

Сообщение Danko »

типа того

продолжаем дальше?
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 120
Зарегистрирован: Сб апр 20, 2013 16:38:32
Откуда: Страна Чудес

Сообщение ATMEL86 »

Да конечно!!! :)
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай

Сообщение Danko »

тогда разберем по полочка (по пунктам) что у Вас крутится внутри "вечного" цикла.

Код: Выделить всё

while (1)
{
итак
пункт 1 ---Чтение результатов АЦП преобразования
2 - устанавливает курсор в позицию 0,0
3 - умножаем, делем
4. заполняем массив символов lcd_buffer строкой Channel #1 = %.2f заменяя спецификаторы формата %.2f на значение переменной result
5. выводим содержимое массива символов lcd_buffer на экран в установленные ранее координаты

6. устанавливает курсор в позицию 0,1
п. 7,8,9 - аналогично 3,4,5

10 чтение порта на котором висит кнопка
11 включаем светодиод
12 задержка антидребезг кнопок


СТОП
п.12 - задержка есть, а вот антидребезга нет
Последний раз редактировалось Danko Пт июн 20, 2014 00:24:10, всего редактировалось 1 раз.
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 120
Зарегистрирован: Сб апр 20, 2013 16:38:32
Откуда: Страна Чудес

Сообщение ATMEL86 »

да с анти дребезг кнопок я согласен :)
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай

Сообщение Danko »

п.13
sprintf(lcd_buffer,fmt_2f,resultat, ch_2); //нажата кнопка подставляем константу fmt_2f

нет мы не подставляем контстанту а мы
заполняем массив символов lcd_buffer строкой Channel #2 = %.2f; заменяя спецификаторы формата %.2f на значение переменной resultat

далее после ЕСЛИ мы опять заполняем массив символов lcd_buffer

мы заполнили буфер строкой и что?

а затем возвращаемся к п.1 и далее в п.4 мы опять заполняем буфер уже новыми данными затирая старые которые так и не попали на экран
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 120
Зарегистрирован: Сб апр 20, 2013 16:38:32
Откуда: Страна Чудес

Сообщение ATMEL86 »

Вот тут у меня стопор... :(
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай

Сообщение Danko »

Код: Выделить всё

cd_gotoxy(0,1); // выбор строки
resultat=((5.00*adc_data[1])/1024.00); //считаем
sprintf(lcd_buffer,"Channel #2 = %.2f",resultat); // собираем в кучу (точность 2 знака)

if (PIND.4==0) { // порт на котором подключена кнопка
	delay_ms(10); // задержка антидребезг кнопок
	if (PIND.4==0) {
		PORTD.0=1; //включаем светодиод
	} else {
		PORTD.0=0; //выключаем светодиод
		sprintf(lcd_buffer,"Channel #2 = %.3f",resultat); // собираем в кучу (точность 3 знака)
	}
}
lcd_puts(lcd_buffer); // Выводим в строку
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 120
Зарегистрирован: Сб апр 20, 2013 16:38:32
Откуда: Страна Чудес

Сообщение ATMEL86 »

При запуске устройства нет показания на дисплее, после того как нажимаю на кнопку выводится на дисплей показания.
я хотел сделать немного по другому: При измерении ставить точность 3 знака ( менять точность на ходу):)
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай

Сообщение Danko »

ни фига я не понял.

Это как нет показаний на дисплее?

Да и точность не при измерении, а при индикации.
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Контактная информация:
Ответить

Вернуться в «AVR»