MSP430キーデバウンス

CPUの動作の典型的なモードは無限ループである呼吸光を導入し、それはLEDを点灯する必要があるかどうかを確認するために停止します。しかし、それは同じことで忙しくしているにも非常に退屈である、あなたが停止し、何か他のもののように乾燥することができ、これは、割り込みの仕事の。

1の効果を示します

buttonjitter

キーが押されたときに作業を中断するのに使用するキーの一例であり、マイクロコントローラは、通常動作中に他のタスクを処理することができます図は、CPUは、交通信号の切り替えをトリガした後、処理タスクに戻るために中断されました。

2、割り込みまともな導入

私は中断を学び始めたとき、最も深い印象の例は、男のようなものは、彼の手の仕事が忙しく、処理文書で中断し、突然デスクの電話が鳴った、と彼は手を停止しなければなりませんでした携帯電話を拾うために働きます。プロセスが電話に答えるために、リーダーはただ、彼は後に、物事を説明忙しいリーダーの最後に簡単な電話を持っていた重要なことに対処するために彼に言いました。正常に完了した後、彼はブックマークフォルダの手が、作業を続けることを見つけるために、事務所に戻りました。

  • 本例の非常に画像が、に取り付けられたマイクロコントローラへの割り込みのように、より柔軟な作業性、作業スケジュールに従って段階として剛性スタッフではなく、柔軟な取り扱い急務を理解していません。
  • 喫緊の課題は、緊急でない電話があり、重要でないタスク、主要人員が必要としている喫緊の課題は、マイクロコントローラの割り込みで、そのようなメカニズムが呼ばれている割り込み優先
  • このもつれたバーストタスク、だけでなく、振り返ると、そのページを見て、手で正確なファイルを見つけることは容易で忙しいと、私たちはブックマークをクリップする必要がある、マークを作り、中に中断と呼ばれる保存場

ここでは、説明しようと簡単には、マイクロコントローラは、職人に訓練されているかを確認する例を理解すること。

2.1,430中断

割り込みであるものの前で言えば、何が良いの割り込みは、それを中断どのようなこのチップMSP430ということでしょうか?多くの人々は、CPUの仕事に嫌がらせをするために来るかのは、最後に430を見てみましょう。

ここでは、チップのデータシートを見始める、データシートは、チップの取扱説明書です。MSP430ファミリは、あまりにも多くのモデルを持っているので、そうではない、すべてが全体を書き込むためにチップ仕様のすべての機能を考えています。:だから、このリンクの指示の合計430 x2xxシリーズがあるMSP430x2xxシリーズ
ユーザーズガイド
:次いで、各チップに固有の、そのような異なるもののメモリサイズなどのハードウェア・インジケータは、これらの指標は、特別仕様、このリンクがありますMSP430G2x53、MSP430G2x13混合信号マイクロコントローラのデータシート(改訂G)をこれらの文書は、公式サイトで発見され、特定のチップモデルの直接検索し、以下をクリックし、いくつかの場所で見つけることができ、中国があるだけでなく、英語では、一般的な英語は、ドキュメントの最新バージョンです。
2553datasheet

次のように2553年のデータシートからは、最初の12関係者はまた、私たちはテーブルの上に一緒に430G2553割り込みソースを置くのに役立ちます。
2553intsource

チップは、力を伝達するリセットし、タイマー、コンパレータ、シリアルIOピンをので、キーが実際にIO割り込みピンP1.3利用され、この例では、割り込みをトリガすることができ、見ることができます。テグレトールがあり、我々はプロパティシールド、いくつかの簡単な理解が中断されているかどうか、あなたはそれを無視するように設定することができますに注意を払う必要があるテーブルが、思わず川や湖、中にいくつかの中断もあり、それが来れば、それがなければなりません。

2.2,430割り込み優先

上記の表は、降順で優先度が最高のものではなく、上から下へ、優れた(デポジット)の前に(AT)レベル(インフルエンザ)を参照します。このテーブルには、心に留めておくためには必要ではありません、我々は存在することは、複数の割り込みを使用したことになる場合は、コードを書く時には、私たちが好きではないお互いに異なる配置間の適切なタイミング関係に注意を払うようなことがあると知っている必要があり、このバック私はOKでその類推ブックマークの話を覚えて、今を忘れるために、紹介する機会を持っています。

2.3、サイト保護の中断

下图是430的一个典型流程图,在430系列文档里有介绍(2553 datasheet不会写)。是不是看着巨麻烦,不用担心,现在没必要搞懂,等到后面有机会讲门电路和寄存器级的代码,我在细细描述下通用的单片机中断处理的机制。讲讲下面这段话究竟在做啥事情。现在先忘掉这些吧,记住我讲的那个书签的比喻就OK啦

  1. 任何当前执行的指令完成。
  2. 指向下一条指令的PC 被压入堆栈。
  3. SR 被压入堆栈。
  4. 如果在最后一个指令执行期间由多个中断出现,那么具有最高优先级的中断被选中并等待被处理。
  5. 在单一源标志上,中断请求标志自动复位。对于软件处理,多个源标志保持被设定。
  6. SR 被清除。这将终止任何低功耗模式。由于GIE 位被清除,之后的中断被禁用。
  7. 中断矢量的内容被载入到PC:程序继续在中断处理例程所处的地址上执行。

