メニュー
■試行錯誤編
■試行錯誤編(6/4)
■試行錯誤編(6/20)
■試行錯誤編(6/21)
■解決編(6/25)
■回路図
■ソースファイル
DCC loconetをATMEL AVRでコントロール

■試行錯誤編
とりあえず、OPC_GPONとOPC_GPOFFを繰り返すサンプルソフトから。
AVRの動作クロックは8MHzで、コンパイラは、avr-gcc (WinAVR 20080610) 4.3.0です。
ブレッドボード上に作成。
←クリックすると拡大します。
無駄に電源ランプが明るい(^^;

USBtoLoconetアダプタで通信確認


PC側でモニタできないので、ちゃんとloconetが出力されているのかがわかりません・・・(^^;
オシロスコープが欲しいな。
続く・・・

■試行錯誤編(6/4)
デバックの為に液晶を接続しました。
USBtoLoconetアダプタで通信確認は、プルアップ処理か、ステーションに接続しないとだめ
1)回路図
←クリックすると拡大します。
2)写真
←クリックすると拡大します。
3)ソースファイルのダウンロード
ダウンロード

あれ、mainのループはちゃんと回っているなー。
立ち上げ直後、TxBuf.buf_size が、0xFFからカウントダウンして0x00になるとmain.cのwhile(1)内が
回りだすのが、何かあるのかな。

■試行錯誤編(6/20)
1)chibiegg さんに、サンプルプログラムをUPしていただいて、試してみるが何も起こらず orz
2)AE-UM232Rを接続して、HHD Free Serial Port Monitor でモニタしてみた。
←クリックすると拡大します。
なんだか化けてしまっているが、認識できているものもある。
←クリックすると拡大します。

■試行錯誤編(6/21)
1)原因が良くわからないので大きなブレッドボードに作り直してみた。
←クリックすると拡大します。
乗っかっているのは左上:AE-UM232R、左中:ATtiny2313未使用、中央下:液晶、右上:LocoNet送受信回路、右中:ATtiny2313

2)動きました!、DCS50KのTRACK STATUS LEDがチカチカしました。
うれしかったのでつい・・・テッテッテーに乗せて・・・
人影が写っていましたね。


■解決編(6/25)
OPC_GPON / OPC_GPOFF が、うまく制御できたり出来なかったり不安定な動きをしていました。(掲示板に記載)
オシロスコープを導入して(^^;解決しました。

LoconetTestのアプリケーションでPowerOnしたときの全体の波形と、1bitの拡大です。
←クリックすると拡大します。
本当は立下りと立ち上がりのスレッショルドで見るべきなのですが、わかりにくいので、立下り開始と立ち上がり開始で測定した結果
59.50usデス。
※LocoNetは16600bpsなので、1/16600=60.24us
←クリックすると拡大します。

avrでPowerOnしたときの全体の波形と、1bitの拡大です。
←クリックすると拡大します。
56.00usデス。そのままボーレートを計算すると17857bps・・・早いのかな。
ちなみに、OSCCALの値は0x5dでした。
←クリックすると拡大します。

avrでPowerOnしたときの全体の波形と、1bitの拡大です。
OSCCALの値を0x59にしました。
←クリックすると拡大します。
60.00usデス。ボーレートを計算すると16666bps。
←クリックすると拡大します。

工場出荷状態の内蔵オシレータの校正値では、LocoNetのボーレートが高めになってしまうようです。
OSCCAL値を0x5Dから、0x59 にする事で動作するようになりました。
ちなみに、0x5Cでも、正常に動作しました。
main内に
OSCCAL=0x59;
の一行を追加しました。

ちなみに、0x5Cでも、正常に動作しました。
0x5d 0x5d_zoom(56.00us)
0x5c 0x5c_zoom(57.17us)
0x5b 0x5b_zoom(58.00us)
0x5a 0x5a_zoom(58.67us)
0x59 0x59_zoom(60.00us)


■回路図
←クリックすると拡大します。


■ソースファイル
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "uart.h"
#include "loconet.h"

void delay_ms(uint16_t ms){
    while(ms--){
        _delay_ms(1);
    }
}

ISR(TIMER0_COMPB_vect){
    loconet_timer(800);
}

int main(){

    init_uart(16600);

    //800us割り込み
    OCR0A = 100;
    OCR0B = 50;
    TIMSK |= 0b100; //COMPB割り込み
    TCCR0A = 0b00000010;
    TCCR0B = 0b00000011;
    
    DDRB = 0x01;
    PORTB = 0x00;
    
    sei();

    uint8_t OPC_GPON[] = {0x83};
    uint8_t OPC_GPOFF[] = {0x82};

    while(1){
        PORTB = ~PORTB;
        loconet_send(OPC_GPON,1);
        delay_ms(100);
        PORTB = ~PORTB;
        loconet_send(OPC_GPOFF,1);
        delay_ms(100);
    }

return 0;
}

■ソースファイルのダウンロード
ダウンロード


2009.05.31 初版
2009.06.25 2版