Перейти к содержанию

Ошибка В Программе С Жк


user437

Рекомендуемые сообщения

Здравствуйте. Вот код программы:

#include <htc.h>
#include <lcd.c>
#define _XTAL_FREQ 4000000
__CONFIG(WDTDIS & UNPROTECT & MCLRDIS & INTOSCIO);
main() {
TRISA=0b00000001; //RA0 на вход, остальные на выход.
TRISC=0;
PORTA=0;
PORTC=0;
CMCON=0x07;//отключен компаратор
ANSEL=0b00000001; //RA0 как аналоговый
ADCON0=0b10000101;//разрешен АЦП. частота системной синхронизации 32
ADCON1=0b01100000;//РАЗОБРАТЬСЯ С ЭТИМ
int h_adc, l_adc;
unsigned char v;
lcd_init();
lcd_goto(0);
//lcd_puts("U=");
__delay_ms(100);
GODONE=1;
while (GODONE) {}
l_adc=ADRESL;
h_adc=ADRESH;
v=l_adc+h_adc*1024;
lcd_puts("U=",v);
while (1){}
}

Пробую сделать АЦП на микроконтроллере.

У меня ругается на lcd_puts. Про то, тчо там указана переменная.... Просто текст в кавычках выводится, а значение переменной нет. Как исправить?

Еще у меня ругается на все функции из библиотеки lcd, если ее подключить так: #include <lcd.h>, то выводит:

Error   [500] ; 0. undefined symbols:
_lcd_puts(pic16f676.obj) _lcd_init(pic16f676.obj) _lcd_goto(pic16f676.obj)

Микроконтроллер я использую pic16f676. Не подскажите значение регистров для ADCON1, а то я из даташит не понял. (английский плохо знаю)

Заранее спасибо!

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Как исправить?
Очень просто - передавать в функцию то, что она принимает, а не то, что хочется Вам.

А конкретно - строку.

#include <lcd.c>

Так нельзя делать. Подключать нужно хидер (.h), а не файл с кодом.
Не подскажите значение регистров для ADCON1, а то я из даташит не понял.
Что конкретно не понятно в этом регистре ?

http://www.microchip.ru/lit/?mid=1x0 - "курить" до полного прояснения...

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Очень просто - передавать в функцию то, что она принимает, а не то, что хочется Вам.

А конкретно - строку.

Ну, а как? Покажите? Я не знаю... Переменная итак типа char... Исправьте код пожалуйста....

Так нельзя делать. Подключать нужно хидер (.h), а не файл с кодом.

так я и интересуюсь, как быть если иначе ошибки выдает....

какие ошибки я указал.

Что конкретно не понятно в этом регистре ?

http://www.microchip.ru/lit/?mid=1x0 - "курить" до полного прояснения...

ну и это я ведь писал... Что я не опнял, вот и спрашиваю.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Ну, а как? Покажите?
Что показать, как строку передать ?

http://yandex.ru/yan...ота со строками Интернет просто кишит этой информацией, нет смысла всё тут в 100500-ый раз переписывать.

так я и интересуюсь, как быть если иначе ошибки выдает....

какие ошибки я указал.

Тогда все вопросы к "библиатекарю".
Что я не опнял, вот и спрашиваю.
Дак что конкретно не понятно ? Там есть документация на ADC, всё Русским по белому разжевано.
Ссылка на комментарий
Поделиться на другие сайты

Тогда все вопросы к "библиатекарю".

В том то и дело, что в одном проекте нормально все было, когда добавлял через .h, а тут такое выдает....

Что показать, как строку передать ?

если не сложно, то да)

как только не пробывал. какая-то фигня выходит....

Ссылка на комментарий
Поделиться на другие сайты

Что показать, как строку передать ?

если не сложно, то да)

Функция, вероятнее всего, принимает параметром указатель на массив char'ов.

char stroka[кол-во отведённых байтов]="Строка";


lcd_puts(stroka);

:)

PS: Я же ссылку дал. Что же все какие лентяи то... :)

Ссылка на комментарий
Поделиться на другие сайты

Пф... Не знаю, что творится... Теперь ошибку не выдает на v... Но при этом ничего не высвечивается....

Выдает на индикатор F... Прошу переписать программу. Я уже замучился....

(не уверян, что все биты верно поставил, включая __CONFIG)

