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

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Встал на лапы
Аватара пользователя
Сообщения: 99
Зарегистрирован: Сб ноя 29, 2008 19:34:25
Откуда: Нальчик

Сообщение Tigra »

Здрасти ВСЕМ!!!
Помогите пожалуйста советом.
Я написал программу в которой часто повторяются одинаковые куски кода (опрос ТМ и сравнивание полученного кода , код для работы зумера и др.....) .Всё что хотелось написать не помещается в память контроллера. На асме писать неумею, а си знаю не весь.
У меня такой вопрос - Можно-ли написать эти коды один раз и с помощью оператора RETURN в нужных местах программы обращаться к ним , а после выполнения возвращаться в исходное место?
Если ДА- то как это сделать?
Если НЕТ- то :cry:
Заранее СПАСИБО!
Реклама
Грызет канифоль
Сообщения: 289
Зарегистрирован: Пт мар 20, 2009 12:25:47
Откуда: Ivanovo

Сообщение spongebob »

может для начала стоит забыть бейсик и изучить основы с?
есть такое понятие как функция.
Контактная информация:
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 99
Зарегистрирован: Сб ноя 29, 2008 19:34:25
Откуда: Нальчик

Сообщение Tigra »

Если не трудно киньте пример программы с RETURN или сылку где можно разобраться.
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31: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.
Здесь данные и адреса могут быть разными,а функция одна.

Не понимаю,я вставляю одно,а отображается исковерконным.
Присоеденю отдельно,а то бред какой-то получается.
Вложения
24C08.rar
(983 байт) 220 скачиваний
Последний раз редактировалось Vov123 Пт сен 18, 2009 17:37:53, всего редактировалось 3 раза.
Реклама
Эиком - электронные компоненты и радиодетали
Модератор
Аватара пользователя
Сообщения: 11492
Зарегистрирован: Чт дек 11, 2008 14:52:26
Откуда: град Нижний

Сообщение МитяРа »

А на ассемблере это называется - вызов подпрограммы...
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 99
Зарегистрирован: Сб ноя 29, 2008 19:34:25
Откуда: Нальчик

Сообщение Tigra »

Vov123 писал(а):То что вам,скорее всего надо,в С называется функцией.
Формат типа того
тип вощзвращаемого аргумента _имя функции (параметр_1,параметр_2,...);
а можно маленький пример на си
Реклама
Опытный кот
Аватара пользователя
Сообщения: 890
Зарегистрирован: Вт янв 20, 2009 14:49:08
Откуда: Гондурас, Мурманск

Сообщение DrWatson »

Советую для начала почитать какой-нибудь учебник для начинающих по Си (но не С++ или С# а именно просто С).
- Если вы такие умные, то почему тогда строем не ходите?
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
Модератор
Аватара пользователя
Сообщения: 11492
Зарегистрирован: Чт дек 11, 2008 14:52:26
Откуда: град Нижний

Сообщение МитяРа »

Tigra..
Будите у нас на Калыме!
Так всё-таки будИте или будЕте ?
А то - мы разбудим, кто там у вас спит ? :)))
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Tigra писал(а):... и с помощью оператора RETURN ... обращаться к ним ...
Вызовы оператором RETURN не осуществляются даже в бейсике. Думаю, пока не следует браться за Си.
Встал на лапы
Аватара пользователя
Сообщения: 99
Зарегистрирован: Сб ноя 29, 2008 19:34:25
Откуда: Нальчик

Сообщение Tigra »

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

А я думал, что этот форум существует для помощи начинающим в изучении работы с контроллерами , а тут вместо полезных для дела советов вставляют палки в колёса!
Вы лучше напишите как ркшить мою проблемму,если знаете как?
Мучитель микросхем
Аватара пользователя
Сообщения: 438
Зарегистрирован: Ср ноя 21, 2007 14:14:37
Откуда: Краснодар

Сообщение Владимир К. »

Вот примерный порядок использования функций.
Вложения
0117_0001.djvu
(45.12 КБ) 286 скачиваний
Electronikus mente prius et oculis agat, quam armata manu.
Встал на лапы
Аватара пользователя
Сообщения: 99
Зарегистрирован: Сб ноя 29, 2008 19:34:25
Откуда: Нальчик

Сообщение Tigra »

Владимир К. писал(а):Вот примерный порядок использования функций.
Спасибо ,буду разбираться.
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Tigra писал(а):а тут ... вставляют палки в колёса!
Напротив - совет не писать на Си тебе сейчас будет очень кстати, язык Си противопоказан при таких обстоятельствах, в которых ты находишься. Начни с чего-нибудь попроще.
Встал на лапы
Сообщения: 87
Зарегистрирован: Ср авг 26, 2009 15:59:39

Сообщение 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;
}
Встал на лапы
Аватара пользователя
Сообщения: 99
Зарегистрирован: Сб ноя 29, 2008 19:34:25
Откуда: Нальчик

Сообщение 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;
}

спасибо вам за пример кода, но мне нужно не возвращать значение, а уходить в подпрограмму,а после её выполнения возвращаться на следующую строчку основной программы откда была вызванна подпрограмма.
Встал на лапы
Сообщения: 87
Зарегистрирован: Ср авг 26, 2009 15:59:39

Сообщение izmmisha »

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

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

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

int main(void) {
   /*тут делается чего то*/
   // вызываем функцию которая делает что-то часто используемое
   do_something();
   /*опять чего нить делаем*/
   // вызываем функцию которая делает что-то часто используемое
   do_something();
   return 0;
} 
Встал на лапы
Аватара пользователя
Сообщения: 99
Зарегистрирован: Сб ноя 29, 2008 19:34:25
Откуда: Нальчик

Сообщение Tigra »

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

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

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

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

Побольше-бы таких людей в форумы.
Мучитель микросхем
Аватара пользователя
Сообщения: 491
Зарегистрирован: Вс янв 07, 2007 01:45:48
Откуда: Российская Федерация, будь она неладна...

Сообщение Pooher »

И всё же не стоит задавать подобных вопросов не ознакомившись с базовой теорией. Вам уже советовали, ну почитайте учебник, иначе этот вопрос будет далеко не последним. Процедуры и функции - это базовые понятия, и использование оных практически не зависит от того, для чего Вы пишите, будь то МК, ПК, ... .
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Встал на лапы
Аватара пользователя
Сообщения: 99
Зарегистрирован: Сб ноя 29, 2008 19:34:25
Откуда: Нальчик

Сообщение Tigra »

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

Сообщение Pooher »

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

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