Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
diim
Нашел транзистор. Понюхал.
Сообщения: 168
Зарегистрирован: Сб фев 16, 2008 04:35:19
Откуда: г.Тольятти
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение diim »

(ADC_VREF_TYPE & 0xff)

// Delay needed for the stabilization of the ADC input voltage

это выдал коомпилятор
diim писал(а):
{read_adc(3);a=0;};//считываем наряжение с PINB.3 результат записываем в ADCH
Мастер Ломастер писал(а): неверно, напряжение считываем, результат теряем. бессмысленно. а в прерывании это делать вдвойне нехорошо.

исправлю щась бы с кнопкой разобраться!
diim писал(а):
// Func5=Out Func4=Out Func3=In Func2=Out Func1=Out Func0=Out
// State5=0 State4=0 State3=T State2=0 State1=0 State0=0

на самом деле там вот так:

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

// Func5=In Func4=In Func3=In Func2=Out Func1=In Func0=In 
// State5=P State4=P State3=P State2=0 State1=P State0=P
PORTB=0x3B;
DDRB=0x04;

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

Re: Вопросы по С/С++ (СИ)

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

как работать с кнопками (самый простой способ), я товарищу советовал в этой теме: viewtopic.php?f=20&t=56906
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
diim
Нашел транзистор. Понюхал.
Сообщения: 168
Зарегистрирован: Сб фев 16, 2008 04:35:19
Откуда: г.Тольятти
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение diim »

как с кнопками работать я маненько знаю, но ведь простой код должен работать

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

PORTB.2= PINB.4;

все порты настроены на вход с подтяжкой, кроме PORTB.2 он выход!
т.е. при замыкании PORTB.4 на массу там будет 0!!! что и должно присвоится PORTB.2,
а при отпускании на PORTB.4 должна быть 1. и она присвоится PORTB.2
но этого почемуто нету!
что еще им не хватает?
***********
Не трогайте мокрыми руками оголённые провода, они могут заржаветь.
***********
Rusja2008
Открыл глаза
Сообщения: 68
Зарегистрирован: Пн окт 06, 2008 15:51:58
Откуда: Черкассы

Re: Вопросы по С/С++ (СИ)

Сообщение Rusja2008 »

Код то конечно простой, но я бы не советовал пользоваться всеми упрощениями CVA (PINB.0 и др.), потом тяжело отвыкнуть, тем более так в лоб PORTB.2= PINB.4. И я уже советовал форумчанам в основной цикл ставить ну хоть небольшую задержку, если нужно выполнить всего одно простое действие.

Попробуйте такой код, в качестве примера:

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

if(PINB&(1<<4))
  {
  PORTB|=(1<<2);
  }
else
  {
  PORTB&=~(1<<2);
  }
_delay_ms(10);
Не умееш - не берись, но не взявшись не научишся.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Вопросы по С/С++ (СИ)

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

Rusja2008 писал(а):И я уже советовал форумчанам в основной цикл ставить ну хоть небольшую задержку, если нужно выполнить всего одно простое действие.
совет бессмысленный, безвредный, бесполезный. пользоваться можно :)))
битва с дураками проиграна, победители торжествуют. слава победителям!
Rusja2008
Открыл глаза
Сообщения: 68
Зарегистрирован: Пн окт 06, 2008 15:51:58
Откуда: Черкассы

Re: Вопросы по С/С++ (СИ)

Сообщение Rusja2008 »

Безвредный - это да, но не такой уж и безполезный.
Если отлаживать в протеусе (как многие и делают) частенько контроллер либо виснет наглухо, либо не выполняет вобще ничего. Если вкинуть хоть asm("nop") работает без проблем. И такое не только у меня.
Не умееш - не берись, но не взявшись не научишся.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Вопросы по С/С++ (СИ)

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

Rusja2008 писал(а):Безвредный - это да, но не такой уж и безполезный.
Если отлаживать в протеусе (как многие и делают) частенько контроллер либо виснет наглухо, либо не выполняет вобще ничего. Если вкинуть хоть asm("nop") работает без проблем. И такое не только у меня.
даже если это не только у вас, причина вовсе не в отсутствии задержек, а в чем-то ином.
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
diim
Нашел транзистор. Понюхал.
Сообщения: 168
Зарегистрирован: Сб фев 16, 2008 04:35:19
Откуда: г.Тольятти
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение diim »

приветствую всех форумчан!
спасибо за ответы! но как выяснилось простой код:

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

PORTB.2= PINB.4;

