AVRマイコンで100ピンのコネクタ検査工程を開発したい

このQ&Aのポイント
  • AVRマイコンで100ピンのコネクタが両端に付いたケーブルの検査工程を開発したいです。
  • 具体的には、2つの入力ポート(16点、押しボタンSW)のうち、押下されたスイッチが何番目かを8つのLEDで表現したいです。
  • そのために、ATmega8515を使用して、PORTA、PORTBのスイッチを読み取り、PORTCに結果を出力するプログラムを作成したいです。
回答を見る
  • ベストアンサー

AVR マイコンで実現したいことができません。

はじめまして。上記表題で困っております。当方初心者です。宜しくお願いいたします。 環境:AVR STK500,AVR STUDIO4(WinXPSP3)(AVR GCC(c言語)),ATmega8515 /*-------------------------------------------------------------------------------*/ 目的:100ピンのコネクタが両端に付いたケーブルを製造(100ピンはクロスしないストレートと仮定)しており、その検査工程で使う治具を開発したい。 そのテスト段階としてATmega8515(1個)を使い、2つ用意した入力ポート(16点、全て押しボタンSW)の何番目のスイッチが押下されたかを、8点のLEDを使って表現したい。(出力結果を今回はシーケンサに受け渡す予定です) /*-------------------------------------------------------------------------------*/ というものです。 例: ・PORTA,Bを入力とします。 ・PORTCを出力とします。 ・PORTA,BのSWをAの0bitから順に1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16として、 例えば 6が押下されたならば,PORTCで[00000110] 15が押下されたならば,PORTCで[00001111] 13が押下されたならば,PORTCで[00001101] というものをまず作ってみたいのですがどう作っていくのかわかりません。何方かご助言いただけないでしょうか? 以上 宜しくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • koujikuu
  • ベストアンサー率43% (428/992)
回答No.2

portB portA portC 00 01 00 00 02 01 00 04 02 00 08 03 00 10 04 00 20 05 00 40 06 00 80 07 01 00 08 02 00 09 04 00 0A 08 00 0B 10 00 0C 20 00 0D 40 00 0E 80 00 0F をメモリ上にportB,A比較データ portC出力データとして確保して、順番に比較し一致した時のみportCへ出力する

ric-o-sound
質問者

お礼

ご親切にありがとうございます!さっそくやってみます!ありがとうございました!!

その他の回答 (1)

  • koujikuu
  • ベストアンサー率43% (428/992)
回答No.1

複数のスイッチ入力に対応しないなら、16bit入力データ -> 8bit出力データの変換テーブル を使用してはどうですか? 複数のスイッチ入力時はエラーにする必要があります、(テーブルに一致しない時)

ric-o-sound
質問者

補足

ご回答ありがとうございます! 複数のSWが同時に入ることはありませんので仰るとおりだと思います。 ただ、「変換テーブル」とはどういうことなのでしょうか? 初心者で申し訳ございません。

