Страница 47 из 386
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср окт 26, 2011 11:32:05
Мастер Ломастер
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 или что-то подобное.
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср окт 26, 2011 14:27:14
Vlad0o
Про размер программы я пока не задумывался. Спасибо что предупредили о коварстве float в sprintf. Теперь придется думать об оптимизации. но это чуть позже. мне пока датчик значение температуры не отдает. сопротивляется гад)
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср окт 26, 2011 14:33:02
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. естественно, не работает:) подскажите пожалуйста, что не так? или как это по-другому организовать?
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср окт 26, 2011 14:46:00
Rusja2008
А Вы и у себя в коде написали _delay_us(...)?
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср окт 26, 2011 14:48:39
slavokhire5
да. это задержка в winavr. по-идее ее рассчитывает компилятор. _delay_us(xx) - задержка в хх микросекунд, _delay_ms(xx) - задержка в хх миллисекунд.
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср окт 26, 2011 15:06:47
Rusja2008
В основной цикл я бы вкинул хоть небольшую задержку, ну состояние PB0 по другому проверял if(PINB&1) { } else _delay_us(...) и перепроверьте ошибки на уровне железа.
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср окт 26, 2011 20:05:06
bevice
slavokhire5 писал(а):
смысл работы: читаем данные на ножке В0, если там "1", делаем задержку в 0.3мс, на 0.1мс дергаем В1. естественно, не работает:)
подскажите пожалуйста, что не так? или как это по-другому организовать?
PINB у вас никогда не будет ==0x01 потому как выше по тексту:
PORTB = 0b00001100;
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср окт 26, 2011 20:47:34
Rusja2008
Не путайте человека. PINB0 и PINB1 сконфигурированы как входы и со слов автора на PB0 пин приходит сигнал с некоего датчика.
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср окт 26, 2011 21:13:26
bevice
Rusja2008 писал(а):Не путайте человека. PINB0 и PINB1 сконфигурированы как входы и со слов автора на PB0 пин приходит сигнал с некоего датчика.
входы все, кроме первой ноги
на 2й и 3й ноге включен pull-up, и если их никто к земле не давит PINB никак не будет меньше 0x1100
ноги с 4й по 7ю болтаются (если никуда не подключены ессно) в Hi-Z, ловя любые наводки и сея хаос в старшие 4 бита,
так что угадать значение PINB задачка та еще.
Выше по тексту очень правильно советовали проверять наличие 1 на ноге с помощью битовой маски (PINB & 0x01)
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср окт 26, 2011 21:43:45
Rusja2008
Ну PINB1 и правда выход, пардон недоглядел.
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср окт 26, 2011 22:10:00
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;
}
...........
}
не совсем понятен смысл сего алгоритма: получается паузу сделали и неважно нажата ли в этот момент времени кнопка все равно меняем состояние ноги?
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср окт 26, 2011 22:53:47
bevice
vitalik_1984 писал(а):
это еще как сказать. лично у меня с мегой8 этот пулл ап ничего хорошего не сделал.пока не поставил нормальные резисторы не работало.
На заре осваивания AVR наткнулся на меги (ATMEGA8-16PU) с включенным по-умолчанию PUD в SFIOR, как следствие подтяжка не работала. С тех пор всегда сбрасываю PUD
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср окт 26, 2011 23:23:18
vitalik_1984
bevice писал(а):vitalik_1984 писал(а):
это еще как сказать. лично у меня с мегой8 этот пулл ап ничего хорошего не сделал.пока не поставил нормальные резисторы не работало.
На заре осваивания AVR наткнулся на меги (ATMEGA8-16PU) с включенным по-умолчанию PUD в SFIOR, как следствие подтяжка не работала. С тех пор всегда сбрасываю PUD
а как сбрасывается? программно?Или можно на раз прописать?
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср окт 26, 2011 23:36:22
bevice
vitalik_1984 писал(а):bevice писал(а):С тех пор всегда сбрасываю PUD
а как сбрасывается? программно?Или можно на раз прописать?
как и все остальное SFIOR &=~(1<<PUD)
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт окт 27, 2011 10:23:18
slavokhire5
у меня контроллер tiny24a. там порт В обрезан. только первые 4 лапы присутствуют. антидребезг оформил так:
Код: Выделить всё
if((c=PINB&1)==0) // датчик при появлении сигнала выдает "0"
{
_delay_us(200);
PORTB |= 0x02;
_delay_us(20);
PORTB &= ~0x02;
}
в симуляторе работает нормально, в железяке еще не пробовал
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт окт 27, 2011 11:05:47
Мастер Ломастер
slavokhire5 писал(а):у меня контроллер tiny24a. там порт В обрезан. только первые 4 лапы присутствуют. антидребезг оформил так:
Код: Выделить всё
if((c=PINB&1)==0) // датчик при появлении сигнала выдает "0"
{
_delay_us(200);
PORTB |= 0x02;
_delay_us(20);
PORTB &= ~0x02;
}
в симуляторе работает нормально, в железяке еще не пробовал
было бы интересно разобраться, в каком именно месте этого кода вы боретесь с дребезгом

Re: Вопросы по С/С++ (СИ)
Добавлено: Чт окт 27, 2011 11:14:51
slavokhire5
Мастер Ломастер, на В0 принимаю импульсы, минимальное расчетное время между импульсами должно быть 3.3мс (с не хилым запасом), жду 200мкс, чтобы не словить дребезг, потом дергаю лапой В1. вывод В1 заведен на счетный вход таймера Т1. По сравнению происходит прерывание. обработчик вносит погрешность (некоторое время не считаются входные импульсы, т.к. антидребезг стоит внутри бесконечного цикла), но она не превышает 2,2% в худшем случае
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт окт 27, 2011 11:36:42
Мастер Ломастер
slavokhire5 писал(а):Мастер Ломастер, на В0 принимаю импульсы, минимальное расчетное время между импульсами должно быть 3.3мс (с не хилым запасом), жду 200мкс, чтобы не словить дребезг, потом дергаю лапой В1. вывод В1 заведен на счетный вход таймера Т1. По сравнению происходит прерывание. обработчик вносит погрешность (некоторое время не считаются входные импульсы, т.к. антидребезг стоит внутри бесконечного цикла), но она не превышает 2,2% в худшем случае
ок, все понятно

если придет небольшая помешка на В0, вы ее словите, как нормальный сигнал, так? дребезг от механических контактов длится около 10 мс (иногда и более), при этом может быть сформировано до сотни импульсов!
да, вот еще что... открою страшную правду: если вы симулируете в протеусе или чем-то подобном, то смею вас уведомить: дребезга контактов они не создают вообще!
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт окт 27, 2011 13:40:47
diim
добрый день, друзья! не поможете мне разобраться с элементарным кодом с которым бьюсь уже второй день! а суть в том что: пытаюсь запрограммировать тини13 и для проверки написал сей код! но... при нажатии на кнопку которая висит на PORTB.4 не загорается светик который подключен к PORTB.2

что я накосячил непойму, а мож порт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;
};
}
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт окт 27, 2011 14:07:54
Мастер Ломастер
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
ну и кроме того, если кнопка на общий, то нажатие кнопки должно приводить к погасанию светодиода