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

Обсуждаем контроллеры компании Atmel.
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Сообщение clawham »

Ребятки! Если не сложно подскажите как проще для процессора сделать вот такую вещь -

хочу вставить код:
Изображение

а получается

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

            a2[0] = PWM_Chg[0]>>4;

            a2[1] = ((PWM_Chg[0]%16)<<4>>8);


            a2[2] = PWM_Chg[1];


тоесть у меня есть два инта PWM_Chg[0] и PWM_Chg[1]

в них будет храниться число от 0 до 4096 - то есть только 12 бит из 16

нужно сделать так чтоб :
1) в a2[0] были 8 бит старших от PWM_Chg[0]
2) в a2[1] были 4 бит младших от PWM_Chg[0] в старшей части байта и 4 байта старших от PWM_Chg[1] в младшей части
3) в a2[2] были оставшихся 8 бит младших от PWM_Chg[1]

чувствует моё сердце что как-то только операциями сдвига можно обойтись... просидел 2 часа так ничего не наколдовал...не понимаю я с детства эти битовые операции...
потому что мне этот кусочек слишком часто надо выполнять( под 4 килогерца) а кода очень много получается по листингу и ничего не успевается....

и плюс ещё один вопрос - этот компилятор для выполнения очистки таймера использует один лишний регистр:

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

TCNT1H=0x00;
   LDI  R30,LOW(0)
   OUT  0x2D,R30
TCNT1L=0x00;
   OUT  0x2C,R30


естественно если это прерывание то перед этим блоком он ещё и в стек кидает этот регистр R30 а потом его восстанавливает....
а как можно проще обнулить? ну типа есть же SBI и CBI для очистки и установки бита...
Вложения
Untitled-1.gif
Капец...форум чёта мне не даёт вставить нормально код - всё время кокай-то бред пишет а я хочу вставить это
(800 байт) 357 скачиваний
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Без исходника разбираться не в чем.
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Сообщение clawham »

А чем Вам поможет исходник?
мне просто интересно чем можно заменить функцию "остаток от деления на 16" вроде как сдвиг вправо на 4 бита и есть деление на 16...а как получить именно остаток?

аналогично и с счетчиком....есть же ассемблерная вставка @cli@ запрещающая прерывания....вот и интересуюсь может как-то можно сделать такую же вставку для записи нуля в регистр счета?

...и попробуйте набрать то что на картинке в сообщение неважно куда - чтото форум глючит на этой записи
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

clawham писал(а):А чем Вам поможет исходник?
мне просто интересно чем можно заменить функцию "остаток от деления на 16" вроде как сдвиг вправо на 4 бита и есть деление на 16...а как получить именно остаток?
ну вы даете! остаток от деления на 16 - это 4 младших бита :)

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

var &= 0x0F; // вот вам и остаток :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
ooogo
Это не хвост, это антенна
Сообщения: 1306
Зарегистрирован: Вс янв 18, 2009 20:51:02

Сообщение ooogo »

Уважаемые Коты, укажите пожалуйста ссылочку, где бы скачать исходник на с под cvavr, для работы с hd44780, что бы на любые ножки подключать без RW и в протеусе симуляция работала!? :? просидел 4 часа с my_lcd.c, вроде уже и в графе сигналы посмотрел все пучком работать должно, а симуляция не фурычит! :cry:
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Сообщение clawham »

Спасибо!!! и вправду гораздо легче стало!!!!!
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Georgiy
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Вс фев 22, 2009 21:50:24

Сообщение Georgiy »

Здравствуйте Всем! Подскажите как в cvavr увеличить время в програмном I2C т.е. задержки . или нужно писать своё? Если можно пример. Заранее блогадарен.
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Сообщение BCluster »

ого, а че стандартная либа из кодвижна не подходит??
Аватара пользователя
ooogo
Это не хвост, это антенна
Сообщения: 1306
Зарегистрирован: Вс янв 18, 2009 20:51:02

Сообщение ooogo »

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

ого, а че стандартная либа из кодвижна не подходит?? 

впринципе подходит, но у меня с разводкой плат туговато поэтому стараюсь использовать существующие проекты, с минимальной переделкой, переписывая прошивки под свои нужды, частенько используют соединение по 6 проводам, без сигнала rw и произвольно раскидывая по порту. В cvavr , как я понял, нельзя такие фишки делать со стандартной библиотекой!? :?
Аватара пользователя
boobonick
Встал на лапы
Сообщения: 123
Зарегистрирован: Сб ноя 18, 2006 17:14:15

Сообщение boobonick »

Здравствуйте,подскажите,пожалуйста, не получается вывести значение напряжения с АЦП на LCD, без этой структуры все замечательно выводится,но стоит ее вставить

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


static struct key {

char *text_menu;   
char  *sub_menu[5];
 
}TMenu[5]= {
{"Zvuk\0" ,{"Usil\0","4astota\0","Db\0"}},
{"Voda\0",{"Uroven vodi\0","Temperatura\0","Plothost\0"}}


};