работает! :))
но это когда я создаю проект с начала с помощью мастера и без АЦП!!!
далее пробую создать новый проект но уже с АЦП, код перестаёт работать!!!
может стоит без мастера включить АЦП, чета он мудрит вроде?
***********
Не трогайте мокрыми руками оголённые провода, они могут заржаветь.
***********
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Вопросы по С/С++ (СИ)

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

diim писал(а):но это когда я создаю проект с начала с помощью мастера и без АЦП!!!
когда собираются одно делать два мастера... :)))
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

diim писал(а):приветствую всех форумчан!
спасибо за ответы! но как выяснилось простой код:

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

PORTB.2= PINB.4;

работает! :))
но это когда я создаю проект с начала с помощью мастера и без АЦП!!!
далее пробую создать новый проект но уже с АЦП, код перестаёт работать!!!
может стоит без мастера включить АЦП, чета он мудрит вроде?

так конечно, вы вообще как хотите чтобы кнопка работала?просто вкл выкл или от определенного напряжения.
Если все же собираетесь через напряжение покоментирую немного.
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Place your code here
a++;
if(a==150){read_adc(3);a=0;};//считываем наряжение с PINB.3 результат записываем в ADCH
//На самом деле тут мы ничего не записываем просто выполняется функция,а результат(ответ) теряется.
}

if(a==150) лучше вместо этого посчитать когда сделать прерывание и совсем опустить эту строку,
а вместо нее оставить ADC_result=read_adc(3);

и вообще сама функция read_adc как то быдлокодерски написана.
лучше конечно по прерыванию запускать ADC преобразование и выходить.А результат помещать в нужное место в прерывании от ADC об окончании преобразования.

вот про ADC для тини13

14. Analog to Digital Converter
14.1 Features
• 10-bit Resolution
• 0.5 LSB Integral Non-linearity
• ± 2 LSB Absolute Accuracy
• 13 - 260 µs Conversion Time
• Up to 15 kSPS at Maximum Resolution
• Four Multiplexed Single Ended Input Channels
• Optional Left Adjustment for ADC Result Readout
• 0 - V CC ADC Input Voltage Range
• Selectable 1.1V ADC Reference Voltage
• Free Running or Single Conversion Mode
• ADC Start Conversion by Auto Triggering on Interrupt Sources
• Interrupt on ADC Conversion Complete//Вот то что вам нужно:)
• Sleep Mode Noise Canceler
В поисках истины человек развивается.
Аватара пользователя
diim
Нашел транзистор. Понюхал.
Сообщения: 168
Зарегистрирован: Сб фев 16, 2008 04:35:19
Откуда: г.Тольятти
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение diim »

спасибо vitalik_1984 за ответ!
мне нужно было чтобы при влюченном АЦП работал тот кусок кода, вот и всё!
но я уже разобрался, с переводчиком :) плохо незнать буржуйского языка :o
оказывается :idea: дело было в том что при включении АЦП я отключал цифровой вход этого порта, будь он неладен :kill:
спасибо за ответы!
***********
Не трогайте мокрыми руками оголённые провода, они могут заржаветь.
***********
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

diim писал(а):спасибо vitalik_1984 за ответ!
мне нужно было чтобы при влюченном АЦП работал тот кусок кода, вот и всё!
но я уже разобрался, с переводчиком :) плохо незнать буржуйского языка :o
оказывается :idea: дело было в том что при включении АЦП я отключал цифровой вход этого порта, будь он неладен :kill:
спасибо за ответы!

Значит при отключении его нужно включить цифровой вход:)

Как решили вопрос?
В поисках истины человек развивается.
Аватара пользователя
diim
Нашел транзистор. Понюхал.
Сообщения: 168
Зарегистрирован: Сб фев 16, 2008 04:35:19
Откуда: г.Тольятти
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение diim »

в тини 13, 4 канала АЦП, которые соответствуют РВ.3-РВ.5 я использовал один канал ADC3 который закреплен за РВ.3, а остальные каналы можно не использовать для уменьшения энэргопотребления вот они и отключаются переводом соответствующего порта в цифровой вход и уже его мона использовать по своему усмотрению!а я по незнанке отключал все цифровые входы и не понимал почему не хочет работать :shock: а решил все это с помощью книги "CodeVisionAVR пособие для начинающих" там как раз всё переведено :))
***********
Не трогайте мокрыми руками оголённые провода, они могут заржаветь.
***********
Vlad0o
Открыл глаза
Сообщения: 67
Зарегистрирован: Вт июл 19, 2011 19:09:46

Re: Вопросы по С/С++ (СИ)

Сообщение Vlad0o »

