dimir 2 12 января, 2023 Опубликовано 12 января, 2023 · Жалоба И как она называется? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 59 13 января, 2023 Опубликовано 13 января, 2023 · Жалоба 5 hours ago, dimir said: И как она называется? Поглядите на типы uint8_t, uint16_t, uint32_t, uint64_t. Это беззнаковые с соответствующей разрядностью. Есть знаковые: int8_t, int16_t, int32_t, int64_t. За всю мою практику профессиональной и хоббийной работы этих целочисленных типов мне хватало) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimir 2 13 января, 2023 Опубликовано 13 января, 2023 · Жалоба Записал я volotile uint16_t.А в симуляторе выводит тоже самое после 32250 выводит -32250 и обратный отсчёт.Может ещё что то нужно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 59 13 января, 2023 Опубликовано 13 января, 2023 · Жалоба 9 minutes ago, dimir said: Записал я volotile uint16_t.А в симуляторе выводит тоже самое после 32250 выводит -32250 и обратный отсчёт.Может ещё что то нужно? Я с AVR Studio крайний раз работал в 2013, ну может быть в 2015 году. Уже не помню все нюансы. Но 16-битное беззнаковое число это 2^16 = 65536 значений. Если мы считаем от нуля, а мы так и считаем, начиная с первого класса, то получаем диапазон 0..65535. Каким образом Вы получаете 32350 в виде "крышки" (максимального значения) типа - неясно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimir 2 13 января, 2023 Опубликовано 13 января, 2023 (изменено) · Жалоба Spoiler /* * atmega32a lcd16x02.c * * Created: 27.03.2020 11:19:09 * Author : Ivan */ #define F_CPU 8000000UL//��������� ����8� �� 1��� #include <avr/io.h>//���������� ���� � ������ ���������� #include <util/delay.h>//���������� �������� #include <avr/interrupt.h> #include "lcd.h"//���������� lcd #include <stdio.h> char bufer[50]; volatile unsigned short int res; volatile char a,b; ISR(TIMER1_CAPT_vect) { a=ICR1H; b=ICR1L; res=(a<<8)+b; //res=ICR1; } void timers_init(void) { TCCR1A=0; TCCR1B|=(1<<ICNC1)|(1<<ICES1)|(1<<CS12)|(0<<CS11)|(1<<CS10); TIMSK|=(1<<TICIE1); //OCR1AH=0; //OCR1AL=0; TIFR|=(1<<ICF1); //TCNT1=0; TCNT1H=0; TCNT1L=0; ICR1H=0; ICR1L=0; } void init_ports(void) { DDRA|=0xFF; PORTA|=0x00; DDRC|=0xFF; PORTC|=0x00; DDRB|=(0<<0)|(0<<1); PORTB|=(0<<0)|(0<<1); } int main(void) { init_ports(); timers_init(); //DDRC|=0xFF; //PORTC|=0x00; lcd_init(LCD_DISP_ON); lcd_clrscr(); sei(); while (1) { lcd_gotoxy(0,0); sprintf(bufer,"res= %5d",res); lcd_puts(bufer); } } Вот код но он работает неправильно.А причина в железе не проверял.В симуляторе так как я писал.Это симулятор так выдаёт. А вот другой код и почти тоже самое. Spoiler /* * atmega32a lcd16x02.c * * Created: 27.03.2020 11:19:09 * Author : Ivan */ #define F_CPU 8000000UL//��������� ����8� �� 1��� #include <avr/io.h>//���������� ���� � ������ ���������� #include <util/delay.h>//���������� �������� #include <avr/interrupt.h> #include "lcd.h"//���������� lcd #include <stdio.h> char bufer[50]; volatile uint16_t res; volatile char a,b; ISR(TIMER1_CAPT_vect) { //a=ICR1H; //b=ICR1L; res=ICR1; //res=ICR1; } void timers_init(void) { TCCR1A=0; TCCR1B|=(1<<ICNC1)|(1<<ICES1)|(1<<CS12)|(0<<CS11)|(1<<CS10); TIMSK|=(1<<TICIE1); //OCR1AH=0; //OCR1AL=0; TIFR|=(1<<ICF1); //TCNT1=0; TCNT1H=0; TCNT1L=0; ICR1H=0; ICR1L=0; } void init_ports(void) { DDRA|=0xFF; PORTA|=0x00; DDRC|=0xFF; PORTC|=0x00; DDRB|=(0<<0)|(0<<1); PORTB|=(0<<0)|(0<<1); } int main(void) { init_ports(); timers_init(); //DDRC|=0xFF; //PORTC|=0x00; lcd_init(LCD_DISP_ON); lcd_clrscr(); sei(); while (1) { lcd_gotoxy(0,0); sprintf(bufer,"res= %5d",res); lcd_puts(bufer); } } Изменено 13 января, 2023 пользователем haker_fox Длинный код нужно прятать под спойлер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimir 2 13 января, 2023 Опубликовано 13 января, 2023 · Жалоба В режиме останова да симулятор показывает что счёт правильный в окошке.А на LCD вминусах? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 56 13 января, 2023 Опубликовано 13 января, 2023 · Жалоба %u Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimir 2 13 января, 2023 Опубликовано 13 января, 2023 · Жалоба В 13.01.2023 в 09:23, aaarrr сказал: %u Ну что я могу сказать.Вы профиссионал.Нормальный счёт.Значит я двоешник.С праздником всех программистов и непрограммистов.Сделан ещё один шаг к мечте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 59 13 января, 2023 Опубликовано 13 января, 2023 · Жалоба 4 minutes ago, dimir said: Значит я двоешник. Исправляйтесь😜 Там информация об этих модификаторах) https://cplusplus.com/reference/cstdio/printf/ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tgruzd 11 13 января, 2023 Опубликовано 13 января, 2023 (изменено) · Жалоба 3 часа назад, aaarrr сказал: %u 16 минут назад, haker_fox сказал: Исправляйтесь😜 Там информация об этих модификаторах) Раз уж тут знатоки модификаторов собрались, может, подскажете? Есть код, printf в трёх вариантах: Спойлер #if defined( __ARMCC_VERSION) /*works fine*/ n += snprintf(buf + n, bufsize - n, "ROM: %08llx ch: %u status: %s\r\n", devices[i].rom.l, devices[i].channel->idx, ow_get_device_status_str(devices[i].status )); #elif defined(__GNUC__) #if 0 /*HardFault*/ n += snprintf(buf + n, bufsize - n, "ROM: %08ll ch: %u status: %s\r\n", devices[i].rom.l, devices[i].channel->idx, ow_get_device_status_str(devices[i].status )); #elif 1 /*works fine*/ n += snprintf(buf + n, bufsize - n, "ROM: %02x%02x%02x%02x%02x%02x%02x%02x ch: %u status: %s\r\n", devices[i].rom.b[7], devices[i].rom.b[6], devices[i].rom.b[5], devices[i].rom.b[4], devices[i].rom.b[3], devices[i].rom.b[2], devices[i].rom.b[1], devices[i].rom.b[0], devices[i].channel->idx, ow_get_device_status_str( devices[i].status )); #endif #endif И собственно, первый вариант меня устраивает. Второй вариант улетает в хардфолт, не пойму почему. Третий - работает, но как-то плохо выглядит. Так вот, тут дело в модификаторе %08llx. Вопрос: как правильно вывести 64-битное значение в шестнадцатеричном виде в GCC? P.S c буфером все нормально, проверял Изменено 13 января, 2023 пользователем tgruzd Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 172 13 января, 2023 Опубликовано 13 января, 2023 · Жалоба 9 минут назад, tgruzd сказал: Второй вариант улетает в хардфолт, не пойму почему. А что это: 9 минут назад, tgruzd сказал: %08ll ch: %u такое и как по вашему оно должно работать? 11 минут назад, tgruzd сказал: %08llx. Вопрос: как правильно вывести 64-битное значение в шестнадцатеричном виде Стоит всё-таки немного задуматься, чтобы понять, что в 64-битном значении не 8 цифр, а 16. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tgruzd 11 13 января, 2023 Опубликовано 13 января, 2023 (изменено) · Жалоба 4 минуты назад, jcxz сказал: %08ll ch: %u при редактировании ошибся сейчас, на самом деле второй вариант идентичен первому, но не работает под GCC. исправил в вопросе Изменено 13 января, 2023 пользователем tgruzd Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 59 13 января, 2023 Опубликовано 13 января, 2023 · Жалоба У себя всегда выводил так: kprintf("Device size: %" PRIu64 " bytes.\r\n", csd.get_device_size()); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 56 13 января, 2023 Опубликовано 13 января, 2023 · Жалоба Что из себя представляет devices[].rom.l? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tgruzd 11 13 января, 2023 Опубликовано 13 января, 2023 · Жалоба Только что, aaarrr сказал: Что из себя представляет devices[].rom.l? uint64_t Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться