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

Обсуждаем контроллеры компании Atmel.
Ответить
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

vitalik_1984 писал(а):Ну даже если из байта сдвигом вытягивать 24 бита все равно должно получиться.
Интересно, это как ? Что должно получится, вытянуться 24 бита ? :)
То, что выведется всего один байт (кстати, остальные не обязательно будут нули), всё равно это неправильно. Я лишь указал человеку на грубую ошибку, естественно не решающую его проблему с выводом белеберды.
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение 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])); 
Вложения
_shift.rar
(15.93 КБ) 147 скачиваний
Контактная информация:
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

Ну попробуйте что получится если сдвинуть байт на 24
Виталий, Вы мне предлагаете заняться глупостью. :) Зачем мне это нужно ? Любой результат этого опыта мне, в дальнейшем, не понадобиться. Нули там будут или единички - мне "до лампочки" :)
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

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

Однозначно какая то неправильная последовательность, попробовал в протеусе бегает, даже если восемь бит вытаскивать.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Сообщение a_skr »

да хоть миллион раз сдвигать usigned char - после 8 сдвигов будут нули. вывод на 74595 не работает?
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

vitalik_1984 писал(а):Чтобы потом не задавать таких вопросов :)))
Мой вопрос не касался остальных 16-ти бит, мне пофиг что там выведется, ещё раз говорю. Вопрос был касательно фразы "должно получиться". Отвечаю - нихрена не должно получиться, т.к. из байта не вдвинешь 24 бита, на что я и указал вопрошающему. Это грубая ошибка в программе и, повторюсь, не касающаяся его проблем с абракадаброй. Я же не говорил, что не работает из-за этого. Для решения проблемы нужен весь код и схема.
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение 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)// так выводится все число      

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

Черновик схемы прилагается
Вложения
74hc595.rar
(38.13 КБ) 148 скачиваний
Контактная информация:
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

Сообщение Сериг »

Спасибо за проведенную дискуссию! :)))
Попробую сегодня доразобраться :))
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

Сообщение eduardo »

Здравствуйте. У меня такая беда,весь мозг вынес.
Написал пограмму термометра в CV AVR(в программировании далеко не мастер).
Термометр на 2х датчикахDS18B20,2х индикаторах 7сегм. Контроллер мега 16. Т.е. температура считывается и
выводится с каждого датчика на свой индикатор. Считываться-то считывается,но при этом
переключение катодов какое-то заторможенное.Как-будто прога слишком часто опрашивает шину.
Подскажите,кто может,как всё исправить???
Или подобное вообще нереально сделать???
Файлы прилагаются. Спасибо.
Вложения
термометр.rar
(98.85 КБ) 137 скачиваний
Последний раз редактировалось eduardo Пн сен 30, 2013 18:16:38, всего редактировалось 2 раза.
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

Потому, что ds18b20_temperature вешает программу до окончания преобразования. Как исправить, думаю, теперь догадаетесь. Впрочем, вопрос уже множество раз обсуждался на форуме, в том числе в теме по ds1820.
Контактная информация:
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

Сообщение eduardo »

Т.е. это нужно время преобразования увеличить... Или уменьшить? Я правильно понял? Только вот я не знаю как...
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Преобразовывает датчик, и его время вы никак не увеличите и не уменьшите (точнее можете, с потерей точности, 18B20 конфигурируется), но вот пока он закончит - ждать совсем необязательно, можно заниматься своими делами.
Встал на лапы
Сообщения: 114
Зарегистрирован: Чт ноя 24, 2011 12:39:13

Сообщение 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
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение 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;
	}
Docendo discimus
Контактная информация:
Встал на лапы
Сообщения: 114
Зарегистрирован: Чт ноя 24, 2011 12:39:13

Сообщение Marchello »

Спасибо Дружище, буду пробовать, а то вчера мозг себе вынес экспериментами! Как приятно все таки с вами котами работать и осваивать новые навыки!
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

Сообщение eduardo »

Аlex писал(а):Потому, что ds18b20_temperature вешает программу до окончания преобразования. Как исправить, думаю, теперь догадаетесь. Впрочем, вопрос уже множество раз обсуждался на форуме, в том числе в теме по ds1820.
Честно говоря,даже не представляю. Я попробовал сделать так,чтобы запрет на прерывания выдавался между переключениями разрядов.
Переключение разрядов стало нормальным,без тормозов,но выводится ерунда какая-то. Датчики как-то коряво читаются.(Если они вообще читаются...)
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение 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; 
                    } 
          }
} 
Последний раз редактировалось vitalik_1984 Пт окт 04, 2013 16:15:00, всего редактировалось 1 раз.
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

eduardo писал(а):Честно говоря,даже не представляю.
Всё просто - изучаете 1-Wire, потом читаете даташит на датчик, выкидываете из головы все библиотечные функции и пишете свои, которые будут работать так, как Вам нужно.
Контактная информация:
Родился
Сообщения: 5
Зарегистрирован: Пн окт 07, 2013 09:20:53

Сообщение Greymand »

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

Так вот,как сделать чтобы цифра мигала с периодом 0,5-1 сек?
Встал на лапы
Сообщения: 114
Зарегистрирован: Чт ноя 24, 2011 12:39:13

Сообщение Marchello »

И у меня похожий вопрос! Вывожу на LCD значение текущего времени, как сделать так чтобы при корректировке времени мигал курсор (точнее подчеркивалось бы время)?
Ответить

Вернуться в «AVR»