#include <htc.h>
#define _XTAL_FREQ 4000000
#include "lcd.c"
__CONFIG(WDTDIS & UNPROTECT & MCLRDIS & INTOSCIO);
main() {
RA0=1; //вывод RA0 вход
CMCON=0x07;//компаратор отключен
ADCON0=0b10000011;//разрешен АЦП, аналоговый порт RA0, рабочая частота 32.
ADCON1=0b00000000;//fosc/2
ANSEL=0b000000001;//RA0 аналоговый
int h_adc, l_adc;
unsigned char v;
__delay_ms(100);
l_adc=ADRESL;
h_adc=ADRESH;
__delay_ms(100);
v=l_adc+h_adc*1024;
__delay_ms(100);
lcd_init();
lcd_goto(0);
lcd_putch(v);
while(1);
}

Схема в протеусе выглядит так h_1417815023_1112597_c21192f61d.jpg

Программу компилировал в mplab

Изменено пользователем user437
Ссылка на комментарий
Поделиться на другие сайты

Пф... Не знаю, что творится...

Всё очень просто. Вы всё делаете методом тыка, не понимая что делаете.

А нужно просто начать изучать язык. Ибо метод тыка в программировании не прокатывает.

PS: У меня, по-моему, дежавю, но я всё-таки скажу это ещё раз. Всем просто хочется чтобы быстро. Думают сейчас я сяду, 2 строки напишу, а 2 подскажут на форуме, и готово. Это всё - сказки... мечты, так сказать... подобного не будет. Читать и изучать предмет всё равно придётся.

Ссылка на комментарий
Поделиться на другие сайты

Схема в протеусе выглядит так
ну если она выглядит именно так, то стоило бы заглянуть в исходник для дисплея и олицезреть куда/на какие ноги/ он данные запихивает....
Ссылка на комментарий
Поделиться на другие сайты

Ну основы языка Си я прочитал.

А биты я проставил по даташиту, должно быть правильно, но результат не тот...

ВОт и прошу помощи.

Схема в протеусе выглядит так
ну если она выглядит именно так, то стоило бы заглянуть в исходник для дисплея и олицезреть куда/на какие ноги/ он данные запихивает....

Вот, я правил lcd.c для этого:

#define LCD_RS RA2
#define LCD_RW RA4
#define LCD_EN RA5
#define LCD_DATA PORTC

Изменено пользователем user437
Ссылка на комментарий
Поделиться на другие сайты

Ну основы языка Си я прочитал.
Не уверен. По крайней мере, Вы даже не дошли до типов переменных.
но результат не тот...
А какой Вы ожидали результат ? И объясните (лучше пошагово) почему именно этот результат должен быть.

Уверен почти на 100% , если Вы пройдётесь пошагово по программе и будете писать результаты каждого шага, то Вы обнаружите "косяк" раньше того, пока напишете последний пункт.

Распишите нам тут все шаги, а мы, если Вы сами не заметите, укажем Вам на ошибки.

Ссылка на комментарий
Поделиться на другие сайты

/*задал файл для МК (он у меня pic16f676,
отдельного .h файла не нашел. с интернета его скачивал,
но при его добавлении выдает ошибку компиляции. поэтому использую это*/

#include <htc.h>

// тактирование МК с частотой 4МГц
#define _XTAL_FREQ 4000000

//подключаю библиотеку ЖК. если .h, то тоже будет ошибка компиляции, а так нормально.
#include "lcd.c"

/* настройка конфигурации МК: сторожевой таймер отключен, внешнее прерывание отключено,
защита отключена,сброс по снижению питания, */
__CONFIG(WDTDIS & UNPROTECT & MCLRDIS & INTOSCIO);

main() { //начало главной функции
TRISA=0b00000001;//вывод RA0 вход
CMCON=0x07;//компаратор отключен
ADCON0=0b10000011;//разрешен АЦП, аналоговый порт RA0, рабочая частота 32.
ADCON1=0b00100000;//fosc/32
ANSEL=0b000000001;//RA0 аналоговый
int h_adc, l_adc, v;/*объявление переменных, перенес v в int, т.к. char имеет значение только до 256,
а надо умножать будет число на 1024*/
l_adc=ADRESL;//присваивание значению регистра переменной
h_adc=ADRESH;//присваивание значению регистра переменной
__delay_ms(100);//задержка
v=l_adc+h_adc*1024;/*сложение значение двух регитсров и умножение на разрядность 1024, т.к. 10бит АЦП.
после такого значение выводиться должно в сотых.*/
lcd_init();//инициализация индикатора
lcd_goto(0);//перемещение курсора в левый верхний угол

/*ВРОДЕ КАК КОД ВЕРЕН, НО НЕ ЗНАЮ КАК ПРАВИЛЬНО И ЛЕГЧЕ ПРЕОБРАЗОВАТЬ ЗНАЧЕНИЕ ПЕРЕМЕННОЙ v В СТРОКУ*/

lcd_puts();//вывести переменную значение
while(1);//бесконечный цикл, рекомендуют, чтобы МК постоянно был в рабочем состоянии
}//конец главной функции

