Страница 1 из 2

Помогите с подпрограммами на СИ

Добавлено: Пт сен 18, 2009 16:02:41
Tigra
Здрасти ВСЕМ!!!
Помогите пожалуйста советом.
Я написал программу в которой часто повторяются одинаковые куски кода (опрос ТМ и сравнивание полученного кода , код для работы зумера и др.....) .Всё что хотелось написать не помещается в память контроллера. На асме писать неумею, а си знаю не весь.
У меня такой вопрос - Можно-ли написать эти коды один раз и с помощью оператора RETURN в нужных местах программы обращаться к ним , а после выполнения возвращаться в исходное место?
Если ДА- то как это сделать?
Если НЕТ- то :cry:
Заранее СПАСИБО!

Добавлено: Пт сен 18, 2009 16:35:15
spongebob
может для начала стоит забыть бейсик и изучить основы с?
есть такое понятие как функция.

Добавлено: Пт сен 18, 2009 16:40:35
Tigra
Если не трудно киньте пример программы с RETURN или сылку где можно разобраться.

Добавлено: Пт сен 18, 2009 17:15:05
Vov123
То что вам,скорее всего надо,в С называется функцией.
Формат типа того
тип вощзвращаемого аргумента _имя функции (параметр_1,параметр_2,...);

Пример вот личный,если хотите можете пользоваться

void write_data_24C08(unsigned int adr_rom,unsigned char data)
{
unsigned int adr; //адрес куда будем записывать с учётом банка
unsigned char bank;//номер банка куда будем записывать данные (0-3)
unsigned char SLA_W;//CONTROL BYTE(4 бита-физический адрес,3 бита-номер банка,последний 0-направление (на запись)
if(adr_rom<256>255)&&(adr_rom<512>511)&&(adr_rom<768>767){bank=3;(char)adr=adr_rom-768;} //переключатели взависимости от номера ячейки памяти
SLA_W=0xA0 | (bank*2); //с преобразованием типа(из INT в CHAR)
Start;
while(BUSY);
TWDR=SLA_W; //адрес по даташиту (4-бита) и 3-бита это номер банка (4 банка по 256 бит)
ACK; //адресные ножки микросхемы (A0-A2)физически внутренне не подключены
while(BUSY);
TWDR=adr; //адрес в EEPROM(с учётом банка,одного из четырёх,для 24C08
ACK;
while(BUSY);
TWDR=data; //сами данные,которые будем записывать в EEPROM
ACK;
while(BUSY);
Stop;
delay_us(20);
}
Эта функция записывает ваши данные в нужный вам адрес микросхемы памяти 24C08 по I2C.
Здесь данные и адреса могут быть разными,а функция одна.

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

Добавлено: Пт сен 18, 2009 17:17:12
МитяРа
А на ассемблере это называется - вызов подпрограммы...

Добавлено: Пт сен 18, 2009 17:17:20
Tigra
Vov123 писал(а):То что вам,скорее всего надо,в С называется функцией.
Формат типа того
тип вощзвращаемого аргумента _имя функции (параметр_1,параметр_2,...);
а можно маленький пример на си

Добавлено: Пт сен 18, 2009 17:19:41
DrWatson
Советую для начала почитать какой-нибудь учебник для начинающих по Си (но не С++ или С# а именно просто С).

Добавлено: Пт сен 18, 2009 17:19:42
МитяРа
Tigra..
Будите у нас на Калыме!
Так всё-таки будИте или будЕте ?
А то - мы разбудим, кто там у вас спит ? :)))

Re: Помогите с подпрограммами на СИ

Добавлено: Пт сен 18, 2009 17:34:45
Yellow Tiger
Tigra писал(а):... и с помощью оператора RETURN ... обращаться к ним ...
Вызовы оператором RETURN не осуществляются даже в бейсике. Думаю, пока не следует браться за Си.

Re: Помогите с подпрограммами на СИ

Добавлено: Пт сен 18, 2009 17:44:24
Tigra
Yellow Tiger писал(а):
Tigra писал(а):... и с помощью оператора RETURN ... обращаться к ним ...
Вызовы оператором RETURN не осуществляются даже в бейсике. Думаю, пока не следует браться за Си.

А я думал, что этот форум существует для помощи начинающим в изучении работы с контроллерами , а тут вместо полезных для дела советов вставляют палки в колёса!
Вы лучше напишите как ркшить мою проблемму,если знаете как?

Добавлено: Пт сен 18, 2009 17:45:15
Владимир К.
Вот примерный порядок использования функций.

Добавлено: Пт сен 18, 2009 17:52:09
Tigra
Владимир К. писал(а):Вот примерный порядок использования функций.
Спасибо ,буду разбираться.

