Например TDA7294

Форум РадиоКот • Просмотр темы - stm32f4 cmsis энкодер меню lcd16x02
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Чт апр 25, 2024 15:20:47

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 17 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: stm32f4 cmsis энкодер меню lcd16x02
СообщениеДобавлено: Ср сен 09, 2020 21:07:12 
Мучитель микросхем

Карма: -8
Рейтинг сообщений: -23
Зарегистрирован: Вс дек 29, 2019 08:05:21
Сообщений: 440
Рейтинг сообщения: 0
меня интересует энкодер апаратный.Почему я не могу записать в буфер значения разных переменных в разных разделах меню?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f4 cmsis энкодер меню lcd16x02
СообщениеДобавлено: Ср сен 09, 2020 21:19:28 
Друг Кота
Аватар пользователя

Карма: 1
Рейтинг сообщений: 157
Зарегистрирован: Пн окт 11, 2010 19:00:08
Сообщений: 3328
Рейтинг сообщения: 0
Вам виднее почему. Проанализируйте код и ответьте на свой вопрос.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f4 cmsis энкодер меню lcd16x02
СообщениеДобавлено: Ср сен 09, 2020 21:23:23 
Мучитель микросхем

Карма: -8
Рейтинг сообщений: -23
Зарегистрирован: Вс дек 29, 2019 08:05:21
Сообщений: 440
Рейтинг сообщения: 0
Ну а с Кнопками всё получается.В главном меню энкодер тоже считает?Что не так?


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: stm32f4 cmsis энкодер меню lcd16x02
СообщениеДобавлено: Чт сен 10, 2020 07:28:22 
Мучитель микросхем

Карма: -8
Рейтинг сообщений: -23
Зарегистрирован: Вс дек 29, 2019 08:05:21
Сообщений: 440
Рейтинг сообщения: 0
почему это работает
/*
* AVR_MENU.c
*
* Created: 18.03.2017 5:30:25
* Author : User
*/
#define F_CPU 8000000UL
#include <avr/io.h>
//#include <avr/eeprom.h>
#include <util/delay.h>
#include <avr/interrupt.h>
//#include <util/twi.h>

#include "lcd.h"
#include "adc.h"
#include <stdio.h>
#include <avr/wdt.h>
#include "I2C.h"
#include "EEPROM_V.h"
#define btn_plus (PINC&1<<2)
#define btn_minus (PINC&1<<7)
#define SLA_R_RTC_ADDR 0b10100001//макрос адреса +бит чтения
#define SLA_WR_RTC_ADDR 0b10100000//макрос адреса +бит записи

volatile unsigned int a,b,c,d;//
volatile unsigned char a1;//
volatile unsigned char a2;//
volatile unsigned char b1;//

volatile unsigned char b2;//
unsigned char c1,d1;//
unsigned char c2,d2;//

volatile unsigned int r1,r2,r3;// переменная для прерывания по кнопке
volatile unsigned char menu=0;
volatile unsigned int n=0;
volatile unsigned char bit1=0;
volatile unsigned char bit2=1;
volatile unsigned char bit3=0;
//-Wl,-u,vfprintf -lprintf_flt -lm
//-lprintf_flt
char buf1[10];

char buf2[10];
char buf3[10];
char buf4[10];
char buf5[10];
char buf6[10];

volatile unsigned char flag1=0;
volatile unsigned char flag2=0;
volatile unsigned char flag3=0;
volatile unsigned char flag4=0;
volatile unsigned char flag5=0;
volatile unsigned char flag6=0;
volatile unsigned char flag7=0;
volatile unsigned char flag8=0;
volatile unsigned char flag9=0;
volatile unsigned char flag10=0;



unsigned char data;

volatile unsigned int pauza=0;
volatile unsigned int pauza_x=0;
volatile unsigned int pauza_z=0;

//volatile unsigned char flag1=0,flag7=0,flag8=0,flag9=0;
//char flag2=0;
//volatile unsigned char flag3=0;
//char flag4=0;
//volatile unsigned char flag5=0;
//volatile unsigned char flag6=0;

//uint16_t save1 EEMEM;
//uint16_t save2 EEMEM;
//uint16_t save3 EEMEM;
//uint16_t save4 EEMEM;

ISR(INT0_vect)
{
//r++;
pauza=0;
bit3=1;
//TCNT2=0;
//pauza_x=0;
//flag5=0;

}
ISR(TIMER0_COMP_vect)
{
TCNT0=0;
pauza_x++;
asm("wdr");
}
ISR(TIMER1_COMPB_vect)
{
TCNT1H=0;
TCNT1L=0;
pauza_z++;

}
ISR(TIMER2_COMP_vect)
{
TCNT2=0;
pauza++;
if (!(PINC&1<<3))
{
flag1=1;
pauza=0;
}
if ((flag1==1)&&(PINC&1<<3))
{
if (pauza>2)
{
menu++;n++;flag1=0;

}

}

}
//void write_eeprom(void)
//{
// I2C_START();
// I2C_TrasmitByte();
// I2C_STOP();

//}


void programa_write_eep(void)
{


//I2C_Write_EEPROM(0b1010000);
//I2C_Write_EEPROM(0);
//I2C_Write_EEPROM(0);
//I2C_Write_EEPROM(a);

I2C_STOP();
}
void programa_2(void)
{
if (pauza_z>1200)
{
flag3=1;
}


if (pauza_z>1280)
{
flag3=0;

}
if (pauza_z>1400)
{
bit3=1;
}
if (flag3==1)
{
PORTD|=(1<<5);

}
if (flag3==0)
{
PORTD&=~(1<<5);

}
}
//unsigned int ADC_result(unsigned char adc_input)
//{
// ADMUX=adc_input | (ADMUX & 0xF0);
//задержка для стабилизации входного напряжения
// _delay_us(10);
//начинаем преобразование (ADSC = 1)