Здравствуйте.
Я продолжаю постигать Си и ds1820. Я хочу вывести на экран ROM датчика все 8 байт. Ну и для теста написал вот это:

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

while(1)
{
int i;
const char sensor1[8] = {0x28, 0xB3, 0x0E, 0x6C, 0x01, 0x00, 0x00, 0x5E}; //это пример ROM для ds18B20
const char ROMt0[2];
 for ( i = 0; i < 8; i++) {
   sprintf(ROMt0,"%x", sensor1[i]);
write_1(0, ROMt0); //вывод на лсд по одному.
Delay(50000);
Delay(50000);
Delay(50000);
Delay(50000);
  }



Так вот вместо 01 в 0x01 высветилось 19, вместо 00 - 90, вместо 0Е - Е9.
Как мне вывести на экран "достоверный" ROM ?
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Вопросы по С/С++ (СИ)

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

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

Re: Вопросы по С/С++ (СИ)

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

const char ROMt0[2];
Aerarh
Открыл глаза
Сообщения: 74
Зарегистрирован: Чт сен 29, 2011 13:54:53

Re: Вопросы по С/С++ (СИ)

Сообщение Aerarh »

char *b;
sprintf(b,"%f VDC", ADC_ReadVoltage());

Результат b="%f VDC"; ПОЧЕМУ?
Поговорим в скайпе fl.ua.aaa.
Vlad0o
Открыл глаза
Сообщения: 67
Зарегистрирован: Вт июл 19, 2011 19:09:46

Re: Вопросы по С/С++ (СИ)

Сообщение Vlad0o »

01 я так понимаю два байта и вроде как плюс еще один. Вы (Мастер Ломастер) мне уже писали про это размер массива должен быть на 1 символ больше, чем самая длинная строка. Значит мне надо было выделить под это дело ROMt0[3]
но это не помогает. На экране появляется три символа: в случаи с 01 это 199. А у 6С это 6С9.

Как я понимаю 0х01 это 1 (так же как и 0х0Е всего лишь Е), а так как у меня в ROMt0 выделено скажем так две позиции то он и выводит 1 9, почему то на пустом месте пишет 9. почему я пока не знаю. Единственный выход это как то сделать проверку сколько символов займет и выводить либо ROMt0[2] (на два символа) либо ROMt0[1] (на один символ).

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

Re: Вопросы по С/С++ (СИ)

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

Vlad0o, каким образом функция sprintf уложит результат в массив констант ? Это-же константа, она неизменна !
Vlad0o
Открыл глаза
Сообщения: 67
Зарегистрирован: Вт июл 19, 2011 19:09:46

Re: Вопросы по С/С++ (СИ)

Сообщение Vlad0o »

Аlex, каким образом это получается я не знаю, но обычный текст отображается на экране.
вот функция для лсд:

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

void write_1(unsigned char pos, const char *a)
{
lcd_CMD(0x80 + pos);   // 1000 0000
while (*a)
   {
      lcd_write(*a++);
   }
}

write_1(0, "ОК") и на экране будет ОК

Потом попробую заменить в void write_1(unsigned char pos, const char *a) const char *a на char *a. Теоретически и там и там массивы получаются? Замена будет равносильной?


/////////////////
Замена была равносильной, но ниче не получилось все так же и осталось... Но это сейчас не самая главная проблема.

Самая главная проблема в размере после компиляции. простенькая программа (инициализация лсд + вывод 8 байт на экран):
такой вариант .hex файл весит ~5 кб

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

while(1)
{
int i;
const char sensor1[8] = {0x28, 0xB3, 0x0E, 0x6C, 0x01, 0x00, 0x00, 0x5E}; //это пример ROM для ds18B20
const char ROMt0[2];
for ( i = 0; i < 8; i++) {
   sprintf(ROMt0,"%x", sensor1[i]);
write_1(0, ROMt0); //вывод на лсд по одному.
Delay(50000);
Delay(50000);
Delay(50000);
Delay(50000);
  }


Если закомментить
/*

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

 sprintf(ROMt0,"%x", sensor1[i]);
write_1(0, ROMt0); //вывод на лсд по одному.

*/
.hex файл уже весит весит ~2 кб :o

Неужели sprintf() так много занимает? и есть ли другие варианты чем можно заменить?
И какие приемы используют, чтоб оптимизировать (по "объему" - чтоб меньше "весил", а то всего 8 кб флэш) код? АСМ не предлагать :)))

PS плохо вот так наскоком языки программирования изучать..
Ответить

Вернуться в «Разные вопросы по МК»