430intflow

3、中断的不正经操作

介绍说了这么多,都快忘记了那个开头的图片,那个是怎么做到的,我们来说说。

3.1、代码展示

main.c代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53

#include "common.h"

int (void)
{

WDTCTL = WDTPW + WDTHOLD;
大专栏  MSP430按键消抖ss="comment">// P1.0和P1.6设置为输出,点灯用
P1DIR |= BIT6 + BIT0;
// 启动时6亮
P1OUT |= BIT6;
// 0灭
P1OUT &= ~BIT0;
// P1.3作为输入,接收按键的输入电压
P1DIR &= ~BIT3;
// P1SEL功能选择,0表示IO功能
P1SEL &= ~BIT3;
// 上拉电阻使能,作用我们后面讲模拟部分再说吧
P1REN |= BIT3;
// P1.3允许中断,默认是关的,不开不行
P1IE |= BIT3;
// 中断边沿选择为下降沿,因为上拉电阻存在,按下按键的时候电压从高变成接地的低,所以是下降沿
P1IES |= BIT3;
// 清零中断标记位,IFG(interrupt flag),一个字节,8位,分别对应P1.0 ~1.7
P1IFG = 0;
// 使能全局中断,相当于中断的总开关,所有中断都受这个总开关的限制
_EINT();
while (1)
{
// 这里随便干点啥
}
}

#pragma vector=PORT1_VECTOR
__interrupt void key_inte(void)
{
// 看下中断标志位,是不是1.3产生的,其他引脚产生的也会进来
// 当然这里我们只开了1.3的中断,不会有其他引脚触发进来
if (P1IFG & BIT3)
{
// 延时20毫秒消抖
delay_ms(20);
// 按照消抖原理,延时结束后,再判断P1.3的输入是否还是0电压
if ((P1IN & BIT3) == 0)
{
// 确实是按键按下,交换两等的亮暗状态
P1OUT ^= (BIT6 + BIT0);
}
}

// 不管是哪个脚触发的中断,本次全部清除标记,继续等待下一次中断
P1IFG = 0;
}

common.h代码,使用的时候在工程中新建一个common.h文件,并添加到工程中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*
* common.h
*
* Created on: 2015年6月22日
* Author: xiaoyao
*/

#ifndef COMMON_H_
#define COMMON_H_

#include <msp430g2553.h>

/********************延时*******************************/
#define CPU_F ((double)1000000) //时钟频率0
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))

#endif /* COMMON_H_ */
3.1、代码解释

1、为什么中断后要等20毫秒再判断?
ジッター
如上图所示,机械的按键在按下和弹起时,电压的波动不是理想的立即变低然后变高,而是在变化时伴随着很多抖动和毛刺(有示波器的同学可以看下波形,没有的可以去掉延时这一行然后感受一下效果差异)。这也是本文标题按键消抖的来源。

2、common.h里面的是什么?
个人习惯喜欢在common.h里面封装一些公共的函数和宏定义,这样方便使用,每个工程直接引用就可以了。这里的延时就是。CPU_F是CPU主频率,430默认是1M,所以填1000000,后面如果做其他功能的时候将时钟频率调到16M或者32M或者32768HZ,都记得改一下这里的值,否则延时就不准了。delay_us和delay_ms分别是延时对应的微秒和毫秒。

図3に示すように、上記のコードは、これらの2つのラインの文言、最初の行が固定され、この行は、コンパイラに指示し、次の関数は、オープン割り込み、CPUに直接ジャンプすることを可能にする場合、休憩後ピンP1、P1を調製することです次の機能を実行します。関数名の2行目については、どのようにライン上で自由に限り、__interrupt先行再生します。

#pragmaベクトル= PORT1_VECTOR

__interrupt無効key_inte(無効)

図4は、保護がなぜここに発見されない場面上記の場所が言っていますか?あなたではなく、アセンブラよりもC言語を使用している場合、これらの事のコンパイラは上の最初のポイント以上述べた文言によると、自動的に生成するために、私たちを助けることができるからです。

図5は、トップ裁判官は、このラインがどのように重要なことで何の反応を起こしていない、にステップやすいピット初心者があり、コードを中断しました:

if ((P1IN & BIT3) == 0)

この行は、(P1IN&BIT3 == 0)場合には便利な誰かを書くのは簡単で 、 結果が原因&==よりも優先度が低い、完全に異なっている、コンパイラはまず、BIT3 == 0を決定し、その結果を送信しますP1INと、BIT3は確かに、0に等しい0x00001000ではないので、どのようにファンクションキーは、治療を受けることができます。附属書C言語の演算子の優先順位を以下の表は、トリックは、コードを書くことで、通常はそこにある優先順位を覚えていない場合は、あなたの行動の一つ一つが、上記に加えて、ブラケットなど不確かな置く、これは蛇油操作です。

coperatorpri

S

おすすめ

転載: www.cnblogs.com/sanxiandoupi/p/11710825.html