Страница 48 из 386
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт окт 27, 2011 14:35:36
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;
просто осталось после первой настройки контроллера.
кнопка тянет на землю!
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт окт 27, 2011 14:45:00
Мастер Ломастер
как работать с кнопками (самый простой способ), я товарищу советовал в этой теме:
http://radiokot.ru/forum/viewtopic.php?f=20&t=56906
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт окт 27, 2011 14:53:56
diim
как с кнопками работать я маненько знаю, но ведь простой код должен работать
все порты настроены на вход с подтяжкой, кроме PORTB.2 он выход!
т.е. при замыкании PORTB.4 на массу там будет 0!!! что и должно присвоится PORTB.2,
а при отпускании на PORTB.4 должна быть 1. и она присвоится PORTB.2
но этого почемуто нету!
что еще им не хватает?
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт окт 27, 2011 17:36:44
Rusja2008
Код то конечно простой, но я бы не советовал пользоваться всеми упрощениями CVA (PINB.0 и др.), потом тяжело отвыкнуть, тем более так в лоб PORTB.2= PINB.4. И я уже советовал форумчанам в основной цикл ставить ну хоть небольшую задержку, если нужно выполнить всего одно простое действие.
Попробуйте такой код, в качестве примера:
Код: Выделить всё
if(PINB&(1<<4))
{
PORTB|=(1<<2);
}
else
{
PORTB&=~(1<<2);
}
_delay_ms(10);
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт окт 27, 2011 17:46:47
Мастер Ломастер
Rusja2008 писал(а):И я уже советовал форумчанам в основной цикл ставить ну хоть небольшую задержку, если нужно выполнить всего одно простое действие.
совет бессмысленный, безвредный, бесполезный. пользоваться можно

Re: Вопросы по С/С++ (СИ)
Добавлено: Чт окт 27, 2011 18:27:52
Rusja2008
Безвредный - это да, но не такой уж и безполезный.
Если отлаживать в протеусе (как многие и делают) частенько контроллер либо виснет наглухо, либо не выполняет вобще ничего. Если вкинуть хоть asm("nop") работает без проблем. И такое не только у меня.
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт окт 27, 2011 19:11:32
Мастер Ломастер
Rusja2008 писал(а):Безвредный - это да, но не такой уж и безполезный.
Если отлаживать в протеусе (как многие и делают) частенько контроллер либо виснет наглухо, либо не выполняет вобще ничего. Если вкинуть хоть asm("nop") работает без проблем. И такое не только у меня.
даже если это не только у вас, причина вовсе не в отсутствии задержек, а в чем-то ином.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт окт 28, 2011 15:52:56
diim
приветствую всех форумчан!
спасибо за ответы! но как выяснилось простой код:
работает!
но это когда я создаю проект с начала с помощью мастера и без АЦП!!!
далее пробую создать новый проект но уже с АЦП, код перестаёт работать!!!
может стоит без мастера включить АЦП, чета он мудрит вроде?
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт окт 28, 2011 17:15:50
Мастер Ломастер
diim писал(а):но это когда я создаю проект с начала с помощью мастера и без АЦП!!!
когда собираются одно делать два мастера...

Re: Вопросы по С/С++ (СИ)
Добавлено: Пт окт 28, 2011 21:43:06
vitalik_1984
diim писал(а):приветствую всех форумчан!
спасибо за ответы! но как выяснилось простой код:
работает!
но это когда я создаю проект с начала с помощью мастера и без АЦП!!!
далее пробую создать новый проект но уже с АЦП, код перестаёт работать!!!
может стоит без мастера включить АЦП, чета он мудрит вроде?
так конечно, вы вообще как хотите чтобы кнопка работала?просто вкл выкл или от определенного напряжения.
Если все же собираетесь через напряжение покоментирую немного.
// 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
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт окт 28, 2011 21:55:31
diim
спасибо
vitalik_1984 за ответ!
мне нужно было чтобы при влюченном АЦП работал тот кусок кода, вот и всё!
но я уже разобрался, с переводчиком

плохо незнать буржуйского языка
оказывается

дело было в том что при включении АЦП я отключал цифровой вход этого порта, будь он неладен
спасибо за ответы!
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт окт 28, 2011 22:07:50
vitalik_1984
diim писал(а):спасибо
vitalik_1984 за ответ!
мне нужно было чтобы при влюченном АЦП работал тот кусок кода, вот и всё!
но я уже разобрался, с переводчиком

плохо незнать буржуйского языка
оказывается

дело было в том что при включении АЦП я отключал цифровой вход этого порта, будь он неладен
спасибо за ответы!
Значит при отключении его нужно включить цифровой вход:)
Как решили вопрос?
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт окт 28, 2011 22:20:43
diim
в тини 13, 4 канала АЦП, которые соответствуют РВ.3-РВ.5 я использовал один канал ADC3 который закреплен за РВ.3, а остальные каналы можно не использовать для уменьшения энэргопотребления вот они и отключаются переводом соответствующего порта в цифровой вход и уже его мона использовать по своему усмотрению!а я по незнанке отключал все цифровые входы и не понимал почему не хочет работать

а решил все это с помощью книги "CodeVisionAVR пособие для начинающих" там как раз всё переведено

Re: Вопросы по С/С++ (СИ)
Добавлено: Сб окт 29, 2011 16:52:57
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 ?
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб окт 29, 2011 19:15:26
Мастер Ломастер
прежде чем ответить на вопрос "почему вывелось не то", я задам вам вопрос: сколько байтов занимает строка "01"? как только вы найдете правильный ответ - можно будет говорить и про остальные проблемы.
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб окт 29, 2011 20:50:29
Аlex
Re: Вопросы по С/С++ (СИ)
Добавлено: Вс окт 30, 2011 09:06:33
Aerarh
char *b;
sprintf(b,"%f VDC", ADC_ReadVoltage());
Результат b="%f VDC"; ПОЧЕМУ?
Re: Вопросы по С/С++ (СИ)
Добавлено: Вс окт 30, 2011 12:49:07
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, на другие будет ругаться. А чтоб это исправить мне придется переписывать довольно глубоко. я оставлю этот вариант на крайний случай.
Re: Вопросы по С/С++ (СИ)
Добавлено: Вс окт 30, 2011 13:17:09
Аlex
Vlad0o, каким образом функция sprintf уложит результат в массив констант ? Это-же константа, она неизменна !
Re: Вопросы по С/С++ (СИ)
Добавлено: Вс окт 30, 2011 15:18:46
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 кб
Неужели sprintf() так много занимает? и есть ли другие варианты чем можно заменить?
И
какие приемы используют, чтоб оптимизировать (по "объему" - чтоб меньше "весил", а то всего 8 кб флэш) код?
АСМ не предлагать
PS плохо вот так наскоком языки программирования изучать..