// ADCSRA=ADCSRA|(1<<ADSC);
// while(ADCSRA & (1<<ADSC));//ждем, пока АЦП закончит преобразование (ADIF = 0)
// return ADCW;//ADC - содержит ADCH и ADCL
//}
void init_ports(void)
{
DDRA=0x00;
PORTA=0x00;
DDRC|=(0<<2)|(0<<3)|(0<<7);//настройка порта D на вход "0" и на выход "1"
PORTC|=(1<<2)|(1<<3)|(1<<7);//настройка порта D на вход "0" и на выход "1"
DDRB|=0xFF;//
PORTB|=0x00;//установка на выводах портаB
DDRD|=(1<<0)|(0<<1)|(0<<2)|(0<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7);//настройка порта D на вход "0" и на выход "1"
PORTD|=(0<<0)|(1<<1)|(1<<2)|(1<<3)|(0<<4)|(0<<5)|(0<<6)|(0<<7);//установкана всех выводах порта D
}
void init_timers(void)
{
TCCR1B=(1<<CS12)|(0<<CS11)|(1<<CS10);
TCCR1A=0;
TCCR0|=(1<<CS02)|(0<<CS01)|(1<<CS00);
TCCR2|=(1<<CS22)|(0<<CS21)|(1<<CS20);
TIMSK|=(1<<OCIE0)|(1<<OCIE1B)|(1<<OCIE2);
TIFR|=(1<<OCF0)|(1<<OCF1B)|(1<<OCF2);
TCNT0=0;
TCNT1H=0;
TCNT1L=0;

TCNT2=0;
OCR0=245;
OCR1B=250;

OCR2=250;
}
void INT_PIN()
{
GICR|=(1<<INT0);
MCUCR|=(1<<ISC01)|(1<<ISC00);
GIFR|=(1<<INTF0);

}
//void init_ADC()
//{
// ADCSRA|=(1<<ADEN);
// ADCSRA|=(0<<ADIF)|(0<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
// ADMUX |=(0<<REFS1)|(1<<REFS0);
// ADCSRA |=(1<<ADSC);
//}
void init_wachdog_timer(void)
{
WDTCR|=(0<<WDTOE)|(1<<WDE)|(1<<WDP2)|(1<<WDP1)|(0<<WDP0);
}

