2011年4月26日火曜日

FPGA FMトランスミッタ: やっぱり Hello world

お約束のHello worldを表示させてみました。




EZ-LCDで文字列を表示させる方法がわからなかったので、ネットで拾ってきたlcd_put_str()をコピペ。一応表示できました。ポインタを使っているようですが、何がどうやって動いているのか理解できていないでいます。

以下、ソースです。Blogシステムの都合で、<avr/io.h>と<util/delay.h>のinclude表示が削除されてしまっているので適宜読み替えて下さい。
なおTLC5925()はバーグラフLEDを光らせるための関数で、この例では0.5秒ごとにぴょこぴょことバーグラフ表示が増えていきます。


#define F_CPU 8.000E6  // マスタクロック8MHz、内蔵オシレータ
#include
#include


void init_mcu(void) {
// ポート設定 0:入力, 1:出力
DDRA = 0xFF;
DDRB = 0xBE;
DDRC = 0xF0;
DDRD = 0x3C;


// 出力ポート初期化
// 入力ポート、1:プルアップ
PORTA = 0x00;
PORTB = 0x00;
PORTC = 0x0F;
PORTD = 0xC0;
}


void TLC5925(uint8_t LEVEL) {
uint16_t k;
int8_t n;


switch(LEVEL){
case 0 : k=0b0000000000000000; break;
case 1 : k=0b0000000100000000; break;
case 2 : k=0b0000001100000000; break;
case 3 : k=0b0000001110000000; break;
case 4 : k=0b0000001111000000; break;
case 5 : k=0b0000001111100000; break;
case 6 : k=0b0000001111110000; break;
case 7 : k=0b0000001111111000; break;
case 8 : k=0b0000001111111100; break;
case 9 : k=0b0000001111111110; break;
case 10 : k=0b0000001111111111; break;
default : k=0b0000000000000000; break;
}


PORTD &= ~_BV(PD3); // CLK -> 0
PORTD |= _BV(PD5); // OE -> 1
PORTD &= ~_BV(PD4); // LE -> 0
PORTD &= ~_BV(PD2); // SDI -> 0


for (n = 15; n >= 0; n--) {


// SDI write
if(k & _BV(n))
PORTD |= _BV(PD2);
else
PORTD &= ~_BV(PD2);


// CLK write
PORTD |= _BV(PD3); // CLK -> 1
PORTD &= ~_BV(PD3); // CLK -> 0


}


// LE write
PORTD |= _BV(PD4); // LE -> 1
PORTD &= ~_BV(PD4); // LE -> 0
// OE write
PORTD &= ~_BV(PD5); // OE -> 0
}




void wait_ms(uint16_t t) {
while (t--) _delay_ms(1); //1ms
}




void lcd_put_str (char *str)
{
while(*str != 0) {
lcd_putc(*str);
str++;
}
}




int main(void) {
static uint8_t n=0;
uint8_t c;


init_mcu();
lcd_init(); // LCDモジュールの初期化


lcd_cursor('CSR_UNDER');
lcd_put_str("Hello world!\nHello world!");
lcd_locate(0,12);


for(;;) {
if (n==11) n=0;
TLC5925(n);
n++;
wait_ms(500);
}
}

0 件のコメント:

コメントを投稿