FC2カウンター

現在の訪問者数

現在の閲覧者数:

カレンダー

07 | 2017/08 | 09
- - 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 - -

プロフィール

剣菱P

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

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

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

公開メール kenbishiP@gmail.com

検索フォーム

最新記事

最新コメント

カテゴリ

メールフォーム

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

月別アーカイブ

最新トラックバック

リンク

ブロとも一覧

ブロとも申請フォーム

ランキング

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


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

スポンサーサイト


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

NIOS2奮闘記【22】タイマー割り込み② NIOS2奮闘記【20】アラーム»

コメント

コメントの投稿













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

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


さて、アラームは何とかうまく言ったけど
一秒間隔はちょっと荒すぎる

タイマー割り込みでもっと細かく割り込みをかけたい


ってわけでタイマー割り込みについて調べてみたところ

使うレジスタが判明した
 

STATUSレジスタ
bit名前簡易説明
0TOカウンタが0になると1になるビット
一度1になったらソフトで0にクリアする必要がある
1RUNカウンタ動作中は1になる

CONTROLレジスタ
bit名前簡易説明
0ITO1でIRQ発生 0で発生せず
1CONT1でカウンタ連続動作
0に設定するとカウンタが0になったら終了
2STARTカウンタスタート
3STOPカウンタストップ

PERIODL と PERIODHレジスタ
この16ビットの二つのレジスタ 計32ビットでタイマーのカウント値を設定する

他にもSNAPL SNAPHとうレジスタもあるらしい



カウントダウンしてタイマが0になったらIRQを発生させられるようにすればいいわけだな

おkおk

早速やってみよう


・・・

はて、タイマー用のレジスタってどこにあるんだ?


20120712_163404.jpg

ここを見てみるとタイマーに割り当てられたアドレスは0x00021000~0x0002101fまでか

この範囲でどう割り当てられてるんだろう


そういやPIOとかの出力するときにPIO_0_BASEとか今まで使ってきたけどどこで宣言されてんだ?

と思い調べてみたらsystem.hの中にいた!


#define PIO_0_NAME "/dev/pio_0"
#define PIO_0_TYPE "altera_avalon_pio"
#define PIO_0_BASE 0x00021040
#define PIO_0_SPAN 16
#define PIO_0_DO_TEST_BENCH_WIRING 0
#define PIO_0_DRIVEN_SIM_VALUE 0
#define PIO_0_HAS_TRI 0
#define PIO_0_HAS_OUT 1
#define PIO_0_HAS_IN 0
#define PIO_0_CAPTURE 0
#define PIO_0_DATA_WIDTH 4
#define PIO_0_RESET_VALUE 0
#define PIO_0_EDGE_TYPE "NONE"
#define PIO_0_IRQ_TYPE "NONE"
#define PIO_0_BIT_CLEARING_EDGE_REGISTER 0
#define PIO_0_BIT_MODIFYING_OUTPUT_REGISTER 0
#define PIO_0_FREQ 50000000
#define ALT_MODULE_CLASS_pio_0 altera_avalon_pio


なるほど、ここで値を設定することでSOPC_Builderでアドレス変えてもプログラムで直す必要は無くなるのか

system.hをもうちょっとスクロールしたら今回用があるタイマー関連の設定値もあった

#define TIMER_0_NAME "/dev/timer_0"
#define TIMER_0_TYPE "altera_avalon_timer"
#define TIMER_0_BASE 0x00021000
#define TIMER_0_SPAN 32
#define TIMER_0_IRQ 2
#define TIMER_0_ALWAYS_RUN 0
#define TIMER_0_FIXED_PERIOD 0
#define TIMER_0_SNAPSHOT 1
#define TIMER_0_PERIOD 1
#define TIMER_0_PERIOD_UNITS "ms"
#define TIMER_0_RESET_OUTPUT 0
#define TIMER_0_TIMEOUT_PULSE_OUTPUT 0
#define TIMER_0_LOAD_VALUE 49999
#define TIMER_0_COUNTER_SIZE 32
#define TIMER_0_MULT 0.0010
#define TIMER_0_TICKS_PER_SEC 1000
#define TIMER_0_FREQ 50000000
#define ALT_MODULE_CLASS_timer_0 altera_avalon_timer

うむ、さっき確認したとおりのアドレスだ

あれー、でも各レジスタのアドレスは載ってないのか


注:間違ってるプログラム
#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.h" //タイマー用

#define TIMER_STATUS (*(volatile int*)(TIMER_0_BASE + 0x0000))
#define TIMER_CONTROL (*(volatile int*)(TIMER_0_BASE + 0x0004))
#define TIMER_PERIOD_L (*(volatile int*)(TIMER_0_BASE + 0x0008))
#define TIMER_PERIOD_H (*(volatile int*)(TIMER_0_BASE + 0x000C))
#define TIMER_SNAP_L (*(volatile int*)(TIMER_0_BASE + 0x0010))
#define TIMER_SNAP_H (*(volatile int*)(TIMER_0_BASE + 0x0014))



volatile int n;


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

void Timer_Init(void)
{

    alt_u32 count; 
    alt_irq_register(TIMER_0_IRQ,NULL,Timer_IRQ); 

    count = 50000000 - 1; 
    TIMER_PERIOD_L = count & 0xffff; 
    TIMER_PERIOD_H = (count >> 16) & 0xffff; 
    TIMER_CONTROL = 0x07; 

}


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

    while (1){ 

   }   

    return 0; 
}

とりあえずこんな感じでレジスタの割り当てをしてみた
ネットで調べていたらこんな感じでやってる方がいたので参考にさせていただいた


ためしにこれで実行してみると

20120712_164840.jpg
お、うごい… て… ん??

割り込みは1秒毎にしたつもりなのに、ものすごい速さで割り込まれてる

長くなったのでここまで
スポンサーサイト

NIOS2奮闘記【22】タイマー割り込み② NIOS2奮闘記【20】アラーム»

コメント

コメントの投稿













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


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