FC2カウンター

現在の訪問者数

現在の閲覧者数:

カレンダー

03 | 2017/04 | 05
- - - - - - 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 - - - - - -

プロフィール

剣菱P

Author:剣菱P
剣菱Pと申します。
性別:男
年齢:27
二兎を追って一兎も得られないタイプ

マイコンやプログラミング、ニコニコ動画、雑記等
方向性は見えずとも、ちょっとずつ更新していく予定です!

リンクフリーです。
こんなブログでよかったらよろしくお願いしま~す。

公開メール kenbishiP@gmail.com

検索フォーム

最新記事

最新コメント

カテゴリ

メールフォーム

名前:
メール:
件名:
本文:

月別アーカイブ

最新トラックバック

リンク

ブロとも一覧

ブロとも申請フォーム

ランキング

ランキング参加中です。気が向いたらクリックしてあげてください。


にほんブログ村 その他趣味ブログへ
にほんブログ村 その他趣味ブログ 趣味の工作へ

スポンサーサイト


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

NIOS2奮闘記【23】タイマー割り込み確認 NIOS2奮闘記【21】タイマー割り込み①»

コメント

コメントの投稿













管理者にだけ表示を許可する

NIOS2奮闘記【22】タイマー割り込み②


前回一応割り込みはかかっていたけど

割り込み周期が設定とはまったく違った

PERIODレジスタの値をいろいろ書き換えてもかわらない

実験として1秒毎の割り込みを目指す


いろいろさまよって
インターバルタイマーの設定を見てみると
20120712_171008.jpg

Image2d.jpg
ここの設定値に
Simple periodic interrupt と Full-featuredがある

とりあえずFull-featruedを選択してたけど この違いがよくわからなかったので調べてみると

Simple periodic interrptは周期は固定 タイマーは停止できない
Full-featruedはもっと柔軟に周期も変更できて、開始 停止が出来るみたい

じゃあFull-featrued であってるよなぁ でもうまくいってないからためしにsimple periodic interruptにしてみるか

~実行~

だ、だめだまったく変わらん すごいスピードで割り込みがかかってしまう


またさまよう

ん!?
Image3d.jpg
ここにPERIODの設定って項目があるじゃないか!!

何で気がつかなかったし!

ここが1msになってる、って事はもしかしてここを1sにすればいいのか?

やってみよう(これは勝っただろう)

~実行~

ぬ!! だ、だめだと…  なぜだ

~考え中~

そういや、PIO使うときには参考書籍で載ってた使い方そのまま試しただけだから

レジスタをあまり意識してこなかったけど PIOだって出力用のレジスタに値を渡してるんだよな

PIOを使うときのヘッダファイルは altera_avalon_pio_regs.h か…

ん? regs  これレジスタって事だよね

って事はもしかして

altera_avalon_timer_regs.hってのもある?

確認してみよう…



20120712_172537.jpg
あったーーーーー!!

このマクロ使えばいいのか!!!

早速これに書き換えてみよう


#include <stdio.h>
#include "sys/alt_stdio.h"
#include "system.h" //システム情報
#include "altera_avalon_pio_regs.h"
#include "my_wait.h"
#include "alt_types.h" //変数の型定義
#include "sys/alt_irq.h" //割込み用
#include "altera_avalon_timer_regs.h"

volatile int n = 0;

void Timer_IRQ(void* fpVoid , alt_u32 fID)
{
    printf("TIMER IRQ %d\n",n); 
    n++; 
    IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_0_BASE, 0); 
}

void Timer_Init(void)
{
    alt_u32 count; 
    alt_irq_register(TIMER_0_IRQ,NULL,Timer_IRQ); 

    count = 50000000 - 1; 
    IOWR_ALTERA_AVALON_TIMER_PERIODL(TIMER_0_BASE, count & 0xffff); 
    IOWR_ALTERA_AVALON_TIMER_PERIODH(TIMER_0_BASE, (count >> 16) & 0xffff); 
    IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_0_BASE, 0x07); 
}

int main()
{
    printf("Hello form Nios II\n"); 
    Timer_Init(); 

    while (1){ 

    } 

    return 0; 
}



20120712_173950.jpg
やったぁぁぁぁぁ!! うまくいった一秒くらいずつ割り込み発生してる!!

変数countの値を減らして 割り込みの間隔を短くしてみよう

~実行中~

あれ? 間隔が変わらないぞ…

Image2d.jpg
あ、ここの設定をさっきSimple periodic interruptにして periodを1Sに設定したからか

Simple periodic interruptは周期固定ってことはそのままここで設定したperiodが周期に選択されて
後から変更は受け付けないって事なのかな

Full-featuredに直して周期を書き換えてみよう

~実行中~

おおおおお! countで設定した時間で割り込みがかかってる!!

やっとタイマー割り込みが出来た! 苦戦したなぁwwww

ちなみにクロックが50MHzなので 50000000カウントで1秒

0もカウントするので 50000000 - 1 をcountに入れてる

(で、あってるはず)


最後に気になることがあるからひとつ実験

IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_0_BASE, 0)
割り込みフラグをリセットする一文
これをコメントアウトして実行する

~実行~

あ、やっぱりすごい速さで割り込みがかかるようになってしまった
つまりあの症状はフラグのクリアができていなくて

割り込み関数終了後にまたすぐ割り込み関数が呼び出されていたって事だな

ってことは自分で割り当てたTIMER_STATUSのアドレスが間違っていて

STATUSレジスタをうまくクリアできてなかったって事になるのかな



いろいろ大変だったけど 終わりよければすべてよし!

スポンサーサイト

NIOS2奮闘記【23】タイマー割り込み確認 NIOS2奮闘記【21】タイマー割り込み①»

コメント

コメントの投稿













管理者にだけ表示を許可する


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。