打印

唉,这么简单的问题搞这么复杂来忽悠菜鸟……

[复制链接]
25244|182
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
刘前辈|  楼主 | 2011-8-26 10:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 刘前辈 于 2011-8-26 11:07 编辑

#include <iom48.h>
#include <inavr.h>
unsigned int count;
unsigned long sum;
unsigned long error;
unsigned char flag;
#pragma vector = TIMER1_COMPA_vect
__interrupt void my_interrupt_routine(void) //定时中断
{
    count++;        //count = 251~260
   
    if(count > 260)
    {
        count = 251;
    }
   
    flag = 1;
   
}
void tmr1_ini() ////定时中断初始化
{
    TCNT1  = 0x00;
   
    OCR1A  = 80;
    TIMSK1 = 0x02;
   
    TCCR1A = 0x00;
    TCCR1B = 0x09;
}
void main(void)
{
    count = 251;
    sum = 0;
    error = 0;
   
    tmr1_ini();
    __enable_interrupt();
   
    while(sum < 100000)
    {
        if(flag > 0)
        {
            sum++;
            flag = 0;
        }
        
       if(count > 250||CY)         //count = 251~260
        {
            __delay_cycles(2);  //按理一定执行这句话
        }
        else
        {
            error++;            //但实际上有一定的机率会执行这句话
        }
    }
   
   
    while(1)                    //下断点,看error的数值
    {
        __delay_cycles(2);
        __delay_cycles(2);
        __delay_cycles(2);
    }
}


加一个进位测试 || CY 就完了,管它什么中断不中断。
再说了,如果是多人共同完成的软件,你怎么知道别人会在中断里处理count ? 你如果随便把中断关了,别人怎么办?!


、、

相关帖子

沙发
t.jm| | 2011-8-26 11:26 | 只看该作者
不知道要表达什么思想?
遇到有自己认为一定要执行的代码没有执行,一般我都认为是我错了,compiler是不会错的!
大多数情况来说compiler确实也不会错的,没用的东西compiler帮你砍掉何错之有?

使用特权

评论回复
板凳
上官金虹| | 2011-8-26 11:27 | 只看该作者
本帖最后由 上官金虹 于 2011-8-26 11:31 编辑

稀奇事。

刘前辈 专用KEIL,
怎么也用iar??

使用特权

评论回复
地板
ayb_ice| | 2011-8-26 11:30 | 只看该作者
不明白要表达什么

使用特权

评论回复
5
yewuyi| | 2011-8-26 11:33 | 只看该作者
呵呵,确实没弄懂谁忽悠谁!:D


感觉俺被LZ忽悠进来看这个帖子了。;P

使用特权

评论回复
6
刘前辈|  楼主 | 2011-8-26 11:37 | 只看该作者
#48楼 highgear

顶一朝成名

俺发现刘公公前辈只要一听到“os", "信号量”几个词,就会摇身一变成为一只好斗的公**,刘公公前辈对于术语运用纯熟,只是在具体实践和技术理解方面弱些,不能很好的理会楼主从实践中总结出的经验,因此一朝成名大侠不必介怀。


哈哈,刘公公这回玩的是纯粹的裸奔!
所长和几位大侠还在忙着探讨如何用关中断解决这类问题呢,还在学习RTOS如何采用互斥机制的5种方法来解这道题目呢。没想到让咱菜鸟加了2字节语句一小时没到就给解啦。所长用了三年!
      这裸奔高手不但OS玩不过菜鸟,**鼓吹了一辈子裸奔高手,怎么不在昨天、前天,把这个问题解了?说话腰也直一点。还自吹是高手考虑的题目?
    3年前就开始考虑这道题。3年来,所长真是一点长进都没有,反而退步了。如今只能靠嘴皮子评论这个不好,那个不是;自己的东西一点都拿不出来。就这么道题目,还自恃高手?

      所长您老人家慢慢研究,输了一回哲学家就餐就成了心理疾病:“刘公公也就只会玩OS,裸奔还是跟咱差得远……”

       如今裸奔也玩不出来了。



、、

使用特权

评论回复
7
Ryanhsiung| | 2011-8-26 11:51 | 只看该作者
果真是“前辈” 啊

使用特权

评论回复
8
Cortex-M0| | 2011-8-26 11:54 | 只看该作者
呵呵~~~

新鲜事,AVR什么时候也玩起CY进位标记了~~~

使用特权

评论回复
9
原野之狼| | 2011-8-26 12:02 | 只看该作者
呵呵 我知道是咋回事 前辈跟一旧贴给杠上了
请LZ解释一下CY在这里的奥义以及这种做法是否具有通用性?

使用特权

评论回复
10
刘前辈|  楼主 | 2011-8-26 12:07 | 只看该作者

高手不高兴了……

本帖最后由 刘前辈 于 2011-8-26 12:11 编辑

一般来说,如果自己研究了很长时间没有想到的问题,突然有刘前辈比自己先一步想到了,自己肯定特不高兴,肯定对刘前辈横挑鼻子竖挑眼;恨不得把刘XX踩到泥里才好。要不咱给他带个什么帽子,——作风不好,或者反社会什么的……

   不信你看,现在所长之类的高手肯定在下面对LZ的||CY 研究怎么带高帽子呢,……菜鸟都能解,我们高手怎么办……

   慢慢研究,慢慢算计,送各位高手一篇**:
    贾平凹的《孤独地走向未来》。……“有一盘肉……”

、、

使用特权

