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