打印
[AVR单片机]

望TestCode半夜**叫~~~

[复制链接]
楼主: hotpower
手机看帖
扫描二维码
随时随地手机跟帖
21
hotpower|  楼主 | 2007-8-21 01:30 | 只看该作者 回帖奖励 |倒序浏览

interrupt.h

#include "main.h"

#ifdef  __IAR_SYSTEMS_ICC__
#ifndef _SYSTEM_BUILD
#pragma system_include
#endif
#endif

#ifndef __M16_INTERRUPT_H
#define __M16_INTERRUPT_H

#ifdef __cplusplus
extern "C"
{
#endif



#ifdef __cplusplus
}
#endif

#endif//__M16_INTERRUPT_H

使用特权

评论回复
22
hotpower|  楼主 | 2007-8-21 01:34 | 只看该作者

interrupt.cpp(一部分)

#include "interrupt.h"

#pragma vector=INT0_vect
extern "C" __interrupt void Int0ISR(void)
{
    System.EInt0ExecFlag = 1;
}

#pragma vector=INT1_vect
extern "C" __interrupt void Int1ISR(void)
{
    System.EInt1ExecFlag = 1;
}

#pragma vector=USART_UDRE_vect
extern "C" __interrupt void UartTxUDREISR(void)
{
    if (Uart.SendWritePtr != Uart.SendReadPtr) {
        UDR = Uart.SendBuffer[Uart.SendReadPtr ++];
        UCSRB |= (1 << UDRIE);
    }
    else
    {
        UCSRB &= ~(1 << UDRIE);
    }
}

#pragma vector=USART_TXC_vect
extern "C" __interrupt void UartTxISR(void)
{
    if (Uart.SendWritePtr != Uart.SendReadPtr) {
        UDR = Uart.SendBuffer[Uart.SendReadPtr ++];
        UCSRB |= (1 << UDRIE);
    }
}

#pragma vector=ADC_vect
extern "C" __interrupt void AdcISR(void)
{
    Adc.Exec ();
}


#pragma vector=TWI_vect
extern "C" __interrupt void TwiISR(void)
{
    Twi.Exec ();
}

使用特权

评论回复
23
testcode| | 2007-8-21 01:39 | 只看该作者

上面interrupt还是没有整到CPP的类中~~~

使用特权

评论回复
24
hotpower|  楼主 | 2007-8-21 01:42 | 只看该作者

拍个照~~~

使用特权

评论回复
25
hotpower|  楼主 | 2007-8-21 01:46 | 只看该作者

哈哈~~~看得仔细~~~因为全是标准的C中断函数~~~

extern "C" __interrupt void xxxISP(void)
{
//加入各个倒塌的中断处理
}

使用特权

评论回复
26
hotpower|  楼主 | 2007-8-21 01:49 | 只看该作者

timer.h

#include "main.h"

#ifdef  __IAR_SYSTEMS_ICC__
#ifndef _SYSTEM_BUILD
#pragma system_include
#endif
#endif

#ifndef __IARAVR_TIMER_H
#define __IARAVR_TIMER_H

#ifdef __cplusplus
extern "C"
{
#endif

class TimerObj;
class TimerObj
{
private:
public:
    TimerObj(void);
    void Init(void);
    void Timer0Init(void);
    void Timer1Init(void);
    void Timer2Init(void);
public:
    unsigned int Count0;
    unsigned int Count1;
    unsigned int Count2;
};
#ifdef __cplusplus
}
#endif

#endif//__IARAVR_TIMER_H

使用特权

评论回复
27
testcode| | 2007-8-21 01:50 | 只看该作者
28
hotpower|  楼主 | 2007-8-21 01:51 | 只看该作者

timer.cpp

#include "timer.h"

TimerObj::TimerObj (void)
{
    Init ();
}

//inline
void TimerObj::Init(void)
{
    Timer0Init ();
    Timer1Init ();
    SFIOR |= (1 << PSR10);//
    Timer2Init ();
}

//inline
void TimerObj::Timer0Init(void)
{
    Count0 = 0;
    TCNT0 = (unsigned char)(0 - 78); // T/C0 开始值
    TCCR0 = (1 << CS02) | (1 << CS00); // 预分频 ck/1024 ,计数允许
    TIMSK |= (1 << TOIE0);//开中断
}

//inline
void TimerObj::Timer1Init(void)
{
    Count1 = 0;
    TIMSK &= ~(1 << TOIE1);//开中断
}

//inline
void TimerObj::Timer2Init(void)
{
    Count2 = 0;
    TCCR2 = (1 << CS22) | (0 << CS21)  | (1 << CS20); //分频比128,0x05,TCNT2=0
    TCNT2 = 0;
    ASSR  = 1 << AS2; //异步时钟
    TIMSK |= (1 << TOIE2);//开中断
}

