新人求助,关于arduino编程中的sei()-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 13408|回复: 12

[已解决] 新人求助,关于arduino编程中的sei()

[复制链接]
发表于 2014-4-20 17:37 | 显示全部楼层 |阅读模式
大四毕设要用simulink进行arduino控制电机的仿真,学长的arduino中的一段程序,如图一直编译不过,我个人认为sei()函数只是中断函数,改变函数名sei没什么影响,但好像并非如此,学长的程序好像也不是用arduino1.0编译的,求助各路大神。
捕获.JPG
发表于 2014-4-20 18:09 | 显示全部楼层
把代码发上来,sei改变名称,中断函数也要改成一样,是没有问题的。
发表于 2014-4-20 18:22 | 显示全部楼层
把代码发上来,sei改变名称,中断函数也要改成一样,是没有问题的。
 楼主| 发表于 2014-4-20 18:48 | 显示全部楼层
[mw_shl_code=c,true]int divider[6] = {0, 1, 8, 64, 256, 1024};
int prescaler = 5;
double count = 0;

ISR(TIMER1_OVF_vect)
{   
if (prescaler < 4)   
{        
prescaler++;   
}
}

void sei()                     
{        
count = TCNT1;      
TCNT1 = 0x000;      
TCCR1B = prescaler;   
attachInterrupt(0, sei, FALLING);   
}   

void setup()                     
{   
Serial.begin(115200);
TIMSK1 = 0x01;   
TCCR1A = 0x00;  attachInterrupt(0,sei, RISING);
}
void loop()
{
static int  s   = -1;   
static int  pin = 13;
static int setpoint;  
static double kp=6.2, ki=4.7;
int  val =  0;         
int  agv =  0;         
int  dgv =  0;   
double rad = 16000000.0*60/ 334 / divider[prescaler] / count;
unsigned long lastTime;
double errSum, lastErr;
double Output;
int out;
if (Serial.available() >0) {
val = Serial.read();
switch (s)
{
case -1:      
if (val>47 && val<57)
{
s=10*(val-48);
}
else
{
s=-1;
}
break;
case 0:
if (val>98 && val<167)
{
pin=val-97;               
s=1;
}
else
{
s=-1;
}
break;                           
case 1:
if (val>47 && val<50)
{
if (val==48)
{
if((0<=pin)&&(pin<=7))
DDRD&=~(1<<pin);
if((8<=pin)&&(pin<=13))
DDRB&=~(1<<(pin-8));
}
else
{
if((0<=pin)&&(pin<=7))DDRD|=(1<<pin);
if((8<=pin)&&(pin<=13))
DDRB|=(1<<(pin-8));
}
}
s=-1;  
break;
case 10:
if (val>98 && val<167) {
pin=val-97;         
if((0<=pin)&&(pin<=7))
{        
if(PIND&(1<<pin)) dgv=1;
else dgv=0;
}
if((8<=pin)&&(pin<=13))
{        
int pin1;
pin1=pin-8;
if(PINB&(1<<pin1)) dgv=1;
else dgv=0;
}
Serial.println(dgv);      
}
s=-1;  
break;
case 20:
if (val>98 && val<167)
{
pin=val-97;               
s=21;
}
else
{
s=-1;
}
break;
case 21:
if (val>47 && val<50)
{
dgv=val-48;         
if((0<=pin)&&(pin<=7))
{        
if(pin==6) TCCR0A&=~(1<<COM0A1);
if(pin==5) TCCR0A&=~(1<<COM0B1);
if(pin==3) TCCR2A&=~(1<<COM2B1);
DDRD|=(1<<pin);
switch(dgv)
{        
case 1ORTD|=(1<<pin);
break;
case 0ORTD&=~(1<<pin);
break;
}
}
if((8<=pin)&&(pin<=13))
{        
if(pin==11) TCCR2A&=~(1<<COM2A1);
if(pin==9) TCCR1A&=~(1<<COM1A1);
if(pin==10) TCCR1A&=~(1<<COM1B1);
int pin1;
pin1=pin-8;
switch(dgv)
{        
case 1ORTB|=(1<<pin1);
break;
case 0ORTB&=~(1<<pin1);
break;
}
}
}
s=-1;  
break;
case 30:
if (val>96 && val<113)
{
unsigned int low,high;
pin=val-97;               
ADMUX = (1<< 6) | ((pin-1) & 0x07);
        ADCSRA|=(1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|
(1<<ADPS1)|(1<<ADPS0);
while(ADSC==0);
low  = ADCL;
high = ADCH;
agv= (high << 8) | low;
Serial.println(agv);     
}
s=-1;
break;
case 40:
if (val>98 && val<167)
{
pin=val-97;               
s=41;
}
else
{
s=-1;
}
break;
case 41:
{
setpoint = val;
if(pin==6)
{
DDRD|=(1<<pin);
PORTD&=~(1<<pin);
TCCR0A|=(1<<COM0A1)|(1<<WGM00);
TCCR0B|=(1<<CS00);
OCR0A=val;
}
if(pin==5)
{
DDRD|=(1<<pin);
PORTD&=~(1<<pin);
TCCR0A|=(1<<COM0B1)|(1<<WGM00);
TCCR0B|=(1<<CS00);
OCR0B=val;
}
if(pin==3)
{
DDRD|=(1<<pin);
PORTD&=~(1<<pin);
TCCR2A|=(1<<COM2B1)|(1<<WGM00);
TCCR2B|=(1<<CS00);
OCR2B=val;
}
if(pin==11)
{
DDRB|=(1<<3);
PORTB&=~(1<<3);
TCCR2A|=(1<<COM2A1)|(1<<WGM00);
TCCR2B|=(1<<CS00);
OCR2A=val;
}
if(pin==9)
{
DDRB|=(1<<1);
PORTD&=~(1<<1);
TCCR1A|=(1<<COM1A1)|(1<<WGM10);
TCCR1B|=(1<<CS10);
OCR1A=val;
}
if(pin==10)
{
DDRB|=(1<<2);
PORTB&=~(1<<2);
TCCR1A|=(1<<COM1B1)|(1<<WGM10);
TCCR0B|=(1<<CS10);
OCR1B=val;
}
s=-1;
break;
}
case 50:
      
Serial.println(16000000.0*60/ 334 / divider[prescaler] / count);
if (prescaler > 1)   
{        
prescaler--;        
}   
s=-1;     
break;
case 60:
if (val==60)
{
Serial.println(3);
}
s=-1;
break;
case 70:
kp=val-97;
s=-1;
break;
      
case 80:
ki=val-97;
s=-1;
break;
default:
s=-1;
}
}
{
unsigned long now = millis();
double timeChange = (now - lastTime)/1000;
float sampletime = 0.1;
double set = setpoint * 335 / 51;
if( timeChange>= sampletime)
{
double error = set - rad;
errSum +=( ki*error* timeChange);
Output = ( kp * error +  errSum ) * 51 / 335;
out = int(Output);
DDRD|=(1<<3);
PORTD&=~(1<<3);
TCCR2A|=(1<<COM2B1)|(1<<WGM00);
TCCR2B|=(1<<CS00);
OCR2B=out;
lastErr = error;
lastTime = now;
}
}   
}[/mw_shl_code]

代码如上,求大神指点
 楼主| 发表于 2014-4-20 18:50 | 显示全部楼层
改了sei之后好像并不受matlab命令的控制了,不过我不知道是不是学长的源代码错了
 楼主| 发表于 2014-4-20 19:05 | 显示全部楼层
上面的代码无法编译成功,但把所有sei()改为se()之后就能编译了,但不能实现功能
发表于 2014-4-20 20:03 | 显示全部楼层
sei是avrgcc中的定义了的关键字,控制全局中断的,不能作为作为函数名使用,改成其他名字就行了
 楼主| 发表于 2014-4-20 21:01 | 显示全部楼层
谢大神指导,学长原来的程序用的是sei(),他好像不是用arduino1.0编译的,是用main和while(1)代替arduino语言,可以实现matlab对arduino的控制,我不知道他用的是什么编译环境,但在arduino环境中就通过不了,随便改个函数能编译成功,但却不能被matlab控制,这是我最纠结的,不知道该怎么改{:soso_e109:}
 楼主| 发表于 2014-4-20 21:02 | 显示全部楼层
这是学长程序,arduino中通不过
int divider[6] = {0, 1, 8, 64, 256, 1024};
int prescaler = 5;
double count = 0;
ISR(TIMER1_OVF_vect)
{   
if (prescaler < 4)   
{        
prescaler++;   
}
}
void sei()                     
{        
count = TCNT1;      
TCNT1 = 0x000;      
TCCR1B = prescaler;   
attachInterrupt(0, sei, FALLING);   
}   

void main()                     
{   
Serial.begin(115200);
TIMSK1 = 0x01;   
TCCR1A = 0x00;  
attachInterrupt(0,sei, RISING);
}
while(1)
{
static int  s   = -1;   
static int  pin = 13;
static int setpoint;  
static double kp=6.2, ki=4.7;
int  val =  0;         
int  agv =  0;         
int  dgv =  0;   
double rad = 16000000.0*60/ 334 / divider[prescaler] / count;
unsigned long lastTime;
double errSum, lastErr;
double Output;
int out;
if (Serial.available() >0) {
val = Serial.read();
switch (s)
{
case -1:      
if (val>47 && val<57)
{
s=10*(val-48);
}
else
{
s=-1;
}
break;
case 0:
if (val>98 && val<167)
{
pin=val-97;               
s=1;
}
else
{
s=-1;
}
break;                           
case 1:
if (val>47 && val<50)
{
if (val==48)
{
if((0<=pin)&&(pin<=7))
DDRD&=~(1<<pin);
if((8<=pin)&&(pin<=13))
DDRB&=~(1<<(pin-8));
}
else
{
if((0<=pin)&&(pin<=7))DDRD|=(1<<pin);
if((8<=pin)&&(pin<=13))
DDRB|=(1<<(pin-8));
}
}
s=-1;  
break;
case 10:
if (val>98 && val<167) {
pin=val-97;         
if((0<=pin)&&(pin<=7))
{       
if(PIND&(1<<pin)) dgv=1;
else dgv=0;
}
if((8<=pin)&&(pin<=13))
{       
int pin1;
pin1=pin-8;
if(PINB&(1<<pin1)) dgv=1;
else dgv=0;
}
Serial.println(dgv);      
}
s=-1;  
break;
case 20:
if (val>98 && val<167)
{
pin=val-97;               
s=21;
}
else
{
s=-1;
}
break;
case 21:
if (val>47 && val<50)
{
dgv=val-48;         
if((0<=pin)&&(pin<=7))
{       
if(pin==6) TCCR0A&=~(1<<COM0A1);
if(pin==5) TCCR0A&=~(1<<COM0B1);
if(pin==3) TCCR2A&=~(1<<COM2B1);
DDRD|=(1<<pin);
switch(dgv)
{       
case 1ORTD|=(1<<pin);
break;
case 0ORTD&=~(1<<pin);
break;
}
}
if((8<=pin)&&(pin<=13))
{       
if(pin==11) TCCR2A&=~(1<<COM2A1);
if(pin==9) TCCR1A&=~(1<<COM1A1);
if(pin==10) TCCR1A&=~(1<<COM1B1);
int pin1;
pin1=pin-8;
switch(dgv)
{       
case 1ORTB|=(1<<pin1);
break;
case 0ORTB&=~(1<<pin1);
break;
}
}
}
s=-1;  
break;
case 30:
if (val>96 && val<113)
{
unsigned int low,high;
pin=val-97;               
ADMUX = (1<< 6) | ((pin-1) & 0x07);
        ADCSRA|=(1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|
(1<<ADPS1)|(1<<ADPS0);
while(ADSC==0);
low  = ADCL;
high = ADCH;
agv= (high << 8) | low;
Serial.println(agv);     
}
s=-1;
break;
case 40:
if (val>98 && val<167)
{
pin=val-97;               
s=41;
}
else
{
s=-1;
}
break;
case 41:
{
setpoint = val;
if(pin==6)
{
DDRD|=(1<<pin);
PORTD&=~(1<<pin);
TCCR0A|=(1<<COM0A1)|(1<<WGM00);
TCCR0B|=(1<<CS00);
OCR0A=val;
}
if(pin==5)
{
DDRD|=(1<<pin);
PORTD&=~(1<<pin);
TCCR0A|=(1<<COM0B1)|(1<<WGM00);
TCCR0B|=(1<<CS00);
OCR0B=val;
}
if(pin==3)
{
DDRD|=(1<<pin);
PORTD&=~(1<<pin);
TCCR2A|=(1<<COM2B1)|(1<<WGM00);
TCCR2B|=(1<<CS00);
OCR2B=val;
}
if(pin==11)
{
DDRB|=(1<<3);
PORTB&=~(1<<3);
TCCR2A|=(1<<COM2A1)|(1<<WGM00);
TCCR2B|=(1<<CS00);
OCR2A=val;
}
if(pin==9)
{
DDRB|=(1<<1);
PORTD&=~(1<<1);
TCCR1A|=(1<<COM1A1)|(1<<WGM10);
TCCR1B|=(1<<CS10);
OCR1A=val;
}
if(pin==10)
{
DDRB|=(1<<2);
PORTB&=~(1<<2);
TCCR1A|=(1<<COM1B1)|(1<<WGM10);
TCCR0B|=(1<<CS10);
OCR1B=val;
}
s=-1;
break;
}
case 50:
      
Serial.println(16000000.0*60/ 334 / divider[prescaler] / count);
if (prescaler > 1)   
{        
prescaler--;        
}   
s=-1;     
break;
case 60:
if (val==60)
{
Serial.println(3);
}
s=-1;
break;
case 70:
kp=val-97;
s=-1;
break;
      
case 80:
ki=val-97;
s=-1;
break;
default:
s=-1;
}
}
{
unsigned long now = millis();
double timeChange = (now - lastTime)/1000;
float sampletime = 0.1;
double set = setpoint * 335 / 51;
if( timeChange>= sampletime)
{
double error = set - rad;
errSum +=( ki*error* timeChange);
Output = ( kp * error +  errSum ) * 51 / 335;
out = int(Output);
DDRD|=(1<<3);
PORTD&=~(1<<3);
TCCR2A|=(1<<COM2B1)|(1<<WGM00);
TCCR2B|=(1<<CS00);
OCR2B=out;
lastErr = error;
lastTime = now;
}
}   
}


发表于 2014-4-20 21:23 | 显示全部楼层
你好,最近也在学习simulink连接arduino控制,可是连硬件连接都调不通,求助啊! 能讲一下你的连接办法吗?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-5 03:49 , Processed in 0.078858 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表