реклама на сайте
подробности

 
 
> использование АЦП на AT91SAM7S256, функция "блинкера" от положения переменного резистора
alexan300
сообщение Nov 19 2009, 19:39
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 128
Регистрация: 17-03-08
Пользователь №: 35 988



Здравствуйте уажаемые господа!
наверно многие читали мои "крик души" в теме " как прошить AT91SAM7S256". Данное дело получило логическое развитие, а именно сеичас интерес мои к даннои плате все возрастает и вопросов соответвенно все больше. Усиленно изучаю книгу "Карнигана и Ричи", но как то тяжело перенести Си команды на использование их в МК. Но ладго, это лирическое отсупление.
имею следующий код, компилирумый без ошибок, но с 3 предупреждениями.
Код
#include "AT91SAM7S64.h"
#include "stdio.h"
#include "usart.h"
#include "adc.h"
#include "system.h"
#include "string.h"
#define BLINK_BIT   (1UL << 8)
void Delay (unsigned long a)
{ while (--a!=0); }
//MAIN POINTER
AT91PS_PIO    m_pPio   = AT91C_BASE_PIOA;
AT91PS_ADC    m_pADC   = AT91C_BASE_ADC;
AT91PS_RSTC   m_pRSTC  = AT91C_BASE_RSTC;
//AT91PS_PIO    p_pPio   = AT91C_BASE_PIOA;
AT91PS_PMC    p_pPMC   = AT91C_BASE_PMC;
//it's a simple delay
//void Delay (unsigned long a) { while (--a!=0); }

unsigned char* CalcVolt(unsigned int volt);

unsigned char res[12];//переменная без знака 1 ьаит.

int main()
{
  /**** System init ****/
  InitFrec();
  InitADC();

  /**** UART ****/
  //InitUSART0();
// InitUSART1();

  //Initialization
  InitPeriphery();

  while(1)//оператор уикла??
  {
//check button 2 pressed
    if(!((m_pPio->PIO_PDSR) & BIT20)) {
       //ClearTerminal();
       CalcVolt(GetValue_chanel4());
      // write_str_USART1(res);
       Delay(900000);
    }
  }
}
unsigned char* CalcVolt(unsigned int volt) {
  float V;
  V = (float)volt * 3.3/1024;
  sprintf((char *)res,"Volt %0.2f V",V);

   volatile int i;

  for(;;)
  {
    *AT91C_PIOA_SODR = BLINK_BIT;
    for(i = 0; i < 1000000; i++);
    Delay(V);
    *AT91C_PIOA_CODR = BLINK_BIT;
    for(i = 0; i < 100000; i++);
    Delay(V);
  }
  return 0;
}

Прошу помощи знатоков, что тут лишнее, чепго не хватает, может както можно упрастить сию задачу?
Данный код был изобретен сращением двух примеров. Задача, создать зависимость между частотои моргания 8 ноги, от поожния переменного резистора, подключенного к 20 ноге.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
defunct
сообщение Nov 19 2009, 23:08
Сообщение #2


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата
что тут лишнее, чего не хватает

По оформлению - main() лучше поставить последним, тогда не потребуется описывать прототипы и ее всегда будет просто найти - всегда в конце файла.

функция CalcVolt
1. не похожа на функцию написанную на языке C (переменные объявляются где попало и как попало это стиль C++);
2. из нее нет выхода
3. она содержит ошибку....

Ошибка вот в чем:
по прототипу
unsigned char * CalcVolt(unsigned int Volt);
фукнция должна возвращать указатель на какой-то массив где будет строка с "вольтами" или "валетами" как удобней. Никто так не делает, т.к. никто не хочет задумываться над вопросами - а где взять этот массив? и кто будет заботиться об освобождении памяти? Дык вот, чтобы об этом не задумываться, лучше поступить также как поступлено в sprintf - передать в качестве первого параметра указатель на буфер, куда можно класть строку-результат. Сама же функция пусть возвращает код ошибки или вообще ничего не возвращает:

Код
void CalcVolt( unsigned char * buf,  unsigned int Volt)
{
  float V = (float)volt * 3.3/1024;
  sprintf( buf ,"Volt %0.2f V",V);
}


4. Название функции не соответвует тому что она делает. Название говорит, что фукнция __считает__ вольты, если она их считает то результатом должно быть число. А если функция делает то, что у вас делает, то ей больше подходит название ConvertAdcValueToVoltStr. И входные параметры желательно называть правильно:

void ConvertAdcValueToVoltStr( unsigned char * destVoltStr, unsigned int AdcValue);

Цитата
можно упрастить сию задачу?

По алгоритму решения Вашей задачи думаю никто особо вникать не будет. То что вы привели, и так предельно просто.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 05:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.0139 секунд с 7
ELECTRONIX ©2004-2016