Re: Помогите с подпрограммами на СИ

Добавлено: Пт сен 18, 2009 21:07:54
Yellow Tiger
Tigra писал(а):а тут ... вставляют палки в колёса!
Напротив - совет не писать на Си тебе сейчас будет очень кстати, язык Си противопоказан при таких обстоятельствах, в которых ты находишься. Начни с чего-нибудь попроще.

Добавлено: Пт сен 18, 2009 21:37:01
izmmisha
Да дайте вы уже простой пример использования функций которые возвращают значение :)

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

int some_func(int x) {
    int t = x+3;
    return t*t;
}

int main(void) {
   int b = 2;
   int c, d;
   c = some_func(b);
   d = some_func(c);
   return 0;
}

Добавлено: Пт сен 18, 2009 21:46:15
Tigra
izmmisha писал(а):Да дайте вы уже простой пример использования функций которые возвращают значение :)

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

int some_func(int x) {
    int t = x+3;
    return t*t;
}

int main(void) {
   int b = 2;
   int c, d;
   c = some_func(b);
   d = some_func(c);
   return 0;
}

спасибо вам за пример кода, но мне нужно не возвращать значение, а уходить в подпрограмму,а после её выполнения возвращаться на следующую строчку основной программы откда была вызванна подпрограмма.

Добавлено: Пт сен 18, 2009 21:51:23
izmmisha
Tigra писал(а):мне нужно не возвращать значение, а уходить в подпрограмму,а после её выполнения возвращаться на следующую строчку основной программы откда была вызванна подпрограмма.

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

void do_something() {
    PORTB = (PINB & _BV(PB6))?_BV(PB3):0;
}

int main(void) {
   /*тут делается чего то*/
   // вызываем функцию которая делает что-то часто используемое
   do_something();
   /*опять чего нить делаем*/
   // вызываем функцию которая делает что-то часто используемое
   do_something();
   return 0;
} 

Добавлено: Пт сен 18, 2009 21:54:02
Tigra
izmmisha писал(а):
Tigra писал(а):мне нужно не возвращать значение, а уходить в подпрограмму,а после её выполнения возвращаться на следующую строчку основной программы откда была вызванна подпрограмма.

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

void do_something() {
    PORTB = (PINB & _BV(PB6))?_BV(PB3):0;
}

int main(void) {
   /*тут делается чего то*/
   // вызываем функцию которая делает что-то часто используемое
   do_something();
   /*опять чего нить делаем*/
   // вызываем функцию которая делает что-то часто используемое
   do_something();
   return 0;
} 
Спасибо огромное - теперь понял!!!!!!!!

Побольше-бы таких людей в форумы.

Добавлено: Пт сен 18, 2009 22:24:01
Pooher
И всё же не стоит задавать подобных вопросов не ознакомившись с базовой теорией. Вам уже советовали, ну почитайте учебник, иначе этот вопрос будет далеко не последним. Процедуры и функции - это базовые понятия, и использование оных практически не зависит от того, для чего Вы пишите, будь то МК, ПК, ... .

Добавлено: Пт сен 18, 2009 22:47:11
Tigra
Pooher писал(а):И всё же не стоит задавать подобных вопросов не ознакомившись с базовой теорией. Вам уже советовали, ну почитайте учебник, иначе этот вопрос будет далеко не последним. Процедуры и функции - это базовые понятия, и использование оных практически не зависит от того, для чего Вы пишите, будь то МК, ПК, ... .
Програмирование микроконтроллеров не является моим основным занятием . Я занимаюсь установкой противоугонных систем на автомобили и там поверьте мне на слово есть чем занять голову, и к сожалению времени на изучение с нуля программированию микроконтроллеров, без чьей либо помощи является для меня сложной задачей. Я по возможности читаю учебники, но книга не всегда может помочь так, как человек в этом деле разбирающийся.
К сожалению большая часть людей в этом форуме готова строчить по три листа мелким шрифтом кто и что где-то недочитал, неже-ли просто НАПИСАТЬ 2 СТРОЧКИ КОДА С ПОЯСНЕНИЯМИ!
Извеняюсь если я кого-то этим письмом обидел, но это так.

Добавлено: Сб сен 19, 2009 01:19:55
Pooher
Програмирование микроконтроллеров не является моим основным занятием
Вы здесь не один такой :)
К сожалению большая часть людей в этом форуме готова строчить по три листа мелким шрифтом кто и что где-то недочитал, неже-ли просто НАПИСАТЬ 2 СТРОЧКИ КОДА С ПОЯСНЕНИЯМИ!
Мда. Ну не скажу что утверждение неожиданное.