Страница 277 из 421

Re: CodeVision AVR в вопросах и ответах

Добавлено: Ср сен 25, 2013 20:08:23
Аlex
vitalik_1984 писал(а):Ну даже если из байта сдвигом вытягивать 24 бита все равно должно получиться.
Интересно, это как ? Что должно получится, вытянуться 24 бита ? :)
То, что выведется всего один байт (кстати, остальные не обязательно будут нули), всё равно это неправильно. Я лишь указал человеку на грубую ошибку, естественно не решающую его проблему с выводом белеберды.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Ср сен 25, 2013 20:47:42
vitalik_1984
Ну попробуйте что получится если сдвинуть байт на 24. тупо ноли одни и будут. Насколько я знаю такое описание операции сдвига.

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

/*******************************************

Подпрограмма подачи CLK 

********************************************/
void f_Clk(void) {
    PORT_OUT|=_BV(Clk_pin);
    PORT_OUT&=~_BV(Clk_pin);
}
/*******************************************

Подпрограмма подачи STROBE 

********************************************/
void f_strobe(void) {
    PORT_OUT|=_BV(Strobe_pin);
    PORT_OUT&=~_BV(Strobe_pin);
}
/*******************************************

Программа ввода в регистр нового значения

********************************************/
void f_shift_reg(unsigned char gear) {
    for (char i=0;i<=7;i++){
    (gear&0x01)? PORT_OUT|=_BV(D_pin): PORT_OUT&=~_BV(D_pin);
        f_Clk();
        gear>>=1;
    };//for
    f_strobe();
}//f_shift_reg   
Вот работающий пример для вывода байта
При выводе последовательно трех байт получится то, что нужно :)

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

for (n=0;n<3;n++){
f_shift_reg(gears[n])); 

Re: CodeVision AVR в вопросах и ответах

Добавлено: Ср сен 25, 2013 20:59:34
Аlex
Ну попробуйте что получится если сдвинуть байт на 24
Виталий, Вы мне предлагаете заняться глупостью. :) Зачем мне это нужно ? Любой результат этого опыта мне, в дальнейшем, не понадобиться. Нули там будут или единички - мне "до лампочки" :)

Re: CodeVision AVR в вопросах и ответах

Добавлено: Ср сен 25, 2013 21:14:59
vitalik_1984
Аlex писал(а):Виталий, Вы мне предлагаете заняться глупостью. Зачем мне это нужно ?
Чтобы потом не задавать таких вопросов :)))
Аlex писал(а):Интересно, это как ? Что должно получится, вытянуться 24 бита ?
24 бита не вытянется, будет один байт, а в случае когда результат выводится на регистры через ((data>>i)&1) будет байт и 16 нулей

Однозначно какая то неправильная последовательность, попробовал в протеусе бегает, даже если восемь бит вытаскивать.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Ср сен 25, 2013 21:16:47
a_skr
да хоть миллион раз сдвигать usigned char - после 8 сдвигов будут нули. вывод на 74595 не работает?

Re: CodeVision AVR в вопросах и ответах

Добавлено: Ср сен 25, 2013 21:40:06
Аlex
vitalik_1984 писал(а):Чтобы потом не задавать таких вопросов :)))
Мой вопрос не касался остальных 16-ти бит, мне пофиг что там выведется, ещё раз говорю. Вопрос был касательно фразы "должно получиться". Отвечаю - нихрена не должно получиться, т.к. из байта не вдвинешь 24 бита, на что я и указал вопрошающему. Это грубая ошибка в программе и, повторюсь, не касающаяся его проблем с абракадаброй. Я же не говорил, что не работает из-за этого. Для решения проблемы нужен весь код и схема.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Ср сен 25, 2013 22:08:28
vitalik_1984
Я вкурил в чем проблема :) просто нужно строб то не поднимать в начале цикла :))

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

void send_byte_74595 (unsigned char data){ 
unsigned char i;
 for (i = 0; i <24; i++) {  
      if ( (temp=data>>i)&1)  MOSI = 1; 
      else              MOSI = 0; 
        #asm("nop")
        SCK = 1;
        #asm("nop")
        SCK = 0;
        #asm("nop")
         }  
         ss = 1;
         ss = 0;             
} 
И получается как раз только один байт в последнем регистре. Остальное обрезается типом.

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

void send_byte_74595 (unsigned long int data)// так выводится все число      

По мне так лучше побайтно выводить из массива.

Черновик схемы прилагается

Re: CodeVision AVR в вопросах и ответах

