Здравствуйте. Пишу программу для электронных весов, и отлаживаю в ПРОТЕУСЕ но так как в нем нет тензодатчика, то использую простой переменный резистор вместо датчика.
У меня такой вопрос:
Что нужно изменить в моем коде, чтобы вмето символов (которые изменяются при изменении сопротивления) на экране при нажатии кнопки появлялось текущее значение АЦП. Код и проект прилагаются:
Вот код:
#include <mega8.h>
// Функции Инициализации LCD
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>
#include <delay.h>
#define FIRST_ADC_INPUT 0 //Объявления для АЦП
#define LAST_ADC_INPUT 0
unsigned char adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
#define ADC_VREF_TYPE 0x20
interrupt [ADC_INT] void adc_isr(void)
{
static unsigned char input_index=0;
// Read the 8 most significant bits
// of the AD conversion result
adc_data[input_index]=ADCH;
// 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;
// Прерывание для стабилизации АЦП и ноги AREF
delay_us(10);
// Начало преобразования АЦП
ADCSRA|=0x40;
}
void main(void)
{
PORTD.0=0x00; //Инициализация кнопки
DDRD.0=0xFF;
ADMUX=FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff);
ADCSRA=0xCC;
lcd_init(8); //Загрузка LCD
#asm("sei")
while (1)
{
if(PIND.0==1) //Если кнопка нажата, то вывод на экран текущего значения АЦП
{
lcd_gotoxy(0,0);
lcd_putchar(adc_data[0]);
}
};
}
Этот код мне нужен для даленейшего использования - преобразования, чтобы потом вывести формулу, которая будет расчитывать настоящую массу, а не результаты преобразования АЦП.
Заранее спасибо.
Весы своими руками
-
Васнецов Аркадий
- Первый раз сказал Мяу!
- Сообщения: 23
- Зарегистрирован: Ср май 12, 2010 05:53:45
Весы своими руками
- Вложения
-
- Тензовесы в протеус.zip
- Файл проекта и прошивка
- (14.86 КБ) 188 скачиваний
- Реклама
- Meteor
- Друг Кота
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
- Контактная информация:
Re: Весы своиим руками
Ничо не понял кроме последнего.
Для того чтобы получить "настоящий" вес нужно, в идеале:
Поставить несколько эталонных масс и оторазить чего там будет.
Затем зная вес эталона можно найти такое число А, при котором А*rezult=P.
Затем проверяем на весах другой массы.
Это идеальное решение.
Неидеальность может вылезти например такая - нормировали по 10 кг. Взвешиваем и получаем 10 кг.
Ставим вес 8 кг получаем результат 9 кг. Тут неточность аналоговой части. И с ней придется бороться или аналогово или программно.
Для того чтобы получить "настоящий" вес нужно, в идеале:
Поставить несколько эталонных масс и оторазить чего там будет.
Затем зная вес эталона можно найти такое число А, при котором А*rezult=P.
Затем проверяем на весах другой массы.
Это идеальное решение.
Неидеальность может вылезти например такая - нормировали по 10 кг. Взвешиваем и получаем 10 кг.
Ставим вес 8 кг получаем результат 9 кг. Тут неточность аналоговой части. И с ней придется бороться или аналогово или программно.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
- Fasterpast
- Мучитель микросхем
- Сообщения: 493
- Зарегистрирован: Ср фев 14, 2007 12:07:58
- Откуда: Москва
- Контактная информация:
Re: Весы своими руками
Нужно сначала "itoa" сделать, чтобы переменную в строку перевести, а потом эту строку выводить. Тогда будут голые данные с АЦП. Ну а самый действенный способ перевода показаний в массу - сделать таблицу, мне кажется.
-
Васнецов Аркадий
- Первый раз сказал Мяу!
- Сообщения: 23
- Зарегистрирован: Ср май 12, 2010 05:53:45
Re: Весы своими руками
Дело в том, что когда я проверял прошивку в Proteus на дисплее вместо цыфр выводились символы, которые изменялись в зависимости от сопротивления (скачайте приложение и вы все поймете).
А мне нужно чтобы выводились цыфры, которые находятся в АЦП (при импульсах с датчика), после чего их нужно преобразовать так, чтобы в результате получился настоящий вес нагрузки.
Теперь надеюсь все понятно?
И насчет "itoa" можно по подробнее, а то я новичек в программировании.
А мне нужно чтобы выводились цыфры, которые находятся в АЦП (при импульсах с датчика), после чего их нужно преобразовать так, чтобы в результате получился настоящий вес нагрузки.
Теперь надеюсь все понятно?
И насчет "itoa" можно по подробнее, а то я новичек в программировании.
Re: Весы своиим руками
Ну это конечно в идеале. Я бы сказал что надо найти такую функцию f, при которой f(result)=P.Meteor писал(а): найти такое число А, при котором А*rezult=P.
- Реклама
- Meteor
- Друг Кота
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
- Контактная информация:
Re: Весы своими руками
А можно заложить таблицу поправок на "кривизну" измерений к линейной или нелинейной функции.
ЗЫ Коэффициент А (в моем посте) как раз и является одним из элементов линейной функции y=A*x+b.
ЗЫ Коэффициент А (в моем посте) как раз и является одним из элементов линейной функции y=A*x+b.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Re: Весы своими руками
подтяни PD0 к земле резистором,
и вот:
и вот:
Код: Выделить всё
#include <mega8.h>
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>
#include <stdio.h>
#include <delay.h>
unsigned int adc_data;
char lcd_buffer[16];
interrupt [ADC_INT] void adc_isr(void){
adc_data=ADCW;
ADCSRA|=0x40;}
void main(void){
ADMUX=0b01000000;
ADCSRA = 0b11001111;
lcd_init(16);
lcd_clear();
#asm("sei")
while (1)
{adc_data=ADCH;
if(PIND.0==1){ //Если кнопка нажата, то вывод на экран текущего значения АЦП
lcd_gotoxy( 0,0 );
lcd_putsf( " ADC 10bit " );
sprintf(lcd_buffer, " %u ",adc_data);
lcd_gotoxy(3,1);
lcd_puts(lcd_buffer);}
else { lcd_gotoxy( 0,0 );
lcd_putsf( " Ves " );
sprintf(lcd_buffer, "%02i.%01ikg ",adc_data*2/10,adc_data*2%10); //переводим в вес
lcd_gotoxy(5,1);
lcd_puts(lcd_buffer);}
}}-
Васнецов Аркадий
- Первый раз сказал Мяу!
- Сообщения: 23
- Зарегистрирован: Ср май 12, 2010 05:53:45