使用特权

评论回复
29
hotpower|  楼主 | 2007-8-21 01:54 | 只看该作者

倒塌了~~~上次不是和John_Lee教授用gcc没搞成功吗???

无奈用:
#pragma vector=ADC_vect
extern "C" __interrupt void AdcISR(void)
{
    Adc.Exec ();
}


#pragma vector=TWI_vect
extern "C" __interrupt void TwiISR(void)
{
    Twi.Exec ();
}

使用特权

评论回复
30
testcode| | 2007-8-21 01:59 | 只看该作者

看到一篇介绍,提到

用到virtual inheritance...
有空时再继续努力...

使用特权

评论回复
31
hotpower|  楼主 | 2007-8-21 02:08 | 只看该作者

倒塌了~~~给个virtual inheritance的应用~~~

使用特权

评论回复
32
hotpower|  楼主 | 2007-8-21 02:17 | 只看该作者
33
_21icbbs| | 2007-8-21 08:24 | 只看该作者

请教老师,IARAVR中的启动文件在哪里修改?

能不能讲讲这个启动文件?

使用特权

评论回复
34
micline| | 2007-8-21 08:48 | 只看该作者

8错,应该穿条裤子

使用特权

评论回复
35
双龙| | 2007-8-21 09:25 | 只看该作者

赴某饭局,饭店规定每桌点特价虾只限半斤,我们开玩笑说

要不每人开一桌,点他半斤虾然后拼在一块儿吃。
这里,幸亏楼主在一张桌上吃饭发帖,如果分开了,得送多少条裤子啊。

使用特权

评论回复
36
hotpower|  楼主 | 2007-8-21 18:29 | 只看该作者

望TestCode半夜**叫~~~

估计他那里才天亮~~~

使用特权

评论回复
37
hotpower|  楼主 | 2007-8-22 02:16 | 只看该作者

TestCode上线也不来告诉我如何搞中断???

我未果~~~

使用特权

评论回复
38
testcode| | 2007-8-23 01:06 | 只看该作者

还是未果~~~

玩个倒塌的c++,不考虑代码大小,使用cout输出...
/**************************************************************/
#include <iostream>
#include "Global.h"
#include "Uart.h"

UartObj uart0;

int MyLowLevelPutchar(int x)
{
   uart0.Transmit(x);
   return 0;
}

int MyLowLevelGetchar()
{
  return (uart0.Receive());
}


int main (void)
{
        cout << "Start ";
        while(1);
        return  0;
}

使用特权

评论回复
39
hotpower|  楼主 | 2007-8-23 01:25 | 只看该作者

俺感觉永远不可能实现~~~

成员函数应该和中断函数是有很大区别的.

成员函数几乎和普通C函数一样,都不能成为中断函数.

拿我们最熟悉和最简单的51来分析就知道我们不可能造出永动机来~~~

51的函数(子程序)在汇编中用ret返回,而中断用reti返回.

另外,有许多MCU/ARM/DSP都是进入中断关中断允许标志,而在退出时自动打开中断允许标志.

在汇编中我们会常常用调用中断函数来搞些小动作,而在C/C++中是不允许的~~~

即不能直接调用中断函数,当然就不能将类的成员函数声明为中断函数了~~~

故才有了ARM/DSP/PC等软中断的做法~~~

综合以上原因---俺上次当gcc avr菜鸟时就已死心~~~没想到TestCode还念叨着~~~

使用特权

评论回复
40
hotpower|  楼主 | 2007-8-23 02:19 | 只看该作者

adc.h

#include "main.h"

#ifdef  __IAR_SYSTEMS_ICC__
#ifndef _SYSTEM_BUILD
#pragma system_include
#endif
#endif

#ifndef __M16_ADC_H
#define __M16_ADC_H

#ifdef __cplusplus
extern "C"
{
#endif
class AdcObj;

class AdcObj {//系统采集类
public:
    AdcObj(void);
    void Exec(void);
private:
    void Init(void);
    void SetAdcChNum(unsigned char);//设置ADC通道变换号
    unsigned char GetAdcChNum(unsigned char);//取ADC通道变换号
public:
    unsigned char AdcChNum;
    unsigned char AdcCount[4];
    unsigned int AdcVal[4];
    unsigned int AdcAkVal[4];
    unsigned int AdcSum[4];
    unsigned int AdcMax[4], AdcMin[4];
};

#ifdef __cplusplus
}
#endif

#endif//__M16_ADC_H

使用特权

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

本版积分规则