Добавлено: Чт сен 26, 2013 18:29:57
Сериг
Спасибо за проведенную дискуссию! :)))
Попробую сегодня доразобраться :))

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вс сен 29, 2013 19:04:33
eduardo
Здравствуйте. У меня такая беда,весь мозг вынес.
Написал пограмму термометра в CV AVR(в программировании далеко не мастер).
Термометр на 2х датчикахDS18B20,2х индикаторах 7сегм. Контроллер мега 16. Т.е. температура считывается и
выводится с каждого датчика на свой индикатор. Считываться-то считывается,но при этом
переключение катодов какое-то заторможенное.Как-будто прога слишком часто опрашивает шину.
Подскажите,кто может,как всё исправить???
Или подобное вообще нереально сделать???
Файлы прилагаются. Спасибо.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вс сен 29, 2013 19:09:12
Аlex
Потому, что ds18b20_temperature вешает программу до окончания преобразования. Как исправить, думаю, теперь догадаетесь. Впрочем, вопрос уже множество раз обсуждался на форуме, в том числе в теме по ds1820.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Пн сен 30, 2013 18:13:23
eduardo
Т.е. это нужно время преобразования увеличить... Или уменьшить? Я правильно понял? Только вот я не знаю как...

Re: CodeVision AVR в вопросах и ответах

Добавлено: Пн сен 30, 2013 18:42:54
ploop
Преобразовывает датчик, и его время вы никак не увеличите и не уменьшите (точнее можете, с потерей точности, 18B20 конфигурируется), но вот пока он закончит - ждать совсем необязательно, можно заниматься своими делами.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Ср окт 02, 2013 13:26:39
Marchello
Уважаемые коты, подскажите как вот эти проверки
if (PINA.1==0)
{
delay_ms(50);
N=1;
}

if (PINA.2==0)
{
delay_ms(50);
N=2;
}

if (PINA.3==0)
{
delay_ms(50);
M=1;
}

загнать в switch? Т.е. как задать параметры switch чтобы по нажатию той или иной кнопки срабатывал определенный case

Re: CodeVision AVR в вопросах и ответах

Добавлено: Ср окт 02, 2013 13:41:57
pyzhman

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

switch(~PINA & 0x0E)
	{
	case 0x02:
		delay_ms(50); 
		N= 1;
		break;
	case 0x04:
		delay_ms(50);
		N= 2;
		break;
	case 0x08:
		delay_ms(50);
		M= 1;
		break;
	}

Re: CodeVision AVR в вопросах и ответах

Добавлено: Ср окт 02, 2013 13:54:29
Marchello
Спасибо Дружище, буду пробовать, а то вчера мозг себе вынес экспериментами! Как приятно все таки с вами котами работать и осваивать новые навыки!

Re: CodeVision AVR в вопросах и ответах

Добавлено: Чт окт 03, 2013 21:30:42
eduardo
Аlex писал(а):Потому, что ds18b20_temperature вешает программу до окончания преобразования. Как исправить, думаю, теперь догадаетесь. Впрочем, вопрос уже множество раз обсуждался на форуме, в том числе в теме по ds1820.
Честно говоря,даже не представляю. Я попробовал сделать так,чтобы запрет на прерывания выдавался между переключениями разрядов.
Переключение разрядов стало нормальным,без тормозов,но выводится ерунда какая-то. Датчики как-то коряво читаются.(Если они вообще читаются...)

Re: CodeVision AVR в вопросах и ответах

Добавлено: Чт окт 03, 2013 21:45:04
vitalik_1984
 
Спасибо Дружище, буду пробовать, а то вчера мозг себе вынес экспериментами
Вообще это называется опрос кнопок и есть специальная тема для этого.
Можно еще так. простая функция антидребезг
Спойлер

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

 
temp= (~PINA & 0x0E);
if (temp){
     delay_ms(50); 
     if (temp== (~PINA & 0x0E)
        {
               switch(temp)
                   {
                       case 0x02:
                              N= 1;break;
                       case 0x04:
                              N= 2;break;
                       case 0x08:
                              M= 1;break; 
                    } 
          }
} 

Re: CodeVision AVR в вопросах и ответах

Добавлено: Чт окт 03, 2013 23:40:34
Аlex
eduardo писал(а):Честно говоря,даже не представляю.
Всё просто - изучаете 1-Wire, потом читаете даташит на датчик, выкидываете из головы все библиотечные функции и пишете свои, которые будут работать так, как Вам нужно.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Пн окт 07, 2013 10:31:01
Greymand
Здравствуйте уважаемые!
Сильно не пинайте,новичек я.
Есть,вообщем,динамическая индикация.Три разряда и точка.
Кода под рукой нет,но вообщем,логика такая:
Прерывание таймера;
Гасим все;
i++;
swith(i)
case 1: включаем первый индикатор;выводим циферку1;
case 2: включаем второй;выводим циферку2;
case 3: включаем третий,выводим циферку3;i=0;зажигаем точку;

Так вот,как сделать чтобы цифра мигала с периодом 0,5-1 сек?

Re: CodeVision AVR в вопросах и ответах

Добавлено: Пн окт 07, 2013 13:32:59
Marchello
И у меня похожий вопрос! Вывожу на LCD значение текущего времени, как сделать так чтобы при корректировке времени мигал курсор (точнее подчеркивалось бы время)?