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

 
 
 
Reply to this topicStart new topic
> использование АЦП на 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
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
alexan300
сообщение Nov 20 2009, 21:15
Сообщение #3


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

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



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

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

компилятор ругается на "unsignet char"
Большое спасибо за обьяснения, но как Вы видите, форум посвещается начинающим))
Отдельные фразы я понимаю, но вот смысл всего вобщем от меня пока еще ускальзает)
Правильно ли я выбрал способ изменять частоту моргания?
Код
*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);

изменяя время задержки.
Go to the top of the page
 
+Quote Post
defunct
сообщение Nov 20 2009, 23:18
Сообщение #4


кекс
******

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



Цитата(alexan300 @ Nov 20 2009, 23:15) *
компилятор ругается на "unsignet char"

ругается, потому что опечатка - должно быть unsigned char.

и у меня опечатка (C чуствительный к регистру). должно быть
void CalcVolt( unsigned char * buf, unsigned int Volt)
{
float V = (float)Volt * 3.3/1024;
sprintf( buf ,"Volt %0.2f V",V);
}


Цитата(alexan300 @ Nov 20 2009, 23:15) *
Правильно ли я выбрал способ изменять частоту моргания?

Ну а почему нет? Если Вы на выходе добились требуемого результата, значит - правильно.
Бесспорно, есть и другие, тоже правильные, способы решения этой задачи.

Поэтому программист всегда задается двумя вопросами:
1. Почему так?
2. Как сделать иначе?
находя на них ответы - постепенно получает очки экпириенса, а затем и лэвэл-ап smile.gif

Цитата
Отдельные фразы я понимаю, но вот смысл всего вобщем от меня пока еще ускальзает)

попробуйте формулировать вопросы в более узкой форме. тогде не будет расплывчатых ответов.

Цитата
for(i = 0; i < 100000; i++);

холостые циклы можно заменить функцией Delay
Go to the top of the page
 
+Quote Post
alexan300
сообщение Nov 21 2009, 20:13
Сообщение #5


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

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



unsigned char- на это он и ругается, я просто сам не правильно в форум текст перенес)
v на V я заменил первым делом, после же первых матюков компилятора.
А результа я еще не добился, пока все на уровне ПК, бинарник я еще не скомпилировал..ибо ругается..
Сначало хочу все отточить в компе. а уж потом перенсести в процессор.
Подскажите, если я переменныи резистор на 100ком буду использовать в делители на входе, не слишком ли большой номинал, не слишком ли малые токи я получу, отреагирует ли МК на них???
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 22:02
Рейтинг@Mail.ru


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