関連するQ&A

  • AVRプログラム 関数から戻ってこない

    AtmelStudio6 で、ATmega64A向けにプログラム行なっているのですが、 すごく、単純なところで困っています。 ICEは、AVR JTAGICE です。 main() のみで処理をさせると普通に動くのですが、関数に飛ばすと飛んだ先の 関数から戻ってこなくなるのです。 ツールかレジスタの設定が不十分なのかもしれません。 -- 問題のプログラム -- #include <avr/io.h> #include <avr/iom64a.h> #include <avr/interrupt.h> #include <util/delay.h> void test(void){ DDRA = 0xC0;//<ここは、実行される }//デバッガで見ると、ここで止まっている。 int main(void) { cli();//この関数はライブラリにあるので戻ってくる test();//この関数から帰ってこない // DDRA = 0xC0; //test();の内容をここに書くと、正常に処理して通過する。 PORTB = 0xFF; //B出力レジスタ DDRB = 0xF7; //B方向レジスタ PORTC = 0xFF; DDRC = 0xDB; while(1) { //TODO:: Please write your application code LEDを点滅させるプログラム <略> } } ------------------------------------------------------- 何方か心当たりのある方は居ないでしょうか?

  • Win AVRでのシリアル通信

    Win AVRにてAtmega8をC++にてコントロールしたいと思っていますが、訳ありまして、TXDポートからシリアル通信をせずに、ほかのポート(具体的にはPort B4)を使ってシリアル通信をしたいと思っています。しかし、私が見たどのサイトでもTXDのシリアルポートから出力したソースしか見つかりませんでした。 すみませんが、どなたか、シリアル通信を任意のポートで行う方法があればご教授願いたいと思います。または、参考になるサイトを教えてください。よろしくお願いします。

  • AVRマイコンでのアップダウンカウンターについて

    以下のプログラムはポートDの6番にタクトスイッチを付けてカウントアップさせるプログラムですが、 ポートDの5番にもう1つタクトスイッチを付けてカウントダウンさせたいのですがどのようにプログラムを 追加したら良いでしょうか? 変更前 #include <avr/io.h> int main( void ) { volatile uint16_t i; uint8_t cnt,s0,s1; cnt=0x0;    /* カウント値の初期値=0 */ s1=0b01000000; /* 最初は押されていない状態をセット */ DDRB=0xff; /* PortBをすべて出力に設定する PortDはデフォルトで入力設定 */ PORTD=0b01000000; /* 入力設定になっているポートにHを書くとプルアップされる */ for (;;) { /* 無限ループ */ PORTB=cnt; /* カウント値ををPortBに出力 */ s0=s1; /* 前回のデータを保存して */ s1=(PIND & 0b01000000); /* ポートBと01000000のandをとるとB6の0/1だけがs1に代入される */ if(s0>s1){ /* 前回=64(off) 今回=0(on)のときswが押されたと判断 */ cnt++; /* カウントをインクリメント */ } } } よろしくお願いします。

  • 割り込みで並列処理

    ATmega168とWinAVRで割り込みのプログラミングをしています。 #include <avr/io.h> #include <avr/interrupt.h> ISR(TIMER1_OVF_vect) { TCNT1 = 65500; PORTC ^= 0x02; } int main() { int i; DDRC = 0x07; PORTC ^= 0x01; TCCR1B = 0x00; TCNT1 = 65500; TIMSK1 = _BV(TOIE1); TCCR1B = 0x05; sei(); while (1) { PORTC ^= 0x04; for(i=0;i=500;i++){} } } 上記のプログラムを組んでみたのですが。while文に入ってfor文に少し入ってからISRの処理が始まるのですが。ISRの処理が終わってから又for文の処理に戻ろうとしません。なのでPORTC0x04の点滅が起こりません。PORTC0x04の点滅もしながらPORTC0x02の点滅もしたいのですがどうすれば良いのでしょうか?

  • avr studio4 について

    #include <avr/io.h> #include "adc.h" #define SENSOR_IR 1 #define SENSOR_PORT PORTC #define SENSOR_DDR DDRC #define LED_PORT PORTD #define LED_DDR DDRD // 点灯パターン 16x8ドット unsigned int pat[]={ //123456789ABCDEFG 0b0011010001011100, 0b0101010001010010, 0b1001010001010010, 0b1001001010011100, 0b1111001010010100, 0b1001001010010100, 0b1001000100010010, 0b1001000100010010 }; int main(void) { #define DOTMAX (16*3) #define THRESHOLD 200 #define SHIFTCNT 50 int adc; int adc_back; int line; char iso; char edge=0; unsigned int cnt; unsigned int cnt_mst; unsigned int bitnum; int turn; ad_init(0); turn=0; iso=0; SENSOR_DDR |= (1<<SENSOR_IR); SENSOR_PORT |= (1<<SENSOR_IR); LED_DDR |= 0xff; turn=10000; while(turn-->0); cnt = 0; cnt_mst = 1; while(1) { bitnum = (DOTMAX * cnt) / cnt_mst; bitnum += iso; bitnum &= 0xf; // bitnum = bitnum mod 16 for(line=0; line<8; line++){ if((1<<bitnum) & pat[line]) LED_PORT |=(1<<line); else LED_PORT &= ~(1<<line); } cnt++; adc_back = adc; adc = ad_get(); if(edge==0) { if(adc < (adc_back-THRESHOLD)) { edge = ~edge; cnt_mst = cnt-(cnt/(DOTMAX*2)); cnt=0; turn++; if(turn >= SHIFTCNT){ turn=0; iso =(iso-1)& 0xf; } } }else{ if(adc > (adc_back+THRESHOLD)) { edge = ~edge; } } } return 0; } と入力してビルドしたところ Build started 5.2.2007 at 02:21:46 avr-gcc -mmcu=atmega168 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=1000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT loopled.o -MF dep/loopled.o.d -c ../loopled.c ../loopled.c: In function 'main': ../loopled.c:87:24: warning: 'adc' may be used uninitialized in this function [-Wmaybe-uninitialized] avr-gcc -mmcu=atmega168 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=1000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT adc.o -MF dep/adc.o.d -c ../adc.c avr-gcc -mmcu=atmega168 -Wl,-Map=loopled.map loopled.o adc.o -o loopled.elf avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature loopled.elf loopled.hex avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O ihex loopled.elf loopled.eep || exit 0 avr-objdump -h -S loopled.elf > loopled.lss AVR Memory Usage ---------------- Device: atmega168 Program: 526 bytes (3.2% Full) (.text + .data + .bootloader) Data: 16 bytes (1.6% Full) (.data + .bss + .noinit) Build succeeded with 1 Warnings... とでてきました どうすればビルドできますか?

  • PICマイコンで、ピンが足りません。

    PICでちょっとした電子工作をしています。 18pinのPICを使い、スイッチの組み合わせを適宜変更し出力する回路としてを組んでいます。 PortA(8pinを全て入力/全ピンpullup) PortB(8pinを全て出力) スイッチが1~8まであり、例えば1のスイッチが押された場合、3のスイッチが押されたことにして出力するというような、 スイッチの組み合わせを変更する機能を持たせます。 このスイッチの入出力組み合わせを複数持たせることが今回の目的です。 ロータリースイッチを使い8種類の設定ができる用にするとして、割り当て設定用として新たに3ピンが必要です。 ですが、上記のようにPortAB共に全ピン利用しており、単純に割り当てることが出来ません。 これをどうにかして、利用済みのピンと共存させ18pinで済ませることができないでしょうか。 スイッチの組み合わせは、PIC起動したら変更されることがありません。 ですので、PIC起動時に一度だけロータリースイッチの状態を読めばいいことになります。 なお出力の先につながる回路は、プルアップされたアクティブローの入力端子です。

  • PIC 初歩プログラムについて

    PICの初めてのプログラムを書いたのですがテキストのように動きません。 ORG 0 ; MAIN  BSF STATUS,RP0 MOVLW B'00000000' ;ポートB 出力 MOVWF TRISB ; MOVLW B'00001111' ;ポートA 0,1,2,3入力 MOVWF TRISA ; BCF STATUS,RP0 SW BTFSS PORTA,0 GOTO  LED1 BTFSS PORTA,1 GOTO LED2 GOTO SW LED1 MOVLW B'00000010' MOVWF PORTB GOTO SW LED2 MOVLW B'00000001' MOVWF PORTB GOTO SW END 入力SWを押していないときがHIです。したがって何もしなければSWのループになると思うのですが、LED2に行ってしまいます。BTFSC POARTA,1とすればSWループ状態ですがテキストとは違います。 何かおかしいのでしょうか?

  • C言語(PIC関連ですが・・・)

    センサーが接続されたPICマイコンでDCモータを制御する際に、前のセンサーと次のセンサーの間隔が長く、DCモータが停止してしまうので、前のセンサーの信号を次のセンサーの信号が入力されるまで保持されるようなプログラムを作りたいのですが、どのようなプログラムにしたらよいでしょうか・・・ ちなみに、下が試作プログラムの一部です。 if(b== 0x39) //センサ1が入力されたとき { PORTA = 0b00000010; Delay_ms(1); PORTC = 0b00000000; Delay_ms(1); PORTD = 0b00000001; Delay_us(350); PORTD = 0b00000000; Delay_us(300); } if(b== 0x3d) //センサ2が入力されたとき { PORTA = 0b00000001; Delay_ms(1); PORTC = 0b00000000; Delay_ms(1); PORTD = 0b00000001; Delay_us(325); PORTD = 0b00000000; Delay_us(300); }

  • ヤマハの音楽IC、YMZ294について

    電子工作初心者です。 ヤマハのメロディIC YMZ294を使用して楽器を作りたいと思っているのですが、音を出す段階で苦戦しています。 マイコンのB0~B7ポートをYMZ294のD0~D7に、C0~C2ポートをWR,CS,A0に接続していて、YMZ294のRESET端子は常にHiの状態。 マスタークロック周波数は4/6MHzなのか4/8MHzなのか表記がバラバラなので、ひとまず付属の4MHzのオシレータを使っています。 使用しているマイコンはATmega88Pです。 以下のようなプログラムを組んだのですが音が鳴りません。 #include <avr/io.h> void set_data(char address,char data){ PORTC = 0b00000000; PORTB = address; PORTC = 0b00000111; PORTC = 0b00000100; PORTB = data; PORTC = 0b00000111; } int main(void) { DDRB = 0b11111111; DDRC = 0b11111111; PORTB = 0x00; PORTC = 0x00; set_data(0x07,0b00111110); //ミキサ set_data(0x08,0b00001111); //ボリューム set_data(0x00,0b00011100); //周波数1 set_data(0x01,0b00000001); //周波数2 } オシロスコープで見ても波形が表示されないので、スピーカーの問題ではないと思います。 どこか問題点がございましたら教えていただけると幸いです。

  • PICマイコンのI/Oについて教えてください。

    PIC16F1936を使っています。 各ポートをデジタル出力にしLEDを順に点灯させていますが RB0に接続したLEDのみうっすらとしか光りません。 (プログラムで意図したとおり点滅はします。) テスターで電流を計測したところRB0のみほとんど流れていませんでした。 また電源投入時にRB0に接続したLEDだけ一瞬光ります。 PICは初期状態でI/Oは入力になっているので光らないと思うんですが・・・ MPLABX+XC8で開発しています。 以下の切り分けを行いました。 ・LED単体での点灯:正常点灯 ・他のLEDをRB0に接続:現象再現 ・他のブレットボードで作動:現象再現 データシートとかなり睨めっこしたんですがそれっぽい部分がみつかりません ご教示いただけると助かります。 ソースは以下のとおりです。 #include <xc.h> #pragma config CLKOUTEN = OFF,\ WDTE = OFF,\ PWRTE = ON,\ CP = OFF,\ BOREN = OFF,\ FCMEN = OFF,\ MCLRE = ON,\ CPD = OFF,\ IESO = OFF,\ FOSC = INTOSC,\ STVREN = OFF,\ BORV = LO,\ LVP = OFF,\ VCAPEN = OFF,\ WRT = OFF,\ PLLEN = ON #define uchar unsigned char #define uint unsigned int void init(void){ //ポート初期化 PORTA = 0b00000000; PORTB = 0b00000000; PORTC = 0b00000000; PORTE = 0b00000000; TRISA = 0b00000000; TRISB = 0b00000000; TRISC = 0b00000000; TRISE = 0b00000000; //全てデジタル ANSELA = 0b00000000; ANSELB = 0b00000000; //8mhz OSCCON = 0b11110000; OPTION_REG = 0b00000000; APFCON = 0; WPUE = 0; } void Wait(unsigned int num){ for (int i=0 ; i<num ; ++i) { for( int j = 0; j < 100; ++j){ NOP(); } } } void main(void){ init(); while(1){ PORTC = 0b00000100; Wait(1000); PORTC = 0b00000000; PORTB = 0b00001000; Wait(1000); PORTB = 0b00100000; Wait(1000); PORTB = 0b00000001; Wait(1000); PORTB = 0b00000000; } }