Изменено пользователем user437
Ссылка на комментарий
Поделиться на другие сайты

/*объявление переменных, перенес v в int, т.к. char имеет значение только до 256,
Вот, видите, 1 ошибку нашли. Видимо, когда дошли до строки v=l_adc+h_adc*1024; :)
lcd_puts();//вывести переменную значение
У Вас же тут putch был :) Правильно, ибо char - это символ.

А puts, судя по названию, вывод строки ! А int - это не строка !

/*ВРОДЕ КАК КОД ВЕРЕН, НО НЕ ЗНАЮ КАК ПРАВИЛЬНО И ЛЕГЧЕ ПРЕОБРАЗОВАТЬ ЗНАЧЕНИЕ ПЕРЕМЕННОЙ v В СТРОКУ*/
ВОТ ОНА ! Заветная проблема !

Видите, поковырявшись хорошенько в программе, Вы определились с проблемой, которую уже проще решать, и смогли правильно сформулировать вопрос

Ну а теперь Вас смело можно перенаправлять к поисковикам :)

Ссылка на комментарий
Поделиться на другие сайты

читал. и пробовал и методом

#include <stdio.h>
void main(){
  char str[11];
  int number = 12345;
  sprintf(str, "%d", number);
}

выдает ошибку bad call to typeSub()

пробовал и через itoa переписав код так:

#include <htc.h>

#define _XTAL_FREQ 4000000
#include <stdlib.h>

#include "lcd.c"
#include "sprintf.c"

__CONFIG(WDTDIS & UNPROTECT & MCLRDIS &  INTOSCIO);


main() {
TRISA=0b00000001;
CMCON=0x07;
ADCON0=0b10000011;
ADCON1=0b00100000;
ANSEL=0b000000001;
int h_adc, l_adc;
int v;
int radix = 10;
char volts[4];
l_adc=ADRESL;
h_adc=ADRESH;
__delay_ms(100);
v=h_adc+l_adc*1024;
lcd_init();
lcd_goto(0);
char *p;
p = itoa(v,volts,radix);
lcd_puts(p);
while(1);
}

так какая-то фигня получается... при измерении 3х вольт ничего не выдает. а при измерении 2х выдает 41, при измерении 1В выдает 1....

фу.... помогите уж, перепишите мне на рабочий вариант, чтобы точно работало.....

Ссылка на комментарий
Поделиться на другие сайты

char *p;

Это Вы только указатель объявили, а область памяти под строку не выделили :

char stroka[кол-во отведённых байтов]="Строка";

lcd_puts(stroka);

Далее, указатель на этот массив (оно же - имя массива) нужно передать в функцию itoa. Она уже сама запихнёт нужные символы в эту строку (массив).

Вот же, почти по по первой ссылке в поисковике пример - http://www.c-cpp.ru/content/itoa :

int main(void)
{
char p[17];
itoa (1423, p, 16);
printf(p);
return 0;
}

Ссылка на комментарий
Поделиться на другие сайты

   #include <htc.h>

   #define _XTAL_FREQ 4000000
   #include <stdlib.h>

   #include "lcd.c"


   __CONFIG(WDTDIS & UNPROTECT & MCLRDIS &  INTOSCIO);


   main() {
   TRISA=0b00000001;
   CMCON=0x07;
   ADCON0=0b00000011;
   ADCON1=0b00100000;
   ANSEL=0b000000001;
   int h_adc, l_adc, v;
   char radix[5];
   l_adc=ADRESL;
   h_adc=ADRESH;
   __delay_ms(100);
   v=l_adc+h_adc*256;
   lcd_init();
   lcd_goto(0);
   itoa(v,radix,10);
   lcd_puts(radix);
   while(1);
   }

так у меня на данный момент времени выглядит код. у меня itoa была не верно написана. теперь если в puts текст вписать. то он высветится. но а если поставить массив radix, то индикатор ничего не показывает....

Ссылка на комментарий
Поделиться на другие сайты

Да, оно.

Всё понятно. У Вас она принимает константу, а это для хайтека - флешь память.

Дайте ссылку на неё, либо выложите сюда оба файла lcd.

Ссылка на комментарий
Поделиться на другие сайты

а если я просто удалю const?)

вот lcd.c:

