stm32f4 cmsis энкодер меню lcd16x02
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
stm32f4 cmsis энкодер меню lcd16x02
меня интересует энкодер апаратный.Почему я не могу записать в буфер значения разных переменных в разных разделах меню?
- Реклама
Re: stm32f4 cmsis энкодер меню lcd16x02
Вам виднее почему. Проанализируйте код и ответьте на свой вопрос.
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32f4 cmsis энкодер меню lcd16x02
Ну а с Кнопками всё получается.В главном меню энкодер тоже считает?Что не так?
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32f4 cmsis энкодер меню lcd16x02
почему это работает
/*
* 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;
// }
}
}
вернее работает но не так как хотелось бы.Или я принцип энкодера не понимаю.Или вообще баран
/*
* 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 скачиваний
Re: stm32f4 cmsis энкодер меню lcd16x02
Изучите тег форума [сode] и научитесь пользоваться отладчиком.
- Реклама
- Murka
- Мучитель микросхем
- Сообщения: 441
- Зарегистрирован: Ср июн 03, 2009 00:20:21
- Откуда: Новороссия ЛНР Рубежное -> РФ Калуга
- Контактная информация:
Re: stm32f4 cmsis энкодер меню lcd16x02
Принцип энкодера, если ты об этом
В связи с тем, что в мире всё сложно
и все процессы в энкодере происходят
на фоне каких-то других.
Из чего следует:
1) Ловим изменения по фазе "А" и "В"
2) Если изменилась "А" проверяем
а) Если фаза "А" не равна фазе "В" то счетчик = счетчик + 1 CW
б) Если фаза "А" равна фазе "В" то счетчик = счетчик - 1 CCW
3) Если изменилась "В" проверяем
а) Если фаза "В" не равна фазе "А" то счетчик = счетчик - 1 CCW
б) Если фаза "В" равна фазе "А" то счетчик = счетчик + 1 CW
прим
CW по часовой
CCW против часовой
Политика России будет выглядеть неоднозначной до тех пор, пока не будет решен исход битвы.
Свободу можно завоевать, можно просрать, но высидеть свободу нельзя! ©
Всё, что меня не убивает - делает большую ошибку!
Не зли меня!!!
Свободу можно завоевать, можно просрать, но высидеть свободу нельзя! ©
Всё, что меня не убивает - делает большую ошибку!
Не зли меня!!!
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32f4 cmsis энкодер меню lcd16x02
[uquote="Murka",url="/forum/viewtopic.php?p=3892197#p3892197"]Принцип энкодера, если ты об этом
Это вы принцип энкодера объясняете.Спасибо.Тут другой вопрос.Почему энкодер работает не там где его пропишут а на всём главном цикле? Аппаратно настроен в таймере.Вот это мне кто нибудь может объяснить.Я вхожу в цикл главныйи вхожу в главное меню.Переключаюсь в 1 настраиваю переменную А и перехожу в 2 и хочу настроить переменную В .И тут я вижу сюрприз.Это то что я настроил.Значения перенеслисть на переменную В.Перехожу в главное меню.И кручу ручку энкодера.И в 1 меню вижу значения поменялись.Вы же спецы.Можете мне объяснить аматору? Почему так на пальчиках.
[/uquote]В связи с тем, что в мире всё сложно
и все процессы в энкодере происходят
на фоне каких-то других.
Из чего следует:
1) Ловим изменения по фазе "А" и "В"
2) Если изменилась "А" проверяем
а) Если фаза "А" не равна фазе "В" то счетчик = счетчик + 1 CW
б) Если фаза "А" равна фазе "В" то счетчик = счетчик - 1 CCW
3) Если изменилась "В" проверяем
а) Если фаза "В" не равна фазе "А" то счетчик = счетчик - 1 CCW
б) Если фаза "В" равна фазе "А" то счетчик = счетчик + 1 CW
прим
CW по часовой
CCW против часовой
Это вы принцип энкодера объясняете.Спасибо.Тут другой вопрос.Почему энкодер работает не там где его пропишут а на всём главном цикле? Аппаратно настроен в таймере.Вот это мне кто нибудь может объяснить.Я вхожу в цикл главныйи вхожу в главное меню.Переключаюсь в 1 настраиваю переменную А и перехожу в 2 и хочу настроить переменную В .И тут я вижу сюрприз.Это то что я настроил.Значения перенеслисть на переменную В.Перехожу в главное меню.И кручу ручку энкодера.И в 1 меню вижу значения поменялись.Вы же спецы.Можете мне объяснить аматору? Почему так на пальчиках.
- Murka
- Мучитель микросхем
- Сообщения: 441
- Зарегистрирован: Ср июн 03, 2009 00:20:21
- Откуда: Новороссия ЛНР Рубежное -> РФ Калуга
- Контактная информация:
Re: stm32f4 cmsis энкодер меню lcd16x02
[uquote="ivan dimir",url="/forum/viewtopic.php?p=3895008#p3895008"]Аппаратно настроен в таймере.[/uquote]В таймере значит всегда пока таймер не остановлен.
Политика России будет выглядеть неоднозначной до тех пор, пока не будет решен исход битвы.
Свободу можно завоевать, можно просрать, но высидеть свободу нельзя! ©
Всё, что меня не убивает - делает большую ошибку!
Не зли меня!!!
Свободу можно завоевать, можно просрать, но высидеть свободу нельзя! ©
Всё, что меня не убивает - делает большую ошибку!
Не зли меня!!!
Re: stm32f4 cmsis энкодер меню lcd16x02
[uquote="Murka",url="/forum/viewtopic.php?p=3892197#p3892197"]Принцип энкодера, если ты об этом[/uquote]
Часто в энкодере ещё и дребезг бывает. Это надо учитывать. Поэтому - в реальных энкодерах так просто не получится.
Часто в энкодере ещё и дребезг бывает. Это надо учитывать. Поэтому - в реальных энкодерах так просто не получится.
- Murka
- Мучитель микросхем
- Сообщения: 441
- Зарегистрирован: Ср июн 03, 2009 00:20:21
- Откуда: Новороссия ЛНР Рубежное -> РФ Калуга
- Контактная информация:
Re: stm32f4 cmsis энкодер меню lcd16x02
jcxz, у stm32f4 есть "железные" энкодеры в таймерах, замечательно работают, и дребезг отрабатывают на ура.
Похоже товарищ хочет спросить что то другое, но вопрос сформулировать не смог.
Похоже товарищ хочет спросить что то другое, но вопрос сформулировать не смог.
Политика России будет выглядеть неоднозначной до тех пор, пока не будет решен исход битвы.
Свободу можно завоевать, можно просрать, но высидеть свободу нельзя! ©
Всё, что меня не убивает - делает большую ошибку!
Не зли меня!!!
Свободу можно завоевать, можно просрать, но высидеть свободу нельзя! ©
Всё, что меня не убивает - делает большую ошибку!
Не зли меня!!!
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32f4 cmsis энкодер меню lcd16x02
Алгоритм работы энкодера на изменение переменных? Вот что я хотел спросить.
- AVI-crak
- Прорезались зубы
- Сообщения: 202
- Зарегистрирован: Сб янв 09, 2016 15:51:17
- Контактная информация:
Re: stm32f4 cmsis энкодер меню lcd16x02
[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
[uquote="AVI-crak",url="/forum/viewtopic.php?p=3899016#p3899016"][uquote="ivan dimir",url="/forum/viewtopic.php?p=3898958#p3898958"]Алгоритм работы энкодера на изменение переменных?[/uquote]
А ну так это просто.
Сначала инициализация таймера с одним пустым опросом. Потом использовать функцию в том месте - где её значения актуальны. При смене экрана делать один пустой цикл чтения (чтобы начать с нуля).
[/uquote]
Добавлено after 3 minutes 6 seconds:
А почему меняется ARR а не TCN ?
Добавлено after 1 hour 13 minutes 1 second:
Как это пустой опрос?
А ну так это просто.
Сначала инициализация таймера с одним пустым опросом. Потом использовать функцию в том месте - где её значения актуальны. При смене экрана делать один пустой цикл чтения (чтобы начать с нуля).
Код: Выделить всё
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:
Как это пустой опрос?
- AVI-crak
- Прорезались зубы
- Сообщения: 202
- Зарегистрирован: Сб янв 09, 2016 15:51:17
- Контактная информация:
Re: stm32f4 cmsis энкодер меню lcd16x02
Там есть несколько счётчиков, но рулить можно только ARR.
В пустом опросе заполняется переменная past, для того чтобы результат функции был корректным.
В пустом опросе заполняется переменная past, для того чтобы результат функции был корректным.
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32f4 cmsis энкодер меню lcd16x02
Вы хотели скаэать несколько битов в счётчике .А регулировать можно только ARR.А как же выставляются ARR изначально.?И как это всё таки пустой опрос? Приведите любой пример если можете.
- AVI-crak
- Прорезались зубы
- Сообщения: 202
- Зарегистрирован: Сб янв 09, 2016 15:51:17
- Контактная информация:
Re: stm32f4 cmsis энкодер меню lcd16x02
[uquote="ivan dimir",url="/forum/viewtopic.php?p=3899168#p3899168"]А регулировать можно только ARR.[/uquote]
Извиняюсь, запутался, основной счётчик CNT, а ARR - это его установка.
Функция encoder_value возвращает значение поворота энкодера (если он был). Например +1, или -1. Но когда экранное меню меняется - одно первое чтение функции необходимо игнорировать. Потому что неизвестно сколько времени прошло с момента переключения экранов. Вы можете крутить энкодер в момент когда его значения не используются - в экранной области без использования энкодера. А в момент первого считывания получить 100500 шагов перемещения.
Извиняюсь, запутался, основной счётчик 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;
};
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32f4 cmsis энкодер меню lcd16x02
_VAL2FLD гдето я это видел.Немого я по другому настраиваю счётчик .Но это правильно.Спасибо буду эксперементировать.