int main(void)
{
init_ports();
init_I2C_M();
I2C_START();
I2C_SendByte(SLA_WR_RTC_ADDR);
I2C_SendByte(1);
I2C_SendByte(0);
I2C_START();
I2C_SendByte(SLA_R_RTC_ADDR);
a1=I2C_Readbyte_EEPROM();
a2=I2C_Readlastbyte_EEPROM();
I2C_STOP();
// _delay_ms(5);
// a=((unsigned int) a1<<8)|a2;
I2C_START();
I2C_SendByte(SLA_WR_RTC_ADDR);
I2C_SendByte(3);
I2C_SendByte(2);
I2C_START();
I2C_SendByte(SLA_R_RTC_ADDR);
b1=I2C_Readbyte_EEPROM();
b2=I2C_Readlastbyte_EEPROM();
I2C_STOP();
// I2C_START();
// a=((unsigned int) a1<<8)|a2;

//b=((unsigned int) b1<<8)|b2;

//I2C_STOP();
//_delay_ms()
// b=((unsigned int) b1<<8)|b2;
I2C_START();
I2C_SendByte(SLA_WR_RTC_ADDR);
I2C_SendByte(5);
I2C_SendByte(4);
I2C_START();
I2C_SendByte(SLA_R_RTC_ADDR);
c1=I2C_Readbyte_EEPROM();
c2=I2C_Readbyte_EEPROM();
I2C_STOP();

// read_eeprom();// чтение 2 байт
//a=TWDR;
// programa_read_eep();
//a=eeprom_read_word(& save1);// чтение 2 байт
//b=eeprom_read_word(& save2);// чтение 2 байт
//c=eeprom_read_word(& save3);// чтение 2 байт
//d=eeprom_read_word(& save4);// чтение 2 байт
// _delay_us(5);

// I2C_START();
// I2C_SendByte(SLA_WR_RTC_ADDR);
// I2C_SendByte(3);
// I2C_SendByte(3);
// I2C_START();
// I2C_SendByte(SLA_R_RTC_ADDR);


// c=I2C_Readbyte_EEPROM();

// b=I2C_Readbyte_EEPROM();

// c=I2C_Readbyte_EEPROM();
// b=I2C_Readlastbyte_EEPROM();

// I2C_STOP();
// a=((unsigned int) a1<<8)|a2;
// b=((unsigned int) b1<<8)|b2;
//b=((unsigned int) b1<<8)|b2;
//a=((unsigned int )a1<<8)|a2;
// b=((unsigned int) b1<<8)|b2;

init_timers();
INT_PIN();
init_ADC();
lcd_init(LCD_DISP_ON);
lcd_clrscr();
asm("sei") ;
init_wachdog_timer();
a=((unsigned int )a1<<8)|a2;
b=((unsigned int) b1<<8)|b2;
c=((unsigned int )c1<<8)|c2;


while(1)
{
PORTD|=(1<<4);

if (bit3==1)
{
TCCR1B=(0<<CS12)|(0<<CS11)|(0<<CS10);
}

if (bit3==0)
{
TCCR1B=(1<<CS12)|(0<<CS11)|(1<<CS10);
}



if (ADC_result(4)>825)
{

// flag2=0;
asm("cli") ;
programa_2();
asm("sei") ;

}
else
{
bit3=0;
//flag2=1;
asm("cli") ;

pauza_z=0;
pauza=0;

asm("sei") ;

}


if (n==1)
{
PORTD|=(1<<5);

}

if (n==5)
{
n=0;
PORTD&=~(1<<5);

}


if (ADC_result(0)>a&&ADC_result(1)>b&&ADC_result(2)>c&&ADC_result(3)>825)
{
//PORTD|=(1<<7);
bit1=1;
// flag5=1;
}

else
{
// PORTD&=~(1<<7);

bit1=0;
}
if (bit1==1)
{
PORTD|=(1<<7);

}
else
{
PORTD&=~(1<<7);

}




//if (bit1==1&&bit2==1)
//{
// PORTD|=(1<<6);
// }
// else
//{
// PORTD&=~(1<<6);
// }

if (menu==1)
{
asm("cli");

if (btn_plus==0)
{
if (pauza>1)
{
pauza=0;

if ( a==1023)
{
a=0;
}
a++;
}
}
if (btn_minus==0)
{
if (pauza>1)
{
pauza=0;

if (a==0)
{
a=1023;
}
a--;
}
}
asm("sei");
}
if (menu==2)
{
asm("cli");
if (btn_plus==0)
{
if (pauza>1)
{
pauza=0;

if (b==1023)
{
b=0;
}
b++;
}
}
if (btn_minus==0)
{
if (pauza>1)
{
pauza=0;
if (b==0)
{
b=1023;
}
b--;
}
}
asm("sei");
}
if (menu==3)
{
asm("cli");

if (btn_plus==0)
{
if (pauza>1)
{
pauza=0;
c++;

if (c==1023)
{
c=0;
}
}
}
if (btn_minus==0)
{
if (pauza>1)
{
pauza=0;
if (c==0)
{
c=1023;
}
c--;
}
}
asm("sei");
}
if (menu==4)
{
asm("cli");

if (btn_plus==0)
{
if (pauza>1)
{
pauza=0;

if ( d==1023)
{
d=0;
}
d++;
}
}
if (btn_minus==0)
{
if (pauza>1)
{
pauza=0;

if (d==0)
{
d=1023;
}
d--;
}
}
asm("sei");
}
if (menu==0)
{
// a=((unsigned int )a1<<8)|a2;
// b=((unsigned int) b1<<8)|b2;

asm("cli");
lcd_clrscr();
//sprintf(buf4);
lcd_puts("BobrAVR");
// sprintf(buf3,"i=%.2fa",result);
// lcd_gotoxy(9,0);
// lcd_puts(buf3);




if (ADC_result(2)<c)
{
lcd_gotoxy(8,0);
lcd_puts("OF");

}
else
{
lcd_gotoxy(8,0);
lcd_puts("ON");

}
if (ADC_result(4)>800)
{
lcd_gotoxy(12,0);
lcd_puts("X");

}
else
{
lcd_gotoxy(12,0);
lcd_puts("Z");

}
if (ADC_result(3)>800)
{
lcd_gotoxy(14,0);
lcd_puts("X");
}
else
{
lcd_gotoxy(14,0);
lcd_puts("Z");

}
_delay_ms(50);
asm("sei");

}
if (menu==1)
{

asm("cli");

lcd_clrscr();
// a=((unsigned int )a1<<8)|a2;
sprintf(buf1,"a=%2d",a);
lcd_puts(buf1);
a1=a/256;
a2=a%256;
//a2=a&0xFF;
// a1=a>>8;

if (!(PIND&1<<3))
{
flag2=1;
_delay_ms(20);

}
if((flag2==1)&&(PIND&1<<3))
{
flag2=0;
//a1=a&0xFF;
//a2=a>>8;

I2C_START();
I2C_SendByte(SLA_WR_RTC_ADDR);
I2C_SendByte(1);
I2C_SendByte(0);
I2C_Write_EEPROM(a1);
I2C_Write_EEPROM(a2);
I2C_STOP();
// _delay_ms(5);
}

if (ADC_result(0)>a)
{
lcd_gotoxy(0,9);
lcd_puts("P");

}
else
{
lcd_gotoxy(0,9);
lcd_puts("R");
}
r1=ADC_result(0);
lcd_gotoxy(2,1);
sprintf(buf4,"a1=%2d",r1);
lcd_puts(buf4);

_delay_ms(50);

asm("sei");
}

if (menu==2)
{

asm("cli");
lcd_clrscr();
sprintf(buf2,"b=%2d",b);
lcd_puts(buf2);
b1=b/256;
b2=b%256;
// asm("cli");

if (!(PIND&1<<3))
{
flag2=1;
_delay_ms(20);

}
if (flag2==1&&PIND&1<<3)
{
// b1=a/256;
// b2=a%256;

flag2=0;

I2C_START();
I2C_SendByte(SLA_WR_RTC_ADDR);
I2C_SendByte(3);
I2C_SendByte(2);
I2C_Write_EEPROM(b1);
I2C_Write_EEPROM(b2);

I2C_STOP();





// eeprom_write_word (& save2,b);
}

if (ADC_result(1)>b)
{
lcd_gotoxy(0,9);
lcd_puts("P");

}
else
{
lcd_gotoxy(0,9);
lcd_puts("R");

}
r2=ADC_result(1);
lcd_gotoxy(2,1);
sprintf(buf5,"b1=%2d",r2);
lcd_puts(buf5);

_delay_ms(50);

asm("sei");
}
if (menu==3)
{

asm("cli");
lcd_clrscr();
sprintf(buf3,"c=%2d",c);
lcd_puts(buf3);
c1=c/256;
c2=c%256;

if (!(PIND&1<<3))
{
flag2=1;
_delay_ms(20);

}
if (flag2==1&&PIND&1<<3)
{

flag2=0;
I2C_START();
I2C_SendByte(SLA_WR_RTC_ADDR);
I2C_SendByte(5);
I2C_SendByte(4);
I2C_Write_EEPROM(c1);
I2C_Write_EEPROM(c2);

I2C_STOP();
// _delay_ms(5);

// eeprom_write_word (& save3,c);
}
if (ADC_result(2)>c)
{
lcd_gotoxy(0,9);
lcd_puts("R");

}
else
{
lcd_gotoxy(0,9);
lcd_puts("ND");

}
r3=ADC_result(2);
lcd_gotoxy(3,1);
sprintf(buf6,"c1=%2d",r3);
lcd_puts(buf6);

_delay_ms(50);

asm("sei");
}
if (menu==4)
{
menu=0;
}
}
}
а вот это не работает
/*
* main.c
*
* Created on: 12 авг. 2020 г.
* Author: Ivan
*/
#include"main.h"
#include<stdio.h>
#define button1 GPIOA->IDR &GPIO_IDR_ID6
#define button2 GPIOA->IDR &GPIO_IDR_ID7
//#include"#include"main.h"lcd2.h"
volatile unsigned int pauza=0;

