глобальные переменные

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Transistor
Прорезались зубы
Сообщения: 209
Зарегистрирован: Пт авг 27, 2010 18:05:09

глобальные переменные

Сообщение Transistor »

Как сделать глобальную переменную в CCS pic чтоби она была выдна изовсех функций.
Да кстате как передать строку в функцию или масив из чисел в функцию.
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Перемение глобальные

Сообщение Аlex »

чтоби она была выдна изовсех функций
Объявить её вне функций.
как передать строку в функцию
Через указатель.
Реклама
Transistor
Прорезались зубы
Сообщения: 209
Зарегистрирован: Пт авг 27, 2010 18:05:09

Re: Перемение глобальные

Сообщение Transistor »

Делал вот так

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

void enterkey (char* pas)
{
...
if input[i]=pas[i]
...
}
void main()
{
...
char pas[5]="        ";
enterkey (pas);
...
}
врезультате херня в регистре 4 значное 16ое число но никак не строка символов
Аватара пользователя
Psych
Опытный кот
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

Re: Перемение глобальные

Сообщение Psych »

Хоть я и знаю что не правильно, но еще так можно void Function (char data[])
Потом Function("Всякая фигня"). Но крайне не рекомендуется.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Перемение глобальные

Сообщение urry »

char *pas=" ";
или
char pas[5]={0x20,0x20,0x20,0x20,0x20};

в первом случае выделится 6 байт - последний - завершающий 0.
Реклама
Transistor
Прорезались зубы
Сообщения: 209
Зарегистрирован: Пт авг 27, 2010 18:05:09

Re: Перемение глобальные

Сообщение Transistor »

void Function (char data[])
При етом всеодно херня получается.
перед вызовом етой функции прописоваю наподобе етой, строку char pas[5]={0x20,0x20,0x20,0x20,0x20};
получается набор символов (отображает матлаб) но после передачи етой строки в функцию (точнее процедура так как результатов она не вертает) получается херня и введеная строка несовпадает из строкой которую передаю в функцию.
Реклама
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Перемение глобальные

Сообщение urry »

Херню в студию !

Хочу деталей.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Перемение глобальные

Сообщение Мастер Ломастер »

urry писал(а):Херню в студию !
Хочу деталей.
и это правильно! херней пусть маются в студии, а детали мы пустим в дело :)))
битва с дураками проиграна, победители торжествуют. слава победителям!
Transistor
Прорезались зубы
Сообщения: 209
Зарегистрирован: Пт авг 27, 2010 18:05:09

Re: Перемение глобальные

Сообщение Transistor »

Не вопрос:

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

#if defined(__PCM__)
#INCLUDE <16F84A.h>
//#device PIC16F84A 
//#INCLUDE <stdlib.h>
#fuses HS,NOWDT,NOPROTECT,PUT
#use delay(clock=4000000)
#endif
void ring (int* ring)
{
int8 c=1;
if (ring==1)
{
output_high (PIN_B1);
delay_us (10);
output_low (PIN_B1);
}
else
do
 {
c=c+1;
output_high (PIN_B1);
delay_us (1);
output_low (PIN_B1);
 }
while (c==5);
}
void open(void)
{
output_high (PIN_B2);
output_high (PIN_B3);
ring (2);
delay_us (10);
output_low (PIN_B2);
output_low (PIN_B3);
}
unsigned int keybord (void)
{
int8 key=0,i;
output_low (PIN_A1);//CLK
output_low (PIN_A0);//S1
output_high (PIN_A0);//S1
output_high (PIN_A1);//CLK
output_low (PIN_A1);//CLK
output_low (PIN_A0);//S1
if(input(PIN_A2))
bit_set (key,0);
for (i=1;i<=7;++i)
  {
output_high (PIN_A1);
output_low (PIN_A1);
if(!input(PIN_A2))
bit_set (key,i);
  }
output_high (PIN_B7);
output_low (PIN_B7);
return (key);
}
char rpEEPROM(int8 i)
{
char word[1];
word[1]=read_eeprom(i); 
return (word);
}
void setpassword (void)
{
}
void enterkey (char password[])
{
char key[5];
int8 i,p=0;
key[0]=keybord();//клавіатура
if (key[0]!=0)
 {
for (i=1;i<=5;++i)
  {
key[i]=keybord();
delay_us(5);
  }
for (i=0;i<=5;++i)
{
if (key[i]==password[i])
{}
else
p=1;
}
if (p=0)
open ();
 }
}
void main()
{
char password[5]={0x64,0x64,0x64,0x64,0x64};
int8 i;
SET_TRIS_A ( 0x1C ); //RA2,RA3,RA4-In
SET_TRIS_B ( 0xF1 ); //RA0,RA1-Out
output_low (PIN_A0); //RB1,RB2,RB3-Out
output_low (PIN_A1); //RB0,RB4,RB5,RB6,RB7-In
output_low (PIN_B1);
output_low (PIN_B2);
output_low (PIN_B3);
output_low (PIN_B7);
for (i=0;i<=5;++i)
 {
password[i]=rpEEPROM(i);
 }
if (!input(PIN_B5))
setpassword ();//запис коду
else
while (1)
 {
 if (!input(PIN_A3))
 ring (1);// звінок
 else
  {
 if (!input(PIN_A4))
 open ();// кнопка дверей
 else
   {
enterkey (password);
   }
  }
 }
}
void enterkey (char password[]) -- вот ето не работает чо делать?
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Перемение глобальные

Сообщение urry »

