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

Режим захвата таймера stm32

5 hours ago, dimir said:

И как она называется?

Поглядите на типы uint8_t, uint16_t, uint32_t, uint64_t. Это беззнаковые с соответствующей разрядностью.

Есть знаковые: int8_t, int16_t, int32_t, int64_t.

За всю мою практику профессиональной и хоббийной работы этих целочисленных типов мне хватало)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Записал я volotile uint16_t.А в симуляторе выводит тоже самое после 32250 выводит -32250 и обратный отсчёт.Может ещё что то нужно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 minutes ago, dimir said:

Записал я volotile uint16_t.А в симуляторе выводит тоже самое после 32250 выводит -32250 и обратный отсчёт.Может ещё что то нужно?

Я с AVR Studio крайний раз работал в 2013, ну может быть в 2015 году. Уже не помню все нюансы. Но 16-битное беззнаковое число это 2^16 = 65536 значений. Если мы считаем от нуля, а мы так и считаем, начиная с первого класса, то получаем диапазон 0..65535. Каким образом Вы получаете 32350 в виде "крышки" (максимального значения) типа - неясно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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);
       
    }  
        
 
	
 }

 

Изменено пользователем haker_fox
Длинный код нужно прятать под спойлер.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В режиме останова да симулятор показывает что счёт правильный  в окошке.А на LCD вминусах?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 13.01.2023 в 09:23, aaarrr сказал:

%u

Ну что я могу сказать.Вы профиссионал.Нормальный счёт.Значит я двоешник.С праздником всех программистов и непрограммистов.Сделан ещё один шаг к мечте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, dimir said:

Значит я двоешник.

Исправляйтесь😜 Там информация об этих модификаторах)

https://cplusplus.com/reference/cstdio/printf/

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 буфером все нормально, проверял

Изменено пользователем tgruzd

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 минут назад, tgruzd сказал:

Второй вариант улетает в хардфолт, не пойму почему.

А что это:

9 минут назад, tgruzd сказал:
%08ll ch: %u

такое и как по вашему оно должно работать?

11 минут назад, tgruzd сказал:

%08llx.  Вопрос: как правильно вывести  64-битное значение в шестнадцатеричном виде

Стоит всё-таки немного задуматься, чтобы понять, что в 64-битном значении не 8 цифр, а 16.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 минуты назад, jcxz сказал:
%08ll ch: %u

при редактировании ошибся сейчас, на самом деле второй вариант идентичен первому, но не работает под GCC. исправил в вопросе

Изменено пользователем tgruzd

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У себя всегда выводил так:

kprintf("Device size: %" PRIu64 " bytes.\r\n", csd.get_device_size());

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...