volatile unsigned char flag=0;
volatile unsigned int b,c;
volatile unsigned int t,m;
volatile unsigned char menu;
volatile unsigned char menu_en;
volatile unsigned int adc_data1=0;
volatile unsigned int adc_data2=0;
volatile unsigned int adc_data3=0;
volatile unsigned int adc_data4=0;
char bufer1[16];


char bufer2[16];

uint16_t ADC_Data[4];
//#define z 0xB1//Я
typedef unsigned char byte; //переопределяем тип
void delay_ms(int a)
{
int i = 0;
int f = 0;
while(f < a)
{
while(i<60)
{i++;}
f++;
}
}


uint8_t bii [8]=
{
0B00000,
0B00000,
0B01010,
0B00100,
0B00100,
0B00100,
0B00100,
0B00000
};
uint8_t bk [8]=
{
0B00000,
0B00000,
0B01001,
0B01010,
0B01100,
0B01010,
0B01001,
0B00000
};
uint8_t bj [8]=
{
0B00000,
0B00000,
0B10101,
0B01110,
0B00100,
0B01110,
0B10101,
0B00000
};
uint8_t bm[]=
{


0B00000,
0B00000,
0B10001,
0B11011,
0B10101,
0B10001,
0B10001,
0B00000
};
uint8_t bn[]=
{
0B00000,
0B00000,
0B10010,
0B10010,
0B11110,
0B10010,
0B10010,
0B00000
};
uint8_t biu[]=
{
0B00000,
0B00000,
0B10111,
0B10101,
0B11101,
0B10101,
0B10111,
0B00000

};
uint8_t iorp[]=
{
0b00000,
0b01100,
0b11110,
0b11110,
0b01111,
0b00111,
0b00011,
0b00001
};
uint8_t ior2p[]=
{
0b00000,
0b00110,
0b01111,
0b01110,
0b11110,
0b11100,
0b11000,
0b10000
};



void init_IWDGtimer(void)
{
RCC->CSR|= RCC_CSR_LSION;



IWDG->KR = 0x5555; // Access to registers
IWDG->PR&= ~(IWDG_PR_PR_0 | IWDG_PR_PR_1 | IWDG_PR_PR_2); // 4096
IWDG->RLR =170;//0x7FF;
while (!((IWDG->SR & IWDG_SR_PVU) && (IWDG->SR & IWDG_SR_RVU))){} // wait while bist of PVU and RVU will be set.
IWDG->KR = 0xCCCC; // Start count down;
}
void program1(void)
{

if(pauza==1)
{
lcd_clear();
lcd_set_xy(0, 0);
// IWDG->KR = 0xAAAA;
}
if(pauza==20)
{

//PORTC13_ON;
lcd_clear();
lcd_set_xy(0, 0);
lcd_send(2,DATA);

}

if(pauza==35)
{
// PORTC13_OF;
lcd_clear();
lcd_set_xy(0, 0);
lcd_send('a',DATA);
lcd_send(2,DATA);


// pauza=0;
}

if(pauza==50)
{
lcd_clear();
lcd_set_xy(0, 0);
// lcd_set_user_char(0, bii);
// lcd_set_user_char(1, bj);
lcd_send(1,DATA);
lcd_send('a',DATA);
lcd_send(2,DATA);
}

if(pauza==65)
{
lcd_clear();
//lcd_set_user_char(0, bii);
// lcd_set_user_char(1, bj);
lcd_set_xy(0, 0);
lcd_send(0,DATA);
lcd_send(1,DATA);
lcd_send('a',DATA);
lcd_send(2,DATA);
//pauza=0;
}

if(pauza==80)
{
lcd_clear();

lcd_set_xy(0, 0);
lcd_send(' ' ,DATA);
lcd_send( 0 ,DATA);
lcd_send(1,DATA);
lcd_send('a',DATA);
lcd_send(2,DATA);
//pauza=0;
}

if(pauza==95)
{
lcd_clear();
// lcd_set_xy(0, 0);

// lcd_set_user_char(0, bii);
// lcd_set_user_char(1, bj);
lcd_set_xy(0, 0);
lcd_send(' ',DATA);
lcd_send(' ',DATA);
lcd_send( 0 ,DATA);
lcd_send(1,DATA);
lcd_send('a',DATA);
lcd_send(2,DATA);
lcd_set_xy(0, 1);
lcd_send(3,DATA);
lcd_send('e',DATA);
lcd_send(4,DATA);
lcd_send(5,DATA);
lcd_send(' ',DATA);
lcd_send( 3 ,DATA);
lcd_send('a',DATA);
lcd_send( 3 ,DATA);
lcd_send('a',DATA);
// lcd_out("mama");
// pauza=0;

}


}

