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

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

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

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

Vlad0o писал(а):проверил. получилось вот так:
while(1)
{
char str[25];
sprintf(str,"%i", 56);
write_1(0, str);
T = 1;
Delay(2000);
T = 0;
Delay(2000);
}

Для int если число состоит меньше чем из 3 и больше чем из 4 цифр, то на лсд отображается либо ерунда 5значная либо 0.

Для float sprintf(str,"%f", 50,6); какое бы число не стояло - все равно отображаются три вопросительных знака "???".
Пойду дальше экспериментировать)
1. чтобы sprintf правильно выводил float, надо обязательно задать эту фичу в настройках проекта. по умолчанию sprintf не поддерживает float с целью экономии памяти. думаю, вы будете неприятно удивлены размером программы после включения поддержки форматированного вывода чисел с плавающей точкой...
2. по поводу целых - изучите документацию на libc для своего компилятора - возможно, надо не %i указывать, а, например, %d или что-то подобное.
битва с дураками проиграна, победители торжествуют. слава победителям!
Vlad0o
Открыл глаза
Сообщения: 67
Зарегистрирован: Вт июл 19, 2011 19:09:46

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

Сообщение Vlad0o »

Про размер программы я пока не задумывался. Спасибо что предупредили о коварстве float в sprintf. Теперь придется думать об оптимизации. но это чуть позже. мне пока датчик значение температуры не отдает. сопротивляется гад)
Аватара пользователя
slavokhire5
Прорезались зубы
Сообщения: 202
Зарегистрирован: Пн сен 26, 2011 13:48:25
Откуда: Харьков

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

Сообщение slavokhire5 »

Добрый день:) понадобилась программная реализация антидребезга для датчика. используется МК АВР. решил изобрести велосипед.

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

       ...............                
   DDRB          = 0b00000010;               
   PORTB          = 0b00001100;
   ..............
   sei();
   while(1){
                ...............
      d = PINB;
      if(d == 0X01)
      {
         _delay_us(300);
         PORTB |= 0x02;
         _delay_us(100);
         PORTB &= ~0x02;
                 }
           ...........
           }     


смысл работы: читаем данные на ножке В0, если там "1", делаем задержку в 0.3мс, на 0.1мс дергаем В1. естественно, не работает:) подскажите пожалуйста, что не так? или как это по-другому организовать?
Осилит дорогу идущий
--------------------------
Пишу на Си за еду
Rusja2008
Открыл глаза
Сообщения: 68
Зарегистрирован: Пн окт 06, 2008 15:51:58
Откуда: Черкассы

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

Сообщение Rusja2008 »

А Вы и у себя в коде написали _delay_us(...)?
Не умееш - не берись, но не взявшись не научишся.
Аватара пользователя
slavokhire5
Прорезались зубы
Сообщения: 202
Зарегистрирован: Пн сен 26, 2011 13:48:25
Откуда: Харьков

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

Сообщение slavokhire5 »

да. это задержка в winavr. по-идее ее рассчитывает компилятор. _delay_us(xx) - задержка в хх микросекунд, _delay_ms(xx) - задержка в хх миллисекунд.
Осилит дорогу идущий
--------------------------
Пишу на Си за еду
Rusja2008
Открыл глаза
Сообщения: 68
Зарегистрирован: Пн окт 06, 2008 15:51:58
Откуда: Черкассы

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

Сообщение Rusja2008 »

В основной цикл я бы вкинул хоть небольшую задержку, ну состояние PB0 по другому проверял if(PINB&1) { } else _delay_us(...) и перепроверьте ошибки на уровне железа.
Не умееш - не берись, но не взявшись не научишся.
Аватара пользователя
bevice
Открыл глаза
Сообщения: 54
Зарегистрирован: Сб июн 06, 2009 11:13:56
Контактная информация:

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

Сообщение bevice »

slavokhire5 писал(а):смысл работы: читаем данные на ножке В0, если там "1", делаем задержку в 0.3мс, на 0.1мс дергаем В1. естественно, не работает:)
подскажите пожалуйста, что не так? или как это по-другому организовать?

PINB у вас никогда не будет ==0x01 потому как выше по тексту:
PORTB = 0b00001100;
После нас - хоть потоп (с) Лойсо
Rusja2008
Открыл глаза
Сообщения: 68
Зарегистрирован: Пн окт 06, 2008 15:51:58
Откуда: Черкассы

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

Сообщение Rusja2008 »

Не путайте человека. PINB0 и PINB1 сконфигурированы как входы и со слов автора на PB0 пин приходит сигнал с некоего датчика.
Не умееш - не берись, но не взявшись не научишся.
Аватара пользователя
bevice
Открыл глаза
Сообщения: 54
Зарегистрирован: Сб июн 06, 2009 11:13:56
Контактная информация:

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

Сообщение bevice »

Rusja2008 писал(а):Не путайте человека. PINB0 и PINB1 сконфигурированы как входы и со слов автора на PB0 пин приходит сигнал с некоего датчика.

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

   
  DDRB           = 0b00000010;               
  PORTB          = 0b00001100;

входы все, кроме первой ноги
на 2й и 3й ноге включен pull-up, и если их никто к земле не давит PINB никак не будет меньше 0x1100
ноги с 4й по 7ю болтаются (если никуда не подключены ессно) в Hi-Z, ловя любые наводки и сея хаос в старшие 4 бита,
так что угадать значение PINB задачка та еще.

Выше по тексту очень правильно советовали проверять наличие 1 на ноге с помощью битовой маски (PINB & 0x01)
После нас - хоть потоп (с) Лойсо
Rusja2008
Открыл глаза
Сообщения: 68
Зарегистрирован: Пн окт 06, 2008 15:51:58
Откуда: Черкассы

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

Сообщение Rusja2008 »

Ну PINB1 и правда выход, пардон недоглядел.
Не умееш - не берись, но не взявшись не научишся.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

bevice писал(а):на 2й и 3й ноге включен pull-up, и если их никто к земле не давит PINB никак не будет меньше 0x1100

это еще как сказать. лично у меня с мегой8 этот пулл ап ничего хорошего не сделал.пока не поставил нормальные резисторы не работало.
bevice писал(а):Выше по тексту очень правильно советовали проверять наличие 1 на ноге с помощью битовой маски (PINB & 0x01)

согласен с этим
slavokhire5 писал(а):

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

if(d == 0X01)
      {
         _delay_us(300);
         PORTB |= 0x02;
         _delay_us(100);
         PORTB &= ~0x02;
                 }
           ...........
           }     

не совсем понятен смысл сего алгоритма: получается паузу сделали и неважно нажата ли в этот момент времени кнопка все равно меняем состояние ноги?
В поисках истины человек развивается.
Аватара пользователя
bevice
Открыл глаза
Сообщения: 54
Зарегистрирован: Сб июн 06, 2009 11:13:56
Контактная информация:

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

Сообщение bevice »

vitalik_1984 писал(а):это еще как сказать. лично у меня с мегой8 этот пулл ап ничего хорошего не сделал.пока не поставил нормальные резисторы не работало.

На заре осваивания AVR наткнулся на меги (ATMEGA8-16PU) с включенным по-умолчанию PUD в SFIOR, как следствие подтяжка не работала. С тех пор всегда сбрасываю PUD
После нас - хоть потоп (с) Лойсо
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

bevice писал(а):
vitalik_1984 писал(а):это еще как сказать. лично у меня с мегой8 этот пулл ап ничего хорошего не сделал.пока не поставил нормальные резисторы не работало.

На заре осваивания AVR наткнулся на меги (ATMEGA8-16PU) с включенным по-умолчанию PUD в SFIOR, как следствие подтяжка не работала. С тех пор всегда сбрасываю PUD

а как сбрасывается? программно?Или можно на раз прописать?
В поисках истины человек развивается.
Аватара пользователя
bevice
Открыл глаза
Сообщения: 54
Зарегистрирован: Сб июн 06, 2009 11:13:56
Контактная информация:

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

Сообщение bevice »

vitalik_1984 писал(а):
bevice писал(а):С тех пор всегда сбрасываю PUD

а как сбрасывается? программно?Или можно на раз прописать?

как и все остальное SFIOR &=~(1<<PUD)
После нас - хоть потоп (с) Лойсо
Аватара пользователя
slavokhire5
Прорезались зубы
Сообщения: 202
Зарегистрирован: Пн сен 26, 2011 13:48:25
Откуда: Харьков

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

Сообщение slavokhire5 »

у меня контроллер tiny24a. там порт В обрезан. только первые 4 лапы присутствуют. антидребезг оформил так:

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

   if((c=PINB&1)==0)    // датчик при появлении сигнала выдает "0"
   {
   _delay_us(200);
   PORTB |= 0x02;
   _delay_us(20);
   PORTB &= ~0x02;
   }

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

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

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