как ничего не выводится, вот я думаю, это все как-то с распределением памяти завязано или с чем?
Вложения
11.c
(1.94 КБ) 246 скачиваний
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

использовать достаточно сложные функции в прерывании - это плохой стиль программирования. возможно, только из-за этого у вас проблемы. ну а потом надо смотреть, что там в листинге...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
boobonick
Встал на лапы
Сообщения: 123
Зарегистрирован: Сб ноя 18, 2006 17:14:15

Сообщение boobonick »

ARV писал(а):использовать достаточно сложные функции в прерывании - это плохой стиль программирования. возможно, только из-за этого у вас проблемы. ну а потом надо смотреть, что там в листинге...

Эти функции я переносил в бесконечный цикл, и результат тот же, я заметил, если я в режиме отладке проверяю все по строкам,то после функции sprintf() в отладчик больше не возвращается протеус, это значит то что он зависает в этой функции или нет :?

убираю из структуры вот это

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

= {
{"Zvuk\0" ,{"Usil\0","4astota\0","Db\0"}},
{"Voda\0",{"Uroven vodi\0","Temperatura\0","Plothost\0"}}


}

и работает
Аватара пользователя
Synergetik
Встал на лапы
Сообщения: 117
Зарегистрирован: Чт фев 28, 2008 23:54:35
Откуда: Воскресенск, МО
Контактная информация:

Сообщение Synergetik »

boobonick писал(а):убираю из структуры вот это

Похоже у Вас структура не совсем правильно написана - нельзя в char *text_menu запихнуть строку - для этого нужен массив char text_menu[20];
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Synergetik писал(а):...нельзя в char *text_menu запихнуть строку - для этого нужен массив char text_menu[20];
Почему нельзя - религия запрещает?

boobonick, не слушай его, он бредит.


P.S. И убери символы '\0' из строк - это делает компилятор. Сам.
Аватара пользователя
boobonick
Встал на лапы
Сообщения: 123
Зарегистрирован: Сб ноя 18, 2006 17:14:15

Сообщение boobonick »

Спасибо за советы! :)) Кажется я понял,загвоздка в

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

char  *sub_menu[5];
 

Делая вот так,все проходит

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

static struct key {

char *text_menu;   
char  *sub_menu;
 
}TMenu[5]={

{"Battery" ,"SubMenu"},
{"Playlist" ,"AAaaa" }

};

но количество подменю теряется, начинаю уже думать о структуре в структуре, как-то так :tea:
Mr.Denis
Прорезались зубы
Сообщения: 220
Зарегистрирован: Пт авг 07, 2009 22:06:49
Откуда: Россия, Москва

Сообщение Mr.Denis »

Помогите пожалуйста, а то я что-то туплю!
Мне нужно сделать моргание светодиода по не обычной схеме(подключения).
Смысл в том что анод светодиода должен быть на PORTD.3, а катод должен располагаться на PORTD.4. Подскажите как правильно настроить порты ввода вывода, и какие уровни подавать на эти ноги!
МК: atmega8
С уважением, Денис!
Аватара пользователя
ooogo
Это не хвост, это антенна
Сообщения: 1306
Зарегистрирован: Вс янв 18, 2009 20:51:02

Сообщение ooogo »

Смысл в том что анод светодиода должен быть на PORTD.3, а катод должен располагаться на PORTD.4
могу ошибаться, но помоему, так будет работать: оба порта на выход, светодиод будет гореть когда PORTD.3=1 PORTD.4=0; во всех остальных случаях он не будет гореть.
Mr.Denis
Прорезались зубы
Сообщения: 220
Зарегистрирован: Пт авг 07, 2009 22:06:49
Откуда: Россия, Москва

Сообщение Mr.Denis »

ooogo писал(а): могу ошибаться, но помоему, так будет работать: оба порта на выход, светодиод будет гореть когда PORTD.3=1 PORTD.4=0; во всех остальных случаях он не будет гореть.


Вот при таком коде он просто горит, и не хочет мигать.

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

#include <mega8> 
#include <delay>
void main(void)
{
DDRD=0b00011111;
PORTD=0b00000000;
PORTD.4=0;
while(1){
PORTD.3=1;
delay_ms(50);
PORTD.3=0;
}
}
Аватара пользователя
ooogo
Это не хвост, это антенна
Сообщения: 1306
Зарегистрирован: Вс янв 18, 2009 20:51:02

Сообщение ooogo »

Я бы для начала, увеличил задержку, хотя бы до 500 мс! :)
а потом, после строчки
PORTD.3=0;

поставил бы еще одну задержку на 500 мс.
Mr.Denis
Прорезались зубы
Сообщения: 220
Зарегистрирован: Пт авг 07, 2009 22:06:49
Откуда: Россия, Москва

Сообщение Mr.Denis »

Точно! Всё заработало, спасибо!
Ответить

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