ну что в глаза бросается ?
переполнение массива здесь
for (i=1;i<=5;++i)
{
key=keybord();


все-таки 6 символов читаете вместо 5 (
key[5] - это 6 символ, а объявили 5 символьный массив)

при чтении из еепром происходит что-то странное
char rpEEPROM(int8 i)
{
char word[1];
word[1]=read_eeprom(i);
return (word);
}
хотя бы так
char rpEEPROM(int8 i)
{
return read_eeprom(i);
}

и чтобы не путаться с массивами, дайте другое имя

void enterkey (char *cArray)
{
for (i=0;i<=5;++i)
{
if (key==cArray)

рекомендую объявлять функции, а не переносить их вверх от main
Да, и никаких абсолютных значений в тексте.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Перемение глобальные

Сообщение Мастер Ломастер »

Transistor писал(а):void enterkey (char password[]) -- вот ето не работает чо делать?
а вот это, очевидно, работает:

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

void ring (int* ring)
{
int8 c=1;
if (ring==1)
{.......
?????
читать букварь по Си - срочно!!!!
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Перемение глобальные

Сообщение Аlex »

Transistor писал(а):но после передачи етой строки в функцию (точнее процедура так как результатов она не вертает) получается херня и введеная строка несовпадает из строкой которую передаю в функцию.
Так Вы поймите (хотябы логику включите), что в ф-ию передаётся не весь массив, а только его указатель ! Естественно, при входе в ф-ию, там ничего не будет. Точнее будет, по Вашему - "херня".
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Перемение глобальные

Сообщение Аlex »

Мастер Ломастер писал(а):а вот это, очевидно, работает:
?????
Да кстати. Человек использует указатели там, где не нужно и не использует там, где нужно. :)
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Перемение глобальные

Сообщение YS »

И еще... По-человечески форматируте код, пожалуйста. А то читать дюже неудобно, не видно границ логических блоков.

Я такую мешанину в седьмом классе на Паскале писал. :)))
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Перемение глобальные

Сообщение YS »

#if defined(__PCM__)
#INCLUDE <16F84A.h>
//#device PIC16F84A
//#INCLUDE <stdlib.h>
#fuses HS,NOWDT,NOPROTECT,PUT
#use delay(clock=4000000)
#endif
void ring (int* ring)
{
int8 c=1;
if (ring==1) Такая проверка необязательна. В С любое ненулевое условие считается истинным. if (ring) ...
{
output_high (PIN_B1); Лучше явно работать с портами, и по возможности не использовать компиляторо- и библиотекозависимых макросов.
delay_us (10);
output_low (PIN_B1);
}
else
do
{
c=c+1; Можно писать с++
output_high (PIN_B1);
delay_us (1);
output_low (PIN_B1);
}
while (c==5); Странное условие. do {} while(); работает не так, как Паскалевский repeat ... until. Условие в while() - условие выполнения, а не прекращения работы. Т.е., если необходимо выполнять, пока значение с не станет равным 5, следует писать while (c!=5)
}
void open(void)
{
output_high (PIN_B2);
output_high (PIN_B3);
ring (2);
delay_us (10);
output_low (PIN_B2);
output_low (PIN_B3);
}
unsigned int keybord (void)
{
int8 key=0,i;
output_low (PIN_A1);//CLK
output_low (PIN_A0);//S1
output_high (PIN_A0);//S1
output_high (PIN_A1);//CLK
output_low (PIN_A1);//CLK
output_low (PIN_A0);//S1
if(input(PIN_A2))
bit_set (key,0);
for (i=1;i<=7;++i) Опять же, я вижу влияние Паскаля на неокрепший разум. Когда хотят повторить семь раз, обычно пишут так: for (i=0; i<7; i++) Вообще, в С вся нумерация начинается с нуля, как в железе
{
output_high (PIN_A1);
output_low (PIN_A1);
if(!input(PIN_A2))
bit_set (key,i);
}
output_high (PIN_B7);
output_low (PIN_B7);
return (key);
}
char rpEEPROM(int8 i)
{
Ну, про этот шедевр уже до меня говорили :)))
char word[1];
word[1]=read_eeprom(i);
return (word);
}
void setpassword (void)
{
}
void enterkey (char password[])
{
char key[5];
int8 i,p=0;
key[0]=keybord();//клавіатура
if (key[0]!=0)
{
for (i=1;i<=5;++i)
{
key=keybord();
delay_us(5);
}
for (i=0;i<=5;++i)
Таки переполнение. Нумерация в С начинается с нуля...
{
if (key==password)
{}
Почему бы сразу не написать if (key!=password) ?
else
p=1;
}
if (p=0) if (p==0) ... Просто ошибка
open ();
}
}
void main()
{
char password[5]={0x64,0x64,0x64,0x64,0x64};
int8 i;
SET_TRIS_A ( 0x1C ); //RA2,RA3,RA4-In
SET_TRIS_B ( 0xF1 ); //RA0,RA1-Out
output_low (PIN_A0); //RB1,RB2,RB3-Out
output_low (PIN_A1); //RB0,RB4,RB5,RB6,RB7-In
output_low (PIN_B1);
output_low (PIN_B2);
output_low (PIN_B3);
output_low (PIN_B7);
for (i=0;i<=5;++i) И опять переполнение. Это не Паскаль. :)
{
password=rpEEPROM(i);
}
if (!input(PIN_B5))
setpassword ();//запис коду
else
while (1)
{
if (!input(PIN_A3))
ring (1);// звінок Кстати, там для звонка каие-то ж больно маленькие интервалы... В микросекундах...
else
{
if (!input(PIN_A4))
open ();// кнопка дверей
else
{
enterkey (password);
}
}
}
}
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Transistor
Прорезались зубы
Сообщения: 209
Зарегистрирован: Пт авг 27, 2010 18:05:09

Re: глобальные переменные

Сообщение Transistor »

Все ошибки которые вы описали поправил сделал лучшую читаемость но с указателями (*) и ссылками (&) так и нерозибрався работает. Кстати по чтению пароля с постоянной памяти, переменная i используемой непередаэться правильно только "0" передается хотя возвращается обратно нормально в вызывающую функцию. Относительно пауз вигладжу позже поставил так чтобы пауза была по меньше для отладки.
Так я учил Паскал немного мусора оттуда происходит.Возможно если бы первым языком был бы С проблем было бы поменьше, я так думаю.

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