void program2(void)
{

// TIM3->CNT=0;

// lcd_clear();

// b=100;
lcd_set_xy(0, 0);
//TIM3->CNT=b;
// t=0;
sprintf(bufer1,"b= %.4d" ,b);
lcd_out(bufer1);

// }
}
void program3(void)
{


// t=700;
lcd_set_xy(1,9);

sprintf(bufer2,"t= %.4d",t);
lcd_out(bufer2);


}
void Calbac (void)
{
ADC_Data[0]=ADC1->JDR1;
ADC_Data[1]=ADC1->JDR2;
ADC_Data[2]=ADC1->JDR3;
ADC_Data[3]=ADC1->JDR4;

//TIM4->CCR3=ADC_Data[2];
// TIM4->CCR3=ADC_Data[0];
//TIM4->CCR3=ADC_Data[2];
}
int main(void)
{
//char bufer1[16];
//lcd_delay();
//int b;
//init_IWDGtimer();
AHB1ER_init();
PORT_init();
timer2_init();
AFR_init_time3();
timer3_init();
AFR_init_time4();
time4_init();
time5_init();
timer6_init();
adc3_init_regular();
adc1_init_inject();
//lcd_init_GPIO();
// str_lcd("string");

// LCD_Clear();
ADC1->CR1|= ADC_CR1_JEOCIE;

ADC1->CR2 |= ADC_CR2_ADON;
NVIC_EnableIRQ ( ADC_IRQn);
ADC3->CR2|=ADC_CR2_EXTSEL_2 |ADC_CR2_EXTSEL_1;
ADC1->CR2|=ADC_CR2_JEXTSEL_1 |ADC_CR2_JEXTSEL_0;
//ADC1->CR2|=ADC_CR2_JSWSTART;
//LCD_init1();
lcd_init();
//lcd_clear();
//lcd_set_state(LCD_ENABLE, CURSOR_ENABLE, BLINK);

lcd_set_user_char(0, bii);
lcd_set_user_char(1, bj);
lcd_set_user_char(2, bk);
lcd_set_user_char(3, bm);
lcd_set_user_char(4, bn);
lcd_set_user_char(5, biu);
// Наша рыба это символ номер ноль
// lcd_out("This is fish"); //Выводим надпись в нулевую строку
// lcd_set_xy(0,1); //переводим курсор в первую строку
//lcd_send(0,DATA);
// lcd_send(1,DATA);
//lcd_send('a',DATA);
//Выводим символ номер ноль
// lcd_set_state(LCD_ENABLE, CURSOR_ENABLE, BLINK);
//lcd_set_state(LCD_ENABLE,CURSOR_ENABLE,NO_BLINK);
//lcd_clear();
//lcd_set_state(LCD_ENABLE,CURSOR_ENABLE,NO_BLINK);
//InitialLCD();
//ClearLCD();
//Cursor(0,2);
//lcd_out("mama");
//PrintStr("MAMA");

//lcd_set_xy(0, 1);
//lcd_out("mama");
//lcd_set_xy(6, 6);
//lcd_out("papa");
//lcd_send('X',DATA);
// lcd_send('y',DATA);
//lcd_send('e',DATA);
// clearlcd();
// str_lcd("string");
// delay_ms(50);
init_IWDGtimer();
while(1)
{
// IWDG->KR = 0xAAAA;
//lcd_clear();
// lcd_set_xy(0, 0);
//lcd_out("mama");
//lcd_set_xy(0, 1);
//lcd_out("papa");
//delay_ms(50);
//ADC1->CR2|=ADC_CR2_JSWSTART;
//ADC1->CR2|=ADC_CR2_JEXTSEL_1 |ADC_CR2_JEXTSEL_0;
//while(!(ADC1->SR & ADC_SR_JEOC));
// ADC1->SR &=~ ADC_SR_JEOC;
// Calbac ();
// if( ADC_Data[0]>2045)
//{
// PORTC13_ON;
// a=TIM3->CNT;
// if(a==5)
// {
// PORTC13_ON;
// }
// else
// {
// PORTC13_OF;
// }
//lcd_set_xy(2, 0);
//lcd_send(0,DATA);
//lcd_out("mama");
//lcd_set_xy(6, 0);
//lcd_out("papa");
//lcd_set_xy(0, 1);
// lcd_set_xy(0, 1);
// lcd_send('m',DATA);


if(menu==0)
{
// lcd_clear();
//lcd_set_xy(0, 0);
program1();
//lcd_out("mama");
// Delay(50);
// lcd_set_xy(6, 6);

//DWT_delay_ms(50);
// delay_(5);
// lcd_clear();
// lcd_set_xy(0, 1);
// lcd_send(' ',DATA);
// lcd_send('m',DATA);
// delay(1);
// PORTD1_ON;
// delay_ms(100);
// Delay(40);
}

if(menu==1)
{
program2();
// if(b>=50)
// {
// PORTC13_ON;
// }
// else
// {
// PORTD1_OF;
// PORTC13_OF;

// }
Delay(40);
// delay_ms(50);
}
if(menu==2)
{
program3();
Delay(40);

// delay_ms(50);

}

if(menu==3)
{
menu=0;
pauza=0;
}
//Delay(20);
// DWT_delay_ms(100);

// a=TIM3->CNT;
//TIM4->CCR3=a;
//TIM4->CCR3=ADC_Data[2];
// TIM4->CCR1=ADC_Data[0];
//ADC3->CR2|=ADC_CR2_JSWSTART;
// PORTD1_ON;
//TIM4->CCR1=4095;
//TIM4->CCR2=4095;
//TIM4->CCR3=4095;
//TIM4->CCR4=4095;


}
}
/*
* ISR.c
*
* Created on: 17 июл. 2020 г.
* Author: Ivan
*/

