打印
[AVR单片机]

求助!atmega64,谢谢啦!

[复制链接]
1840|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
harjol|  楼主 | 2013-5-15 09:19 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
下面的代码用来脉冲计数并输出,串口调试助手总是没有输出,不知道是不是代码的问题,哪位大神可以帮忙看一下是否有问题~~




//ICC-AVR application builder : 2007-9-20 10:30:53
// Target : m64
// Crystal: 8.0000Mhz
#include <iom64v.h>            
#include <macros.h>
#include "head.h"
#define uchar unsigned char      
#define uint unsigned int
#define xtal 8                    
/*********************变量定义*****************************/
/*uchar Start=0,WorkFlag;
uint WorkTime,DisTime,Counter;
uint DisVal;
uint cnt;
uchar Flag,IntFlag,JS=0;
uint tx=10,cx;
uint disx[100];
uchar DisFlag=1,EndFlag,BeginFlag=0;*/
uchar WorkFlag;
uchar Start=0;
uchar EndFlag=0;
uint cnt,WorkTime=0;
uint cx,tx=10;
uint disx[100];
uint address=100;
uint j=0;
/*********************定时器0初始化*****************************/
//TIMER0 initialize - prescale:64
// WGM: Normal
// desired value: 1mSec
// actual value:  1.000mSec (0.0%)
void timer0_init(void)//T/C0,见用户手册P99
{
TCCR0 = 0x00; //stop
ASSR  = 0x00; //set async mode
TCNT0 = 0x83; //set count
OCR0 = 0x7D;// set compare
TCCR0 = 0x04; //start timer
}
/*********************uart0初始化****************************/
void uart0_init()//
{
UCSR0B = 0x00;           //禁止UART发送和接收        
UCSR0A = 0x00;           //倍率U2X=0
UCSR0C = 0x86;           //8位数据位,1位停止位
UBRR0L = 0x2F;           //47,波特率9600
UBRR0H = 0x00;
UCSR0B = 0x98;           //允许UART发送和接收;接收缓冲自动清空,接收允许
}
/**********************初始化端口*****************************/
void port_init(void) //I/O设置,见P62
{
//PORTD = 0xFF;
//DDRD = 0xFE;//外部中断0
PORTE = 0xFF;
DDRE = 0xFF;
DDRE = 0x7E;//UART0,外部中断7
}
/*********************初始化器件************************/
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
timer0_init();
MCUCSR = 0x03;//控制和状态寄存器初始化
EICRA = 0x00;
EICRB = 0x40;//INT7下降沿和上升沿中断
EIMSK  = 0x80;//外部中断7时使能
TIMSK = 0x01; //timer0溢出中断使能
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
//****************************************
void Delay_1ms(void)  //1mS延时子函数
{ uint i;
for(i=1;i<(uint)(xtal*124);i++)
    ;
}
//=============================================
void Delay_nms(uint n)  //n*1mS延时子函数
{
uint i=0;
   while(i<n)
   {Delay_1ms();WDR();
    i++;
   }
}
//***************写EEPROM子函数*****************
void eeprom_write(uint add,uchar dat)
{
while(EECR & (1<<EEWE)); //等待上一次写操作结束
EEAR = add;    //设定地址寄存器和数据寄存器
EEDR = dat;   
EECR |= (1<<EEMWE);     //置位EEMWE
EECR |= (1<<EEWE);     //置位EEWE以启动写操作
}
//****************读EEPROM子函数*******************
uchar eeprom_read(uint add)
{
while(EECR & (1<<EEWE));
EEAR = add;   
EECR |= (1<<EERE); //设置EERE以启动读操作
return EEDR;  //自数据寄存器返回数据
}
void str_send(char *s) //发送字符串子函数
{
while(*s)
{
uart_send(*s);
s++;
}
}
/**********************主函数*****************************/
void main(void)
{ uchar temp,temp1,temp2;
   
    float count,time,x;
//Delay_nms(400);
int runr=1;
init_devices();
WorkFlag=1;


while(1)
{
      
/********************************************/
while(j<101)               //100次循环
{   //WDR();
      
    if(WorkFlag==1)//如果工作标志为1
      {
         count=(float) cnt;
         disx[j]=cnt/2;//保存数据
         WorkFlag=0;WorkTime=0;EndFlag=0;
         Start=0;cnt=0;
         j++;
                              WorkFlag=0;//清工作标志
   }
   else    //否则进行取样
   {     
   do{temp=PINE &0x80 ;
                           //WDR();
   /*JS=1;//等待下降沿后下一次测试
      Counter=0;JS=0;DisFlag=1;cx=0;*/
     }
    while(temp==0x80);
      Start=1;EIMSK=0x80;//重开INT7
   }
  }
  
  for(j=0;j<101;j++)
  {
  eeprom_write((address+j),disx[j]);
  }
  uart0_init();
  str_send("story data is finished");
do{
temp1=uart_receive();
if (temp1=='1')
{
     for(j=0;j<101;j++)
     {
        temp2=eeprom_read((address+j));
     uart_send(temp2);
     
   }
  runr=0;
}
else
{
     str_send("command error,please send the number 1");
}}
while (runr=1);


}   
}
#pragma interrupt_handler timer0_ovf_isr:17
void timer0_ovf_isr(void)
{
TCNT0 = 0x83; // 重新加载定时器值
SEI();
/*if(BeginFlag==1)
  {
   BeginFlag=0;
  // if(DisTime>1300){DisFlag=1;DisTime=0;BeginFlag=0;} //开显示
  }*/
   if(Start==1){WorkTime++;}
   if(WorkTime==tx)
   {EndFlag=1;WorkFlag=1;}
//if(JS==1)Counter++;
   
}
#pragma interrupt_handler int7_isr:9
void int7_isr(void)
{
    uchar y;
    SEI();
//external interupt on INT0
  y=PINE&0x80;
//S=0;Counter=0;
  if((Start==1)&&(y==0x00))cnt++;//输入脉冲下降沿判断
  //**********************
  if((Start==1)&&(y==0x80))//输入脉冲上升沿判断
  {  
     cnt++;
     if(EndFlag==1){ cx=cnt;EndFlag=0;
      Start=0; EIMSK=0x00;}//关闭INT7中断
  }
}