/*
*   LCD interface example
*   Uses routines from delay.c
*   This code will interface to a standard LCD controller
*   like the Hitachi HD44780. It uses it in 4 bit mode, with
*   the hardware connected as follows (the standard 14 pin
*   LCD connector is used):
*  
*   PORTD bits 0-3 are connected to the LCD data bits 4-7 (high nibble)
*   PORTA bit 3 is connected to the LCD RS input (register select)
*   PORTA bit 1 is connected to the LCD EN bit (enable)
*  
*   To use these routines, set up the port I/O (TRISA, TRISD) then
*   call lcd_init(), then other routines as required.
*  
*/
#ifndef _XTAL_FREQ
// Unless specified elsewhere, 4MHz system frequency is assumed
#define _XTAL_FREQ 4000000
#endif

#include   <htc.h>
#include   "lcd.h"
#define   LCD_RS RA2
#define   LCD_RW RA4 //не уверян, что так надо....
#define LCD_EN RA5
#define LCD_DATA   PORTC
#define   LCD_STROBE()   ((LCD_EN = 1),(LCD_EN=0))
/* write a byte to the LCD in 4 bit mode */
void
lcd_write(unsigned char c)
{
  __delay_us(40);
  LCD_DATA = ( ( c >> 4 ) & 0x0F );
  LCD_STROBE();
  LCD_DATA = ( c & 0x0F );
  LCD_STROBE();
}
/*
*    Clear and home the LCD
*/
void
lcd_clear(void)
{
  LCD_RS = 0;
  lcd_write(0x1);
  __delay_ms(2);
}
/* write a string of chars to the LCD */
void
lcd_puts(const char * s)
{
  LCD_RS = 1;   // write characters
  while(*s)
  lcd_write(*s++);
}
/* write one character to the LCD */
void
lcd_putch(char c)
{
  LCD_RS = 1;   // write characters
  lcd_write( c );
}

/*
* Go to the specified position
*/
void
lcd_goto(unsigned char pos)
{
  LCD_RS = 0;
  lcd_write(0x80+pos);
}

/* initialise the LCD - put into 4 bit mode */
void
lcd_init()
{
  char init_value;
  CMCON  = 0x07;    // Disable analog pins on PORTA
  init_value = 0x3;
  TRISA=0;
  TRISC=0;
  LCD_RS = 0;
  LCD_EN = 0;
  LCD_RW = 0;

  __delay_ms(15);   // wait 15mSec after power applied,
  LCD_DATA    = init_value;
  LCD_STROBE();
  __delay_ms(5);
  LCD_STROBE();
  __delay_us(200);
  LCD_STROBE();
  __delay_us(200);
  LCD_DATA = 2;   // Four bit mode
  LCD_STROBE();
  lcd_write(0x28); // Set interface length
  lcd_write(0xF); // Display On, Cursor On, Cursor Blink
  lcd_clear();   // Clear screen
  lcd_write(0x6); // Set entry Mode
}

а вот lcd.h:

/*
*   LCD interface header file
*   See lcd.c for more info
*/
/* write a byte to the LCD in 4 bit mode */
extern void lcd_write(unsigned char);
/* Clear and home the LCD */
extern void lcd_clear(void);
/* write a string of characters to the LCD */
extern void lcd_puts(const char * s);
/* Go to the specified position */
extern void lcd_goto(unsigned char pos);

/* intialize the LCD - call before anything else */
extern void lcd_init(void);
extern void lcd_putch(char);
/*   Set the cursor position */
#define   lcd_cursor(x)   lcd_write(((x)&0x7F)|0x80)

Ссылка на комментарий
Поделиться на другие сайты

Если Вы удалите const, Вы не сможете выводить строки из флеша.

Лучше создать копию этой функции, с принимаемым параметром - указатель на неконстантный char.

Переименуйте эту в lcd_fputs, а lcd_puts создайте новую. lcd_fputs будет принимать строки из флеши, а lcd_puts из RAM.

Ссылка на комментарий
Поделиться на другие сайты

Должно помочь. По последнему коду, вроде бы ошибок не наблюдается.

Если отлаживаете на протеусе, то можете сюда выложить весь проект, вместе с файлом протеуса ? Поглянем что у Вас там не так...

Ссылка на комментарий
Поделиться на другие сайты

так. я погуглил и sprintf чтоб работал надо подключить stdio.h, а у меня был отдельно sprintf.... сделал это добавив stdio.h и выводится число даже через lcd_puts, но как обычно не то...

если опорное напряжение в протеусе выставляется 5В, а я подаю на вход 2В. разрядность 10 бит, то 2*1024/5В =409,5, а у меня выводится 1254....

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...