#include"main.h"


#include"PORT.h"
//void Calbac (void);
extern unsigned char flag;
extern unsigned char menu;
extern unsigned char menu_en;
extern unsigned int tic;
extern unsigned int a;
extern unsigned int b;
extern unsigned int t;
extern unsigned int pauza;
extern unsigned int adc_data1;
extern unsigned int adc_data2;
extern unsigned int adc_data3;
extern unsigned int adc_data4;

extern unsigned char flag;

void TIM1_IRQHandler (void)
{

}
void TIM2_IRQHandler (void)
{

}
void TIM3_IRQHandler (void)
{
if(TIM3->SR & TIM_SR_UIF)
{
TIM3->SR &= ~ TIM_SR_UIF;
// IWDG->KR = 0xAAAA;
// IWDG->KR = 0xAAAA;
// pauza++;
//if(pauza>20)
//{

// PORTC13_ON;
///PORTD1_ON;
// GPIOD->BSRR |= GPIO_BSRR_BS1;
//GPIOC-> BSRR |=GPIO_BSRR_BS13;
//}
// if(pauza>40)
//{
// PORTC13_OF;
//PORTD1_OF;
// GPIOD->BSRR |= GPIO_BSRR_BR1;
// GPIOC-> BSRR |=GPIO_BSRR_BR13;
// pauza=0;
// }
}



}
void TIM4_IRQHandler (void)
{

}
void TIM5_IRQHandler (void)
{
if(TIM5->SR & TIM_SR_UIF)
{
TIM5->SR &= ~ TIM_SR_UIF;


}
}
void TIM6_DAC_IRQHandler (void)
{

if(TIM6->SR & TIM_SR_UIF)
{
TIM6->SR &= ~ TIM_SR_UIF;

if(menu_en==1)
{


b=TIM3->CNT;



}
if(menu_en==2)
{


//TIM3->CNT++;
t=TIM3->CNT;

// menu_en=0;
}
if(menu_en==3)
{

menu_en=0;
}


//TIM3->CNT=b;
if(!(GPIOC->IDR&GPIO_IDR_ID0))
{
flag=1;
pauza=0;
// TIM3->CR1&=~TIM_CR1_CEN;
// TIM3->CNT=0;
// b=0;

RCC->APB1ENR &=~RCC_APB1ENR_TIM3EN;


// t=0;
// TIM3->CR1&=~ TIM_CR1_CEN;
DWT_delay_ms(10);
}
if(flag==1&&GPIOC->IDR&GPIO_IDR_ID0)
{
flag=0;
DWT_delay_ms(10);

RCC->APB1ENR |=RCC_APB1ENR_TIM3EN;


// TIM3->CR1|= TIM_CR1_CEN;
menu=menu+1;
menu_en++;
}
//program1();



// PORTC13_ON;
IWDG->KR = 0xAAAA;
pauza++;
}
}

//void TIM7_IRQHandler (void);
//void TIM8_IRQHandler (void);
//void TIM9_IRQHandler (void);
//void TIM10_IRQHandler (void);
//void TIM11_IRQHandler (void);
//void TIM12_IRQHandler (void);
//void TIM13_IRQHandler (void)
void ADC_IRQHandler(void)
{
if(ADC1->SR & ADC_SR_JEOC)
{
ADC1->SR &=~ ADC_SR_JEOC;


adc_data1=ADC1->JDR1;
TIM4->CCR1=adc_data1;
ADC1->SR &=~ ADC_SR_JEOC;
adc_data2=ADC1->JDR2;
TIM4->CCR2=adc_data2;
ADC1->SR &=~ ADC_SR_JEOC;
adc_data3=ADC1->JDR3;
TIM4->CCR3=adc_data3;
ADC1->SR &=~ ADC_SR_JEOC;
adc_data4=ADC1->JDR4;
TIM4->CCR4=adc_data4;
// return=ADC1->JDR1;
//flag=1;
// TIM4->CCR1=adc_data1;
// TIM4->CCR2=adc_data2;
// TIM4->CCR3=adc_data3;
// TIM4->CCR4=adc_data4;
// TIM4->CCR1=adc_data1;
// if( adc_data3>2045)
// {
// PORTD1_ON;
// PORTC13_ON;
// }
// else
// {
// PORTD1_OF;
// PORTC13_OF;

// }


}
}
вернее работает но не так как хотелось бы.Или я принцип энкодера не понимаю.Или вообще баран


Вложения:
main.c [13.54 KiB]
Скачиваний: 193
Вернуться наверх
 
Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: stm32f4 cmsis энкодер меню lcd16x02
СообщениеДобавлено: Чт сен 10, 2020 10:45:57 
Друг Кота
Аватар пользователя

Карма: 1
Рейтинг сообщений: 157
Зарегистрирован: Пн окт 11, 2010 19:00:08
Сообщений: 3328
Рейтинг сообщения: 0
Изучите тег форума [сode] и научитесь пользоваться отладчиком.


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: stm32f4 cmsis энкодер меню lcd16x02
СообщениеДобавлено: Вс сен 13, 2020 21:04:32 
Мучитель микросхем
Аватар пользователя

