stm32f4 cmsis энкодер меню lcd16x02

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

stm32f4 cmsis энкодер меню lcd16x02

Сообщение ivan dimir »

меня интересует энкодер апаратный.Почему я не могу записать в буфер значения разных переменных в разных разделах меню?
Реклама
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: stm32f4 cmsis энкодер меню lcd16x02

Сообщение Мурик »

Вам виднее почему. Проанализируйте код и ответьте на свой вопрос.
Реклама
ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

Re: stm32f4 cmsis энкодер меню lcd16x02

Сообщение ivan dimir »

Ну а с Кнопками всё получается.В главном меню энкодер тоже считает?Что не так?
ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

Re: stm32f4 cmsis энкодер меню lcd16x02

Сообщение ivan dimir »

почему это работает
/*
* 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 КБ) 212 скачиваний
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: stm32f4 cmsis энкодер меню lcd16x02

Сообщение Мурик »

Изучите тег форума [сode] и научитесь пользоваться отладчиком.
Реклама
Аватара пользователя
Murka
Мучитель микросхем
Сообщения: 441
Зарегистрирован: Ср июн 03, 2009 00:20:21
Откуда: Новороссия ЛНР Рубежное -> РФ Калуга
Контактная информация:

Re: stm32f4 cmsis энкодер меню lcd16x02

Сообщение Murka »

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


прим
CW по часовой
CCW против часовой
Политика России будет выглядеть неоднозначной до тех пор, пока не будет решен исход битвы.
Свободу можно завоевать, можно просрать, но высидеть свободу нельзя! ©
Всё, что меня не убивает - делает большую ошибку!
Не зли меня!!! :wink:
Реклама
ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

Re: stm32f4 cmsis энкодер меню lcd16x02

Сообщение ivan dimir »

[uquote="Murka",url="/forum/viewtopic.php?p=3892197#p3892197"]Принцип энкодера, если ты об этом
В связи с тем, что в мире всё сложно
и все процессы в энкодере происходят
на фоне каких-то других.
Из чего следует:
1) Ловим изменения по фазе "А" и "В"
2) Если изменилась "А" проверяем
а) Если фаза "А" не равна фазе "В" то счетчик = счетчик + 1 CW
б) Если фаза "А" равна фазе "В" то счетчик = счетчик - 1 CCW
3) Если изменилась "В" проверяем
а) Если фаза "В" не равна фазе "А" то счетчик = счетчик - 1 CCW
б) Если фаза "В" равна фазе "А" то счетчик = счетчик + 1 CW


прим
CW по часовой
CCW против часовой
[/uquote]
Это вы принцип энкодера объясняете.Спасибо.Тут другой вопрос.Почему энкодер работает не там где его пропишут а на всём главном цикле? Аппаратно настроен в таймере.Вот это мне кто нибудь может объяснить.Я вхожу в цикл главныйи вхожу в главное меню.Переключаюсь в 1 настраиваю переменную А и перехожу в 2 и хочу настроить переменную В .И тут я вижу сюрприз.Это то что я настроил.Значения перенеслисть на переменную В.Перехожу в главное меню.И кручу ручку энкодера.И в 1 меню вижу значения поменялись.Вы же спецы.Можете мне объяснить аматору? Почему так на пальчиках.
Аватара пользователя
Murka
Мучитель микросхем
Сообщения: 441
Зарегистрирован: Ср июн 03, 2009 00:20:21
Откуда: Новороссия ЛНР Рубежное -> РФ Калуга
Контактная информация:

Re: stm32f4 cmsis энкодер меню lcd16x02

Сообщение Murka »

[uquote="ivan dimir",url="/forum/viewtopic.php?p=3895008#p3895008"]Аппаратно настроен в таймере.[/uquote]В таймере значит всегда пока таймер не остановлен.
Политика России будет выглядеть неоднозначной до тех пор, пока не будет решен исход битвы.
Свободу можно завоевать, можно просрать, но высидеть свободу нельзя! ©
Всё, что меня не убивает - делает большую ошибку!
Не зли меня!!! :wink:
jcxz
Мудрый кот
Сообщения: 1726
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: stm32f4 cmsis энкодер меню lcd16x02

Сообщение jcxz »

[uquote="Murka",url="/forum/viewtopic.php?p=3892197#p3892197"]Принцип энкодера, если ты об этом[/uquote]
Часто в энкодере ещё и дребезг бывает. Это надо учитывать. Поэтому - в реальных энкодерах так просто не получится.
Аватара пользователя
Murka
Мучитель микросхем
Сообщения: 441
Зарегистрирован: Ср июн 03, 2009 00:20:21
Откуда: Новороссия ЛНР Рубежное -> РФ Калуга
Контактная информация:

Re: stm32f4 cmsis энкодер меню lcd16x02

Сообщение Murka »

jcxz, у stm32f4 есть "железные" энкодеры в таймерах, замечательно работают, и дребезг отрабатывают на ура.
Похоже товарищ хочет спросить что то другое, но вопрос сформулировать не смог.
Политика России будет выглядеть неоднозначной до тех пор, пока не будет решен исход битвы.
Свободу можно завоевать, можно просрать, но высидеть свободу нельзя! ©
Всё, что меня не убивает - делает большую ошибку!
Не зли меня!!! :wink:
ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

Re: stm32f4 cmsis энкодер меню lcd16x02

Сообщение ivan dimir »

Алгоритм работы энкодера на изменение переменных? Вот что я хотел спросить.
Аватара пользователя
AVI-crak
Прорезались зубы
Сообщения: 202
Зарегистрирован: Сб янв 09, 2016 15:51:17
Контактная информация:

Re: stm32f4 cmsis энкодер меню lcd16x02

Сообщение AVI-crak »

[uquote="ivan dimir",url="/forum/viewtopic.php?p=3898958#p3898958"]Алгоритм работы энкодера на изменение переменных?[/uquote]
А ну так это просто.
Сначала инициализация таймера с одним пустым опросом. Потом использовать функцию в том месте - где её значения актуальны. При смене экрана делать один пустой цикл чтения (чтобы начать с нуля).

Код: Выделить всё

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;
};
ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

Re: stm32f4 cmsis энкодер меню lcd16x02

Сообщение ivan dimir »

[uquote="AVI-crak",url="/forum/viewtopic.php?p=3899016#p3899016"][uquote="ivan dimir",url="/forum/viewtopic.php?p=3898958#p3898958"]Алгоритм работы энкодера на изменение переменных?[/uquote]
А ну так это просто.
Сначала инициализация таймера с одним пустым опросом. Потом использовать функцию в том месте - где её значения актуальны. При смене экрана делать один пустой цикл чтения (чтобы начать с нуля).

Код: Выделить всё

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;
};
[/uquote]

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

Добавлено after 1 hour 13 minutes 1 second:
Как это пустой опрос?
Аватара пользователя
AVI-crak
Прорезались зубы
Сообщения: 202
Зарегистрирован: Сб янв 09, 2016 15:51:17
Контактная информация:

Re: stm32f4 cmsis энкодер меню lcd16x02

Сообщение AVI-crak »

Там есть несколько счётчиков, но рулить можно только ARR.
В пустом опросе заполняется переменная past, для того чтобы результат функции был корректным.
ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

Re: stm32f4 cmsis энкодер меню lcd16x02

Сообщение ivan dimir »

Вы хотели скаэать несколько битов в счётчике .А регулировать можно только ARR.А как же выставляются ARR изначально.?И как это всё таки пустой опрос? Приведите любой пример если можете.
Аватара пользователя
AVI-crak
Прорезались зубы
Сообщения: 202
Зарегистрирован: Сб янв 09, 2016 15:51:17
Контактная информация:

Re: stm32f4 cmsis энкодер меню lcd16x02

Сообщение AVI-crak »

[uquote="ivan dimir",url="/forum/viewtopic.php?p=3899168#p3899168"]А регулировать можно только ARR.[/uquote]
Извиняюсь, запутался, основной счётчик 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 шагов перемещения.
ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

Re: stm32f4 cmsis энкодер меню lcd16x02

Сообщение ivan dimir »

_VAL2FLD гдето я это видел.Немого я по другому настраиваю счётчик .Но это правильно.Спасибо буду эксперементировать.
Ответить

Вернуться в «ARM»