slavokhire5 писал(а):у меня контроллер tiny24a. там порт В обрезан. только первые 4 лапы присутствуют. антидребезг оформил так:

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

   if((c=PINB&1)==0)    // датчик при появлении сигнала выдает "0"
   {
   _delay_us(200);
   PORTB |= 0x02;
   _delay_us(20);
   PORTB &= ~0x02;
   }

в симуляторе работает нормально, в железяке еще не пробовал
было бы интересно разобраться, в каком именно месте этого кода вы боретесь с дребезгом :)))
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
slavokhire5
Прорезались зубы
Сообщения: 202
Зарегистрирован: Пн сен 26, 2011 13:48:25
Откуда: Харьков

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

Сообщение slavokhire5 »

Мастер Ломастер, на В0 принимаю импульсы, минимальное расчетное время между импульсами должно быть 3.3мс (с не хилым запасом), жду 200мкс, чтобы не словить дребезг, потом дергаю лапой В1. вывод В1 заведен на счетный вход таймера Т1. По сравнению происходит прерывание. обработчик вносит погрешность (некоторое время не считаются входные импульсы, т.к. антидребезг стоит внутри бесконечного цикла), но она не превышает 2,2% в худшем случае
Осилит дорогу идущий
--------------------------
Пишу на Си за еду
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

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

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

slavokhire5 писал(а):Мастер Ломастер, на В0 принимаю импульсы, минимальное расчетное время между импульсами должно быть 3.3мс (с не хилым запасом), жду 200мкс, чтобы не словить дребезг, потом дергаю лапой В1. вывод В1 заведен на счетный вход таймера Т1. По сравнению происходит прерывание. обработчик вносит погрешность (некоторое время не считаются входные импульсы, т.к. антидребезг стоит внутри бесконечного цикла), но она не превышает 2,2% в худшем случае
ок, все понятно :) если придет небольшая помешка на В0, вы ее словите, как нормальный сигнал, так? дребезг от механических контактов длится около 10 мс (иногда и более), при этом может быть сформировано до сотни импульсов!

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

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

Сообщение diim »

добрый день, друзья! не поможете мне разобраться с элементарным кодом с которым бьюсь уже второй день! а суть в том что: пытаюсь запрограммировать тини13 и для проверки написал сей код! но... при нажатии на кнопку которая висит на PORTB.4 не загорается светик который подключен к PORTB.2 :shock: что я накосячил непойму, а мож порт2 контроллера неисправен???

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

/*****************************************************
This program was produced by the
CodeWizardAVR V2.04.4a Advanced
Automatic Program Generator
© Copyright 1998-2009 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date    :
Author  :
Company :
Comments:


Chip type               : ATtiny13
AVR Core Clock frequency: 16,000000 MHz
Memory model            : Tiny
External RAM size       : 0
Data Stack size         : 16
*****************************************************/

#include <tiny13.h>
#include <delay.h>


// Read the 8 most significant bits
// of the AD conversion result
unsigned char read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCH;
}


// 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
}


// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B initialization
// Func5=Out Func4=Out Func3=In Func2=Out Func1=Out Func0=Out
// State5=0 State4=0 State3=T State2=0 State1=0 State0=0
PORTB=0x3B;
DDRB=0x04;
//PORTB=0x00;
//DDRB=0x37;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 250,000 kHz
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x03;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x02;

// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;


// ADC initialization
// ADC Clock frequency: 500,000 kHz
// ADC Bandgap Voltage Reference: Off
// ADC Auto Trigger Source: None
// Only the 8 most significant bits of
// the AD conversion result are used
// Digital input buffers on ADC0: Off, ADC1: Off, ADC2: Off, ADC3: On
DIDR0&=0x03;
DIDR0|=0x34;
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x85;

#asm("sei")

while (1)
      {
       PORTB.2=PINB.4;
      };
}

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

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

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

diim писал(а):(ADC_VREF_TYPE & 0xff)
это мощно! но бессмысленно.
diim писал(а):// Delay needed for the stabilization of the ADC input voltage
че, в самом деле?!
diim писал(а):{read_adc(3);a=0;};//считываем наряжение с  PINB.3 результат записываем в ADCH
неверно, напряжение считываем, результат теряем. бессмысленно. а в прерывании это делать вдвойне нехорошо.
diim писал(а):что я накосячил непойму
может быть, это:
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
ну и кроме того, если кнопка на общий, то нажатие кнопки должно приводить к погасанию светодиода
битва с дураками проиграна, победители торжествуют. слава победителям!
Ответить

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