Карма: 12
Рейтинг сообщений: 17
Зарегистрирован: Ср июн 03, 2009 00:20:21
Сообщений: 440
Откуда: Новороссия ЛНР Рубежное -> РФ Калуга
Рейтинг сообщения: 0
Принцип энкодера, если ты об этом

Цитата:
В связи с тем, что в мире всё сложно
и все процессы в энкодере происходят
на фоне каких-то других.
Из чего следует:
1) Ловим изменения по фазе "А" и "В"
2) Если изменилась "А" проверяем
а) Если фаза "А" не равна фазе "В" то счетчик = счетчик + 1 CW
б) Если фаза "А" равна фазе "В" то счетчик = счетчик - 1 CCW
3) Если изменилась "В" проверяем
а) Если фаза "В" не равна фазе "А" то счетчик = счетчик - 1 CCW
б) Если фаза "В" равна фазе "А" то счетчик = счетчик + 1 CW


прим
CW по часовой
CCW против часовой

_________________
Политика России будет выглядеть неоднозначной до тех пор, пока не будет решен исход битвы.
Свободу можно завоевать, можно просрать, но высидеть свободу нельзя! ©
Всё, что меня не убивает - делает большую ошибку!
Не зли меня!!! :wink:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f4 cmsis энкодер меню lcd16x02
СообщениеДобавлено: Вс сен 20, 2020 09:28:54 
Мучитель микросхем

Карма: -8
Рейтинг сообщений: -23
Зарегистрирован: Вс дек 29, 2019 08:05:21
Сообщений: 440
Рейтинг сообщения: 0
Принцип энкодера, если ты об этом

Цитата:
В связи с тем, что в мире всё сложно
и все процессы в энкодере происходят
на фоне каких-то других.
Из чего следует:
1) Ловим изменения по фазе "А" и "В"
2) Если изменилась "А" проверяем
а) Если фаза "А" не равна фазе "В" то счетчик = счетчик + 1 CW
б) Если фаза "А" равна фазе "В" то счетчик = счетчик - 1 CCW
3) Если изменилась "В" проверяем
а) Если фаза "В" не равна фазе "А" то счетчик = счетчик - 1 CCW
б) Если фаза "В" равна фазе "А" то счетчик = счетчик + 1 CW


прим
CW по часовой
CCW против часовой

Это вы принцип энкодера объясняете.Спасибо.Тут другой вопрос.Почему энкодер работает не там где его пропишут а на всём главном цикле? Аппаратно настроен в таймере.Вот это мне кто нибудь может объяснить.Я вхожу в цикл главныйи вхожу в главное меню.Переключаюсь в 1 настраиваю переменную А и перехожу в 2 и хочу настроить переменную В .И тут я вижу сюрприз.Это то что я настроил.Значения перенеслисть на переменную В.Перехожу в главное меню.И кручу ручку энкодера.И в 1 меню вижу значения поменялись.Вы же спецы.Можете мне объяснить аматору? Почему так на пальчиках.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f4 cmsis энкодер меню lcd16x02
СообщениеДобавлено: Вс сен 20, 2020 15:04:16 
Мучитель микросхем
Аватар пользователя

Карма: 12
Рейтинг сообщений: 17
Зарегистрирован: Ср июн 03, 2009 00:20:21
Сообщений: 440
Откуда: Новороссия ЛНР Рубежное -> РФ Калуга
Рейтинг сообщения: 0
Аппаратно настроен в таймере.
В таймере значит всегда пока таймер не остановлен.

_________________
Политика России будет выглядеть неоднозначной до тех пор, пока не будет решен исход битвы.
Свободу можно завоевать, можно просрать, но высидеть свободу нельзя! ©
Всё, что меня не убивает - делает большую ошибку!
Не зли меня!!! :wink:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f4 cmsis энкодер меню lcd16x02
СообщениеДобавлено: Ср сен 23, 2020 10:41:19 
Сверлит текстолит когтями

Карма: -10
Рейтинг сообщений: 97
Зарегистрирован: Вт авг 15, 2017 10:51:13
Сообщений: 1155
Рейтинг сообщения: 0
Принцип энкодера, если ты об этом

Часто в энкодере ещё и дребезг бывает. Это надо учитывать. Поэтому - в реальных энкодерах так просто не получится.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f4 cmsis энкодер меню lcd16x02
СообщениеДобавлено: Ср сен 23, 2020 12:11:15 
Мучитель микросхем
Аватар пользователя

Карма: 12
Рейтинг сообщений: 17
Зарегистрирован: Ср июн 03, 2009 00:20:21
Сообщений: 440
Откуда: Новороссия ЛНР Рубежное -> РФ Калуга
Рейтинг сообщения: 0
jcxz, у stm32f4 есть "железные" энкодеры в таймерах, замечательно работают, и дребезг отрабатывают на ура.
Похоже товарищ хочет спросить что то другое, но вопрос сформулировать не смог.

_________________
Политика России будет выглядеть неоднозначной до тех пор, пока не будет решен исход битвы.
Свободу можно завоевать, можно просрать, но высидеть свободу нельзя! ©
Всё, что меня не убивает - делает большую ошибку!
Не зли меня!!! :wink:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f4 cmsis энкодер меню lcd16x02
СообщениеДобавлено: Пн сен 28, 2020 16:56:48 
Мучитель микросхем

