Demonrostov
Members-
Постов
149 -
Зарегистрирован
-
Посещение
Информация
-
Город
Ростов-на-Дону
Электроника
-
Стаж в электронике
Более 20 лет
Посетители профиля
1 123 просмотра профиля
Достижения Demonrostov
-
Я тоже так пробовал))), причем ttt=0, но условие все равно выполняется согласно битам, то же самое и в протеусе происходит, значение в ttt не заносится, но условия согласно битам выполняются.
- 8 951 ответ
-
- Микроконтроллер
- МК
-
(и ещё 2 )
C тегом:
-
Там в функции это проверяется и остальные цифры переносятся на следующую строчку. Я же говорю, функция вывода работает правильно. Этот код правильно отрабатывает и в массив залетает то что нужно. А этот, вот что в студии получается, ну и в железе тоже самое, в сам массив при проверке битов записываются нули. Причем первые два байта как вроде правильно считываются, а вот последний нет, точнее трабл с 15 бита начинается.
- 8 951 ответ
-
- Микроконтроллер
- МК
-
(и ещё 2 )
C тегом:
-
void SSD1306_Print_text(char *text,uint8_t x, uint8_t y,uint8_t size)// saize=0 varx16, saize=1 varx16x24 { uint8_t W; switch(size) { case 0: while(*text) { W=Read_pgm_var(*text,0); if ((x+W)>SSD1306_LCDWIDTH)//следим за окончанием строки { x = 0;//0-63 y=y+2;if (y>SSD1306_LCDHEIGHT/8-1){y=y-SSD1306_LCDHEIGHT/8-1;}//0-3 следим за окончанием страниц } SSD1306_Print_(x,y,*text,size,W); text++; x=x+W; }break; case 1: while(*text) { W=16; if ((x+W)>SSD1306_LCDWIDTH)//следим за окончанием строки { x = 0;//0-63 y=y+3;if (y>SSD1306_LCDHEIGHT/8-1){y=y-SSD1306_LCDHEIGHT/8-1;}//0-7 следим за окончанием страниц } SSD1306_Print_(x,y,*text,size,W); text++; x=x+W; }break; } } Все верно, размер массива 25, последняя ячейка DATA_bin[24]=0, я ее и не трогаю. uint8_t x, uint8_t y координаты Я со синтаксисом в таких сложных оборотах плохо разбираюсь, как в голове складывается так и пишу))), если работает то ничтяк, нет пишу вам. Спасибо, попробую так.
- 8 951 ответ
-
- Микроконтроллер
- МК
-
(и ещё 2 )
C тегом:
-
SSD1306_Print_text((char*)&DATA_bin[0],0,0,0);//передаем в функцию адрес первой ячейки массива и выводим символы, по достижению ячейки с /0 выходим из функции Шиворот, потому что проверку начинаем делать с младшего бита, а вывод в Print_text организован со старшего, ну по другому с первого([0]) байта массива ранее писал // потом DATA_bin выводим на экран итог b0000 0000 1111 1111 1111 1111, вот эта последовательность записывается в моем коде в Data_bin она же и выводится, здесь с самим выводом массива проблем нет. Вот куда девается старший 3-й байт?
- 8 951 ответ
-
- Микроконтроллер
- МК
-
(и ещё 2 )
C тегом:
-
если int a, то 0-1=-1 Я вроде все написал, в самом первом посту, старший байт в массиве DATA_bin заполняется нулями (48)
- 8 951 ответ
-
- Микроконтроллер
- МК
-
(и ещё 2 )
C тегом:
-
сделать int a и оставить самый первый вариант int8_t a; for (a=23; a>=0; a--) { DATA_bin[a] = (adc_value_1_sum & 1)? 49 : 48; adc_value_1_sum = adc_value_1_sum >> 1; }
- 8 951 ответ
-
- Микроконтроллер
- МК
-
(и ещё 2 )
C тегом:
-
А в этом выражении что не так ? if(adc_value_1_sum & (1<<a))
- 8 951 ответ
-
- Микроконтроллер
- МК
-
(и ещё 2 )
C тегом:
-
Ну тогда так adc_value_1_sum=8388607u; for (a=24; a>0; a--) { DATA_bin[a-1] = (adc_value_1_sum & 1)? 49 : 48; adc_value_1_sum = adc_value_1_sum >> 1; } 24-й байт массива должен быть = /0, признак конца строки.)))
- 8 951 ответ
-
- Микроконтроллер
- МК
-
(и ещё 2 )
C тегом:
-
А как вы думаете что представляет для компилятора это число. Для компилятора , не знаю)). Для меня- сдвигаем влево 1 на "а" значений, ну либо установить бит "а" в 1. Ну и соответственно побитное & делаем, if(adc_value_1_sum & (1<<a)) если>0, значит тру.
- 8 951 ответ
-
- Микроконтроллер
- МК
-
(и ещё 2 )
C тегом:
-
Привет знатокам). Пытаюсь вывести прочитанное 24 битное значение в двоичном коде, но столкнулся с тем, что старшие 8бит выводит нули. Не могу врубится почему, помогите разобраться! uint8_t a; uint32_t adc_value_1_sum; uint8_t DATA_bin[25]; adc_value_1_sum=8388607;//выводим условное число в виде двоичного кода, должно получится b0111 1111 1111 1111 1111 1111 for (a=0;a<24;a++) { if(adc_value_1_sum & (1<<a)) {DATA_bin[23-a]=49;}// если бит =1, пишем код числа"1"- 49 else {DATA_bin[23-a]=48;}// если бит !=1, пишем "0"- 48 } // потом DATA_bin выводим на экран итог b0000 0000 1111 1111 1111 1111 Как это исправить? AtmelStudio 6
- 8 951 ответ
-
- Микроконтроллер
- МК
-
(и ещё 2 )
C тегом:
-
Я понимаю так, момент сравнения попадает под прерывание, с переносом данных трабл получается вот и результат. Если изменить время прерывания то и результат скорее всего будет другой(но это не точно). Я думал, что компилятор данные волатиле корректно обрабатывает, и всегда напрямую использовал эти переменные, на такое недоразумение ни разу не попадал.
- 8 951 ответ
-
- Микроконтроллер
- МК
-
(и ещё 2 )
C тегом:
-
Вы лучше как правильно надо сделать напишите, а не удивляйтесь, это и я умею делать)
- 8 951 ответ
-
- Микроконтроллер
- МК
-
(и ещё 2 )
C тегом:
-
Так я не додумался сделать)). Подтверждаю, работает)). Спасибо приму на вооружение!
- 8 951 ответ
-
- Микроконтроллер
- МК
-
(и ещё 2 )
C тегом:
-
конечно, иначе ругаются)). В файле KEY.C volatile uint16_t timer_16; в файле KEY.h extern volatile uint16_t timer_16; ну и инклюдами все притянуто, тут же прикол другой, что сравнение в виде равно работает, а если больше, больше или равно нет. бес понятия, пишу только факты, ничего не придумываю, как некоторые думают)). Вчера весь вечер голову ломал, ответа явного не нашел, потому сюда написал. Рабочий варик кода я уже установил, так что пишем дальше
- 8 951 ответ
-
- Микроконтроллер
- МК
-
(и ещё 2 )
C тегом:
-
Ну да,сидел такой, кого бы по троллить, решил на форум написать))). тогда прерывание не срабатывает, не успевает)), пробовал. Вот так работает)) timer1_init();timer_16=0; sei();//разрешить прерывания Set_KEY;//установка кнопок, активный 1 nach: if((timer_16==3000)){ if(KEY_()==power_key) {goto start;}} else {goto nach;} start: PWM_ON;// включаем питание
- 8 951 ответ
-
- Микроконтроллер
- МК
-
(и ещё 2 )
C тегом: