Перейти к содержанию

Demonrostov

Members
  • Постов

    149
  • Зарегистрирован

  • Посещение

Весь контент Demonrostov

  1. Я тоже так пробовал))), причем ttt=0, но условие все равно выполняется согласно битам, то же самое и в протеусе происходит, значение в ttt не заносится, но условия согласно битам выполняются.
  2. Там в функции это проверяется и остальные цифры переносятся на следующую строчку. Я же говорю, функция вывода работает правильно. Этот код правильно отрабатывает и в массив залетает то что нужно. А этот, вот что в студии получается, ну и в железе тоже самое, в сам массив при проверке битов записываются нули. Причем первые два байта как вроде правильно считываются, а вот последний нет, точнее трабл с 15 бита начинается.
  3. 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 координаты Я со синтаксисом в таких сложных оборотах плохо разбираюсь, как в голове складывается так и пишу))), если работает то ничтяк, нет пишу вам. Спасибо, попробую так.
  4. 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-й байт?
  5. если int a, то 0-1=-1 Я вроде все написал, в самом первом посту, старший байт в массиве DATA_bin заполняется нулями (48)
  6. сделать 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; }
  7. Ну тогда так 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. А как вы думаете что представляет для компилятора это число. Для компилятора , не знаю)). Для меня- сдвигаем влево 1 на "а" значений, ну либо установить бит "а" в 1. Ну и соответственно побитное & делаем, if(adc_value_1_sum & (1<<a)) если>0, значит тру.
  9. Привет знатокам). Пытаюсь вывести прочитанное 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
  10. Я понимаю так, момент сравнения попадает под прерывание, с переносом данных трабл получается вот и результат. Если изменить время прерывания то и результат скорее всего будет другой(но это не точно). Я думал, что компилятор данные волатиле корректно обрабатывает, и всегда напрямую использовал эти переменные, на такое недоразумение ни разу не попадал.
  11. Вы лучше как правильно надо сделать напишите, а не удивляйтесь, это и я умею делать)
  12. Так я не додумался сделать)). Подтверждаю, работает)). Спасибо приму на вооружение!
  13. конечно, иначе ругаются)). В файле KEY.C volatile uint16_t timer_16; в файле KEY.h extern volatile uint16_t timer_16; ну и инклюдами все притянуто, тут же прикол другой, что сравнение в виде равно работает, а если больше, больше или равно нет. бес понятия, пишу только факты, ничего не придумываю, как некоторые думают)). Вчера весь вечер голову ломал, ответа явного не нашел, потому сюда написал. Рабочий варик кода я уже установил, так что пишем дальше
  14. Ну да,сидел такой, кого бы по троллить, решил на форум написать))). тогда прерывание не срабатывает, не успевает)), пробовал. Вот так работает)) 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;// включаем питание
  15. ну, т.е. это типа нормально? пиши не пиши волютуне будет random ? Я если б в протеус не прогнал то и не знал бы что, что то не так)) Ладно, спс всем откликнувшимся, если есть совет для данного случая, как его избежать в дальнейшем, буду благодарен.
  16. Не, не намекал, все как было выложил, без утайки. Весь код я прикрепил, можете сами попробовать, а потом говорит о маловероятности. Я же написал то что получил, Атмел Студия 6. Скрины без оптимизации и с ней. Я хз , но они есть
  17. Мне как бы придумывать истории ни к чему, то же самое происходит и в студии, число я не поймал, но переход был в близком диапазоне. К стати, если поставить в функции сравнения "==", то все работает адекватно, а если беру uint32_t , любое сравнение адекватно срабатывает. Именно! Перепробовал все оптимизации, глючит на всех, поставил без оптимизации, все работает адекватно. Хреново, когда такая бяка где ни будь далеко в проект заберется.
  18. Народ доброго дня! столкнулся с таким не объяснимым для меня явлением мега328 extern volatile uint16_t timer_16 void timer1_init() { TCCR1A = 0x00; TCCR1B |= (1<<WGM12)| // режим стс (1<<CS11)|(1<<CS10); // 16000000Гц, /64=250000,/1000=250 TCNT1 = 0x00; // Обнуляем счетный регистр OCR1A=250; // Настраиваем регистр сравнения 1000 раз в секунду // Разрешаем прерывание таймера по совпадению с OCR1A TIMSK1 |= (1<<OCIE1A);} ISR (TIMER1_COMPA_vect) { timer_16++; } int main(void){ nach: if(timer_16 > 1000) { goto start; // здесь переход происходит при timer_16=768 } goto nach; start: i2c_init(); } так вот в главном цикле if(timer_16 > 1000) срабатывает при значении timer_16 =768(см скрин протеуса), причем если даже меняю значение 1000 например на 1010 все происходит ровно так же, переход при значении 768 что происходит и как это исправить?
  19. начни с записи одного 32бит слова, потом страницы писать будешь
  20. смотри какой бит, байт идет первым от этого и пляши. скорее всего здесь не правильно собираешь
  21. Спасибо, работает. Ошибка моя была в некорректной симуляции протеуса. как я понимаю, принимаешь байт и пихаешь в 32-х битную переменную, делаешь сдвиг, потом "или" со следующим байтом и так пока все 4 байта не запихнешь.
  22. Вот же, Вы его передаёте : А как правильно принять в самой функции и сохранить данные в еепром? Я в функции написал "какая то" не знаю что и как правильно вписать там, чтобы работало.
  23. Подскажите как передать в функцию адрес переменной из EPROM. AtmelStudio6.2 uint16_t EEMEM servo_min_mem;//переменная в епром адресс которой надо передать в функцию //функция принимающая адрес переменной в епром void set_servo(какая то переменная принимающая адрес) { while(1) { if(timer_1s>=500){if(adc_n==0){print_adc(adc_data,60,0);CHANEL1; START_ADC;timer_1s=0;};} switch (key&0b00011100)// читаем порт кнопок { case 4: if (key_button()){if(adc_n==0){servo_temp=adc_data; eeprom_update_word(адресс принятой переменной,adc_data);return;}; }; } } } //вызов функции set_servo(&servo_min_mem);//передаем адресс в функцию
  24. писал выше чем плох. А платки копеечные потребляют миллиамперы, эту тему я загуглил))). Смысл сего продлить жизнь устройству без подзарядки, как вы понимаете.
×
×
  • Создать...