相关帖子

沙发
huangxz| | 2013-5-15 12:14 | 只看该作者
现在icc都用的啥版本的啊?感觉和_谢都有点问题

使用特权

评论回复
板凳
harjol|  楼主 | 2013-5-15 20:47 | 只看该作者
huangxz 发表于 2013-5-15 12:14
现在icc都用的啥版本的啊?感觉和_谢都有点问题

用的iccavr6.31A版本的,今天发现uart0初始化有错误,改成了
/*********************uart0初始化****************************/
void uart0_init()//
{
UCSR0B = 0x00;           //禁止UART发送和接收        
UCSR0A = 0x00;           //倍率U2X=0
UCSR0C = 0x06;           //8位数据位,1位停止位
UBRR0L = 0x33;           //47,波特率9600
UBRR0H = 0x00;
UCSR0B = 0x18;           //允许UART发送和接收;接收缓冲自动清空,接收允许
}
结果烧录完程序后输出了一些数据后就再没有反应了,我是测量电机转速,用光电传感器得到的脉冲波,这段程序是计数并输出,但是我电机怎么转都没有数据。。。

使用特权

评论回复
地板
huangxz| | 2013-5-15 22:46 | 只看该作者
harjol 发表于 2013-5-15 20:47
用的iccavr6.31A版本的,今天发现uart0初始化有错误,改成了
/*********************uart0初始化******** ...

楼主先把你那个浮点给去掉看看,那个别用,avr用不起

使用特权

评论回复
5
harjol|  楼主 | 2013-5-16 09:38 | 只看该作者
huangxz 发表于 2013-5-15 22:46
楼主先把你那个浮点给去掉看看,那个别用,avr用不起

额,哪个浮点啊?主函数中的浮点数吗?我是刚接触这些,不太懂。。。

使用特权

评论回复
6
qin552011373| | 2013-5-16 23:34 | 只看该作者
harjol 发表于 2013-5-16 09:38
额,哪个浮点啊?主函数中的浮点数吗?我是刚接触这些,不太懂。。。

浮点数你不懂?c语言里面的东西呢

使用特权

评论回复
7
harjol|  楼主 | 2013-5-17 10:27 | 只看该作者
qin552011373 发表于 2013-5-16 23:34
浮点数你不懂?c语言里面的东西呢

那long int在avr里能用吗?

使用特权

评论回复
8
huangxz| | 2013-5-17 10:46 | 只看该作者
harjol 发表于 2013-5-17 10:27
那long int在avr里能用吗?

long 和int 都可以用,不知道你说的是不是(long int),如果有疑问,你看看iccavr的手册,因为iccavr我们也没有用,国内大部分用的还是gcc

使用特权

评论回复
9
qin552011373| | 2013-5-17 13:02 | 只看该作者
harjol 发表于 2013-5-17 10:27
那long int在avr里能用吗?

可以用gcc支持long long int   2的64次方的数字

使用特权

评论回复
10
harjol|  楼主 | 2013-5-17 16:36 | 只看该作者
qin552011373 发表于 2013-5-17 13:02
可以用gcc支持long long int   2的64次方的数字

哦,知道了,谢谢版主~

使用特权

评论回复
11
harjol|  楼主 | 2013-5-17 16:45 | 只看该作者
huangxz 发表于 2013-5-17 10:46
long 和int 都可以用,不知道你说的是不是(long int),如果有疑问,你看看iccavr的手册,因为iccavr我们也没 ...

哦,知道了。您能帮我看看代码是否有别的什么错误吗?我烧录好了程序后就会输出“story data is finished”,然后给单片机发送一个数据后,就会输出“command error,please send number 1”,除此之外再没别的输出了。。。

使用特权

评论回复
12
qin552011373| | 2013-5-17 17:12 | 只看该作者
harjol 发表于 2013-5-17 16:36
哦,知道了,谢谢版主~

不用客气

使用特权

评论回复
13
huangxz| | 2013-5-17 17:30 | 只看该作者
qin552011373 发表于 2013-5-17 17:12
不用客气

客气客气,楼上问题还没解决呢,版主帮个忙啊,我没有icc,所以运行效果都看不到啊

使用特权

评论回复
14
qin552011373| | 2013-5-17 23:45 | 只看该作者
huangxz 发表于 2013-5-17 17:30
客气客气,楼上问题还没解决呢,版主帮个忙啊,我没有icc,所以运行效果都看不到啊 ...

iccv8avr_demo.rar (16.5 MB)

使用特权

评论回复
15
qin552011373| | 2013-5-17 23:45 | 只看该作者
huangxz 发表于 2013-5-17 17:30
客气客气,楼上问题还没解决呢,版主帮个忙啊,我没有icc,所以运行效果都看不到啊 ...

上传了一个ICC  你可以用一下

使用特权

评论回复
16
harjol|  楼主 | 2013-5-18 09:40 | 只看该作者
qin552011373 发表于 2013-5-17 23:45
上传了一个ICC  你可以用一下

版主。。。

使用特权

评论回复
17
huangxz| | 2013-5-18 09:43 | 只看该作者
qin552011373 发表于 2013-5-17 23:45
上传了一个ICC  你可以用一下

为啥不带个河....蟹

使用特权

评论回复
18
huangxz| | 2013-5-18 09:48 | 只看该作者
小红伞报病毒

关闭小红伞没法安装

why?

使用特权

评论回复
19
qin552011373| | 2013-5-19 08:54 | 只看该作者
huangxz 发表于 2013-5-18 09:43
为啥不带个河....蟹

我找找

使用特权

评论回复
20
qin552011373| | 2013-5-19 08:55 | 只看该作者
huangxz 发表于 2013-5-18 09:48
小红伞报病毒

关闭小红伞没法安装

我找找其他的版本

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

9

帖子

0

粉丝