Страница 54 из 421
Добавлено: Пн окт 12, 2009 16:38:05
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 для очистки и установки бита...
Добавлено: Пн окт 12, 2009 18:39:21
Yellow Tiger
Без исходника разбираться не в чем.
Добавлено: Пн окт 12, 2009 19:08:24
clawham
А чем Вам поможет исходник?
мне просто интересно чем можно заменить функцию "остаток от деления на 16" вроде как сдвиг вправо на 4 бита и есть деление на 16...а как получить именно остаток?
аналогично и с счетчиком....есть же ассемблерная вставка @cli@ запрещающая прерывания....вот и интересуюсь может как-то можно сделать такую же вставку для записи нуля в регистр счета?
...и попробуйте набрать то что на картинке в сообщение неважно куда - чтото форум глючит на этой записи
Добавлено: Пн окт 12, 2009 19:21:06
ARV
clawham писал(а):А чем Вам поможет исходник?
мне просто интересно чем можно заменить функцию "остаток от деления на 16" вроде как сдвиг вправо на 4 бита и есть деление на 16...а как получить именно остаток?
ну вы даете! остаток от деления на 16 - это 4 младших бита
Добавлено: Пн окт 12, 2009 22:22:28
ooogo
Уважаемые Коты, укажите пожалуйста ссылочку, где бы скачать исходник на с под cvavr, для работы с hd44780, что бы на любые ножки подключать без RW и в протеусе симуляция работала!?

просидел 4 часа с my_lcd.c, вроде уже и в графе сигналы посмотрел все пучком работать должно, а симуляция не фурычит!

Добавлено: Пн окт 12, 2009 23:01:40
clawham
Спасибо!!! и вправду гораздо легче стало!!!!!
Добавлено: Сб окт 17, 2009 12:20:06
Georgiy
Здравствуйте Всем! Подскажите как в cvavr увеличить время в програмном I2C т.е. задержки . или нужно писать своё? Если можно пример. Заранее блогадарен.
Добавлено: Ср окт 21, 2009 06:39:09
BCluster
ого, а че стандартная либа из кодвижна не подходит??
Добавлено: Ср окт 21, 2009 19:51:38
ooogo
Код: Выделить всё
ого, а че стандартная либа из кодвижна не подходит??
впринципе подходит, но у меня с разводкой плат туговато поэтому стараюсь использовать существующие проекты, с минимальной переделкой, переписывая прошивки под свои нужды, частенько используют соединение по 6 проводам, без сигнала rw и произвольно раскидывая по порту. В cvavr , как я понял, нельзя такие фишки делать со стандартной библиотекой!?

Добавлено: Пт окт 23, 2009 11:25:58
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"}}
};
как ничего не выводится, вот я думаю, это все как-то с распределением памяти завязано или с чем?
Добавлено: Пт окт 23, 2009 12:22:10
ARV
использовать достаточно сложные функции в прерывании - это плохой стиль программирования. возможно, только из-за этого у вас проблемы. ну а потом надо смотреть, что там в листинге...
Добавлено: Пт окт 23, 2009 12:26:24
boobonick
ARV писал(а):использовать достаточно сложные функции в прерывании - это плохой стиль программирования. возможно, только из-за этого у вас проблемы. ну а потом надо смотреть, что там в листинге...
Эти функции я переносил в бесконечный цикл, и результат тот же, я заметил, если я в режиме отладке проверяю все по строкам,то после функции sprintf() в отладчик больше не возвращается протеус, это значит то что он зависает в этой функции или нет
убираю из структуры вот это
Код: Выделить всё
= {
{"Zvuk\0" ,{"Usil\0","4astota\0","Db\0"}},
{"Voda\0",{"Uroven vodi\0","Temperatura\0","Plothost\0"}}
}
и работает
Добавлено: Пт окт 23, 2009 23:54:46
Synergetik
boobonick писал(а):убираю из структуры вот это
Похоже у Вас структура не совсем правильно написана - нельзя в char *text_menu запихнуть строку - для этого нужен массив char text_menu[20];
Добавлено: Сб окт 24, 2009 00:15:09
Yellow Tiger
Synergetik писал(а):...нельзя в char *text_menu запихнуть строку - для этого нужен массив char text_menu[20];
Почему нельзя - религия запрещает?
boobonick, не слушай его, он бредит.
P.S. И убери символы '\0' из строк - это делает компилятор. Сам.
Добавлено: Сб окт 24, 2009 01:00:17
boobonick
Спасибо за советы!

Кажется я понял,загвоздка в
Делая вот так,все проходит
Код: Выделить всё
static struct key {
char *text_menu;
char *sub_menu;
}TMenu[5]={
{"Battery" ,"SubMenu"},
{"Playlist" ,"AAaaa" }
};
но количество подменю теряется, начинаю уже думать о структуре в структуре, как-то так

Добавлено: Сб окт 24, 2009 23:19:56
Mr.Denis
Помогите пожалуйста, а то я что-то туплю!
Мне нужно сделать моргание светодиода по не обычной схеме(подключения).
Смысл в том что анод светодиода должен быть на PORTD.3, а катод должен располагаться на PORTD.4. Подскажите как правильно настроить порты ввода вывода, и какие уровни подавать на эти ноги!
МК: atmega8
С уважением, Денис!
Добавлено: Вс окт 25, 2009 09:07:06
ooogo
Смысл в том что анод светодиода должен быть на PORTD.3, а катод должен располагаться на PORTD.4
могу ошибаться, но помоему, так будет работать: оба порта на выход, светодиод будет гореть когда PORTD.3=1 PORTD.4=0; во всех остальных случаях он не будет гореть.
Добавлено: Вс окт 25, 2009 09:51:46
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;
}
}
Добавлено: Вс окт 25, 2009 10:02:49
ooogo
Я бы для начала, увеличил задержку, хотя бы до 500 мс!
а потом, после строчки
PORTD.3=0;
поставил бы еще одну задержку на 500 мс.
Добавлено: Вс окт 25, 2009 10:10:16
Mr.Denis
Точно! Всё заработало, спасибо!