Карма: -8
Рейтинг сообщений: -23
Зарегистрирован: Вс дек 29, 2019 08:05:21
Сообщений: 440
Рейтинг сообщения: 0
Алгоритм работы энкодера на изменение переменных? Вот что я хотел спросить.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f4 cmsis энкодер меню lcd16x02
СообщениеДобавлено: Пн сен 28, 2020 18:34:35 
Прорезались зубы
Аватар пользователя

Карма: 2
Рейтинг сообщений: 12
Зарегистрирован: Сб янв 09, 2016 15:51:17
Сообщений: 200
Рейтинг сообщения: 0
Алгоритм работы энкодера на изменение переменных?

А ну так это просто.
Сначала инициализация таймера с одним пустым опросом. Потом использовать функцию в том месте - где её значения актуальны. При смене экрана делать один пустой цикл чтения (чтобы начать с нуля).

Код:
int32_t encoder_value (TIM_TypeDef* TIMxxl)
{
    static int32_t past;
    int32_t value;
    value = (TIMxxl->ARR >> 2) - past;
    past = TIMxxl->ARR >> 2;
    return value;
};

_________________
sRtoS


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f4 cmsis энкодер меню lcd16x02
СообщениеДобавлено: Пн сен 28, 2020 20:40:03 
Мучитель микросхем

Карма: -8
Рейтинг сообщений: -23
Зарегистрирован: Вс дек 29, 2019 08:05:21
Сообщений: 440
Рейтинг сообщения: 0
Алгоритм работы энкодера на изменение переменных?

А ну так это просто.
Сначала инициализация таймера с одним пустым опросом. Потом использовать функцию в том месте - где её значения актуальны. При смене экрана делать один пустой цикл чтения (чтобы начать с нуля).

Код:
int32_t encoder_value (TIM_TypeDef* TIMxxl)
{
    static int32_t past;
    int32_t value;
    value = (TIMxxl->ARR >> 2) - past;
    past = TIMxxl->ARR >> 2;
    return value;
};


Добавлено after 3 minutes 6 seconds:
А почему меняется ARR а не TCN ?

Добавлено after 1 hour 13 minutes 1 second:
Как это пустой опрос?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f4 cmsis энкодер меню lcd16x02
СообщениеДобавлено: Пн сен 28, 2020 22:50:48 
Прорезались зубы
Аватар пользователя

Карма: 2
Рейтинг сообщений: 12
Зарегистрирован: Сб янв 09, 2016 15:51:17
Сообщений: 200
Рейтинг сообщения: 0
Там есть несколько счётчиков, но рулить можно только ARR.
В пустом опросе заполняется переменная past, для того чтобы результат функции был корректным.

_________________
sRtoS


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f4 cmsis энкодер меню lcd16x02
СообщениеДобавлено: Вт сен 29, 2020 05:54:03 
Мучитель микросхем

Карма: -8
Рейтинг сообщений: -23
Зарегистрирован: Вс дек 29, 2019 08:05:21
Сообщений: 440
Рейтинг сообщения: 0
Вы хотели скаэать несколько битов в счётчике .А регулировать можно только ARR.А как же выставляются ARR изначально.?И как это всё таки пустой опрос? Приведите любой пример если можете.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f4 cmsis энкодер меню lcd16x02
СообщениеДобавлено: Вт сен 29, 2020 13:18:19 
Прорезались зубы
Аватар пользователя

Карма: 2
Рейтинг сообщений: 12
Зарегистрирован: Сб янв 09, 2016 15:51:17
Сообщений: 200
Рейтинг сообщения: 0
А регулировать можно только ARR.

Извиняюсь, запутался, основной счётчик CNT, а ARR - это его установка.
Код:
void tim4_encoder_int (void){
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN;
    RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;

    gpio_one_pin(zap_gpio.B.pin06.v_af02_tim4_ch1.speed1.pull_up.lock_on);
    gpio_one_pin(zap_gpio.B.pin07.v_af02_tim4_ch2.speed1.pull_up.lock_on);

    TIM4->ARR = 0xFFFF;
    TIM4->PSC = 0;
    TIM4->SMCR = _VAL2FLD(TIM_SMCR_SMS, 3);
    TIM4->CCMR1 = _VAL2FLD(TIM_CCMR1_CC1S, 1) | _VAL2FLD(TIM_CCMR1_CC2S, 1) |
                  _VAL2FLD(TIM_CCMR1_IC1F, 9) | _VAL2FLD(TIM_CCMR1_IC1F, 9);

    TIM4->CCER = TIM_CCER_CC1E | TIM_CCER_CC2E;
    TIM4->CNT = 0;
    TIM4->CR1 |= TIM_CR1_CEN;
};

int32_t encoder_value (void){
    static int32_t past;
    int32_t value, tmp;
    tmp = TIM4->CNT >> 2;
    value = tmp - past;
    past = tmp;
    return value;
};


Функция encoder_value возвращает значение поворота энкодера (если он был). Например +1, или -1. Но когда экранное меню меняется - одно первое чтение функции необходимо игнорировать. Потому что неизвестно сколько времени прошло с момента переключения экранов. Вы можете крутить энкодер в момент когда его значения не используются - в экранной области без использования энкодера. А в момент первого считывания получить 100500 шагов перемещения.

_________________
sRtoS


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f4 cmsis энкодер меню lcd16x02
СообщениеДобавлено: Вт сен 29, 2020 16:52:48 
Мучитель микросхем

Карма: -8
Рейтинг сообщений: -23
Зарегистрирован: Вс дек 29, 2019 08:05:21
Сообщений: 440
Рейтинг сообщения: 0
_VAL2FLD гдето я это видел.Немого я по другому настраиваю счётчик .Но это правильно.Спасибо буду эксперементировать.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 17 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y