评论回复
11
Cortex-M0| | 2011-8-26 12:44 | 只看该作者
呵呵 我知道是咋回事 前辈跟一旧贴给杠上了
请LZ解释一下CY在这里的奥义以及这种做法是否具有通用性?
原野之狼 发表于 2011-8-26 12:02


嗨~~~

一声叹息,这个不是问题的问题有啥好争?

尽管俺不懂C,  但从来没犯过这类超低级错误~~~

只是,又有高手将Keil  C51中非C标准的CY标志,用到AVR上来了~~~

无语,漂过~~~

使用特权

评论回复
12
刘前辈|  楼主 | 2011-8-26 12:59 | 只看该作者
本帖最后由 刘前辈 于 2011-8-26 13:22 编辑
#9楼版主
   呵呵 我知道是咋回事 前辈跟一旧贴给杠上了
请LZ解释一下CY在这里的奥义以及这种做法是否具有通用性?


我是用keil C51做的。相信诸位高手不会纠结于这个例题只在gcc下或者什么avr下才有意义,例题的思想是通用的,诸位讨论时都是围绕8位单字节uchar和双字节uint产生的空挡造成的错误而言的,——与具体(8位)CPU无关。

  刘前辈实验早就做了,C51转换程序产生同样的error;我想高手忙着打仗,才不会关心是keil还是avr呢?要不要我把keil 实验贴出来?贴出来谁都不高兴。——都希望刘前辈错了才好,才不关心前辈实验怎么做成功的……。

   CY 怎么了?诸位不会简单的宏代换?CY 愿意用什么符号代换都可以,管你是avr 还是什么?是bit 你就用 || ,是char 你就用 | 。 别忙着给第一挑刺,我们是中国人!
    #define  CY   C    // 专心于算计别人,连基本转换都忘了。

前辈中午饭局上刚碰上一位:“比尔.盖茨什么了不起,Win7 到处是BUG;微软不过是商业的成功,windows 我都比他做得好……”


、、

使用特权

评论回复
13
ayb_ice| | 2011-8-26 13:13 | 只看该作者
最后又要演变成骂战

使用特权

评论回复
14
Cortex-M0| | 2011-8-26 13:34 | 只看该作者
本帖最后由 Cortex-M0 于 2011-8-26 13:39 编辑

顶刘前辈,这句话说的好: "我们是中国人!专心于算计别人,连基本转换都忘了。"    赞一个~~~


俺不懂C,  也不懂汇编,最多只是略为了解一点皮毛~~~

电工们都知道,这个问题太简单啦!  
当MCU响应中断时,先将相关寄存器压栈, 在51中,将ACC, PSW等寄存器压栈,其他MCU也类同,只是相关寄存器名有点不同,如中断中,对变量count执行加1运算,中间有进位,势必将CY置1, 刘前辈的意思俺这菜鸟明白,是希望当中断返回时,执行
   if(count > 250||CY)         //count = 251~260
判断时,只要将中断当中的CY加入,结果一定是正确的!
如不是51, 没有布尔运算,如AVR等MCU, 最多不用bit类型判断,改用char类型判断。

这个想法非常高明,不愧为高手中的高手,才能想得出,俺菜鸟这辈子想破脑袋,都想不出如此高明的用法。

只是,当中断返回时,电工们都知道,先将相关寄存器出栈,  在51中,将ACC, PSW等寄存器出栈,其他MCU也类同,只是相关寄存器名有点不同。

出栈时,由于恢复了原PSW,  那么,中断过程中,CY的变化(置1),  早被丢弃,俺菜鸟实在太笨了,这辈子想破脑袋,都想不出,  在主程序中,到什么地方去找中断过程中的CY进位标志,请论坛的大虾们教教俺,只是别告诉俺,搞个镜像标志暂存之类的,这个和CY进位标志的级别实在相差太远了,并且,当又响应更高级的中断时,这个镜像标志又被刷新了,这个理由也太老土了,搞个新鲜一点的理由,谢谢啦~~~

使用特权

评论回复
15
原野之狼| | 2011-8-26 13:45 | 只看该作者
顶刘前辈,这句话说的好: "我们是中国人!专心于算计别人,连基本转换都忘了。"    赞一个~~~


俺不懂C,  也不懂汇编,最多只是略为了解一点皮毛~~~

电工们都知道,这个问题太简单啦!  
当MCU响应中断时,先将相 ...
Cortex-M0 发表于 2011-8-26 13:34

蓝色部分就是答案,前辈已经说了CY它不是CY~:lol

使用特权

评论回复
16
icecut| | 2011-8-26 13:49 | 只看该作者
这个是问题吗?建议你好好分析一下.

那两个前辈左手画圆右手画方然后说能出错你就信???

count++如果<250,你想想啥原因?如果连个int ++都搞不好,编译器就不用混了.

你那情况是有进位却没加到高位时才出现.你想想这时候中断能退出吗?

使用特权

评论回复
17
yingxuexuan| | 2011-8-26 13:58 | 只看该作者
学习下。

使用特权

评论回复
18
dunxinzhiqiang| | 2011-8-26 14:05 | 只看该作者
学习

使用特权

评论回复
19
liang7143| | 2011-8-26 14:07 | 只看该作者
没文化真可怕,都搭不上话:)

使用特权

评论回复
20
areshan| | 2011-8-26 14:29 | 只看该作者
没看懂,CY哪来的,编译器肯定要报错的!没文化的路过!

使用特权

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

本版积分规则

个人签名:做自己所热爱的,并热爱自己所做的。

24

主题

1038

帖子

4

粉丝