#if defined(__PCM__)
#INCLUDE <16F84A.h>
//#device PIC16F84A 
#fuses HS,NOWDT,NOPROTECT,PUT
#use delay(clock=4000000)
#endif
void ring (int* ring);
void open (void);
unsigned int keybord (void);
char rpEEPROM(int8* i);
void setpassword (void);
void enterkey (char* password);
void main()
{
char password[5]={0x64,0x64,0x64,0x64,0x64};
int8 i;
SET_TRIS_A ( 0x1C ); //RA2,RA3,RA4-In
SET_TRIS_B ( 0xF1 ); //RA0,RA1-Out
output_low (PIN_A0); //RB1,RB2,RB3-Out
output_low (PIN_A1); //RB0,RB4,RB5,RB6,RB7-In
output_low (PIN_B1);
output_low (PIN_B2);
output_low (PIN_B3);
output_low (PIN_B7);
for (i=0;i<4;++i)
 {
  password[i]=rpEEPROM(i);
 }
if (!input(PIN_B5))
 setpassword ();//запис коду
else
 while (1)
   {
    if (!input(PIN_A3))
     ring (1);// звінок
    else
     {
      if (!input(PIN_A4))
       open ();// кнопка дверей
      else
       enterkey (&password);
     }
   }
}
void ring (int* ring)
{
 int8 c=1;
 if (ring)
  {
   output_high (PIN_B1);
   delay_us (10);
   output_low (PIN_B1);
  }
 else
  do
   {
    ++c;
    output_high (PIN_B1);
    delay_us (1);
    output_low (PIN_B1);
   }
  while (c!=5);
}
void open(void)
{
 output_high (PIN_B2);
 output_high (PIN_B3);
 ring (2);
 delay_us (10);
 output_low (PIN_B2);
 output_low (PIN_B3);
}
unsigned int keybord (void)
{
 int8 key=0,i;
 output_low (PIN_A1);//CLK
 output_low (PIN_A0);//S1
 output_high (PIN_A0);//S1
 output_high (PIN_A1);//CLK
 output_low (PIN_A1);//CLK
 output_low (PIN_A0);//S1
 if(input(PIN_A2))
  bit_set (key,0);
 for (i=1;i<7;++i)
   {
    output_high (PIN_A1);
    output_low (PIN_A1);
    if(!input(PIN_A2))
     bit_set (key,i);
   }
 output_high (PIN_B7);
 output_low (PIN_B7);
 return (key);
}
char rpEEPROM(int *i)
{
 return read_eeprom(&i);
}
void setpassword (void)
{
//////////////////////
}
void enterkey (char* password)
{
 char key[5];
 int8 i,p=0;
 key[0]=keybord();//клавіатура
 if (key[0]!=0)
  {
   for (i=0;i<4;++i)
    {
     key[i]=keybord();
     delay_us(5);
    }
   for (i=0;i<4;++i)
    {
     if (key[i]!=password[*i])
      p=1;
     }
   if (p==0)
    open ();
  }
}
П.С. А как сделать чтоби код розворачивалса при нажатии например "+" эсть такое в некоторих форумах если текст большой?
Transistor
Прорезались зубы
Сообщения: 209
Зарегистрирован: Пт авг 27, 2010 18:05:09

Re: глобальные переменные

Сообщение Transistor »

Пожалуста помагите
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: глобальные переменные

Сообщение Аlex »

Чем ? :)
Transistor
Прорезались зубы
Сообщения: 209
Зарегистрирован: Пт авг 27, 2010 18:05:09

Re: глобальные переменные

Сообщение Transistor »

Как чем немогу передать в функцию масив из символов.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: глобальные переменные

Сообщение Аlex »

Transistor писал(а):немогу передать в функцию масив из символов.
Вам ответов, которые здесь были, мало ? :shock:

PS: И пишите нормально, по Русски, со знаками препинания и без ошибок. Противно читать Ваши посты. :evil:
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»