• ベストアンサー

AVR Tudio上記のプログラムをC言語で作成

paspasの回答

  • paspas
  • ベストアンサー率52% (47/90)
回答No.2

アセンブラプログラムをc言語に変換されているのでしょうか? 正しくc言語に変換されていないように思います。 不具合を少なくするためには、まずわかりやすく書くことが大切です。 int main() if (reset ==0)    /* reset=0 7 行目 */ {     の部分 main() { のようにmainあとに{をつけて、関数の中身をはっきりさせる。 /**********            I/Oレジスターの指定 19  *******/ equ sing   =r16  ;    /* $16 Bポー入力ピンパルス信号 20 */ def ddrb   =r17  ;      /* $17 Bポートデータ方向レジスター 21*/ def portb   =r18  ;     /* $18 Bポータレジスタ       22*/ /**********      ホートDとBを初期        23*********/ ser bpoto = $FE ;     /*  Bポート111111110設定  24  */ out ddrb  = bpoto ;                   clr bpoto = $00 ;    /*  出力LED       26  */ out portb = bpoto } ;    /* 初期設定       27 */ この部分も半分アセンブラじゃないのでしょうか? eles if ( reset ==1)      /* reset=1 29     */ これも else ? それ以外にも意味不明点がたくさんあります。 c言語の文法書を再確認されて、再度コードを確認された方がよいと思います。

関連するQ&A

  • 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++; /* カウントをインクリメント */ } } } よろしくお願いします。

  • 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を点滅させるプログラム <略> } } ------------------------------------------------------- 何方か心当たりのある方は居ないでしょうか?

  • AVRマイコン開発

    #include <avr/io.h> int main(void) { volatile long i; PORTB = 0xff; DDRB = 0xff; while(1) { P1NB |= _BV(PB0); for (i = 5000; i > 0; i--); } return 0; } Build failed... No build tools defined. こんなエラーがでたのですがどこが間違っているのでしょうか?

  • C言語のプログラムについてです。

    円を描くプログラムを作りたいのですが、条件としてpointを使わないでつくらなければなりません。あとそのプログラムについての説明もいるので、合わせて回答お願いします。pointを使うと↓のプログラムです。 #include<stdio.h> #include<math.h> int main(void); int main(void) { double point[2][2]; double r; double pi=3.14159; int i; onenpl(); space(-100.0,-100.0,100.0,100.0); printf("円を描きます\n"); printf("半径を入力してください\n"); scanf("%lf",&r); point[0][0]=r*cos(0.0); point[0][1]=r*sin(0.0); for (i=1;i<360;i=i+1) { point[1][0]=r*cos(pi/180.0*i); point[1][1]=r*sin(pi/180.0*i); line(point[0][0],point[0][1],point[1][0],point[1][1]); point[0][0]=point[1][0]; point[0][1]=point[1][1]; } closepl(); return(0); }

  • C言語のプログラムに関することで質問です。

    C言語のライブラリを利用したプログラムのことで質問なのですが、座標xとyの成分から、ベクトルの角度(t)と大きさ(r)を求めるプログラムを作りました。しかし、このままのプログラムだと、ある場合のときに限り、正しい値が返されなくなるらしいのですが、それはどのような場合で正しい値が返されなくなってしまうのかを教えてください。また、正しい値がでるようにするにはどこをどう直したらよいのでしょうか? 自分でも考えてみたのですが、分からず困っています。分かる方どうかよろしくお願いいたします。 #include <stdio.h> #include <stdlib.h> #include <math.h> #define square(x) ((x) * (x)) //ベクトルの角度θを返す関数 double theta(double x, double y) { return atan(y / x); } //ベクトルの大きさを返す関数 double radius(double x, double y) { return sqrt(square(x) + square(y)); } int main(int argc, char **argv) { double x, y; //x, yは座標 double t, r; //t, rは極座標 if(argc == 3 && (x = atof(argv[1])) && (y = atof(argv[2]))) { t = theta(x, y);  //極座標tを計算 r = radius(x, y); //極座標rを計算   //ベクトルの角度と大きさを表示 printf("t = %f, r = %f\n", t, r); } return 0; }

  • Java言語のプログラムをC言語にする場合

    次の2つのJava言語のプログラムをC言語にしたいのですが、C言語でプログラムを書いたことがありません。C言語にする場合はどう書けばいいのでしょうか? import java.io.*; public class Sort { public static void main(String[] args) { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); try{ System.out.println("整数値を入力してください"); String line = reader.readLine(); int a = Integer.parseInt(line); String line2 = reader.readLine(); int b = Integer.parseInt(line2); String line3 = reader.readLine(); int c = Integer.parseInt(line3); String line4 = reader.readLine(); int d = Integer.parseInt(line4); int[] data = {a, b, c, d}; for (int i = 0; i< data.length - 1 ; i++) { for (int j = i + 1; j< data.length; j++) { if(data[i] > data[j]) { int e = data[i]; data[i] = data[j]; data[j] = e; } } } System.out.println("昇順に並べ替えると、"); for (int i = 0; i< data.length; i++) { System.out.print(data[i] + " "); } System.out.println("です。"); } catch (IOException e){ System.out.println(e); } catch (NumberFormatException e) { System.out.println("数式の形式が正しくありません。"); } } } import java.io.*; public class Yakusu { public static void main(String[] args) { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); try{ System.out.println("2つの整数値を入力してください"); System.out.print("整数A : "); String line = reader.readLine(); int a = Integer.parseInt(line); System.out.print("整数B : "); String line2 = reader.readLine(); int b = Integer.parseInt(line2); if(a%b == 0){ System.out.println("BはAの約数です"); } else { System.out.println("BはAの約数ではありません"); } } catch (IOException e){ System.out.println(e); } catch (NumberFormatException e) { System.out.println("数式の形式が正しくありません。"); } } }

  • C言語計算プログラム

    Cの計算プログラム 下のプログラムを (1)上位桁の不要な0を表示しない (2)3つの数を計算できるようにする (3)0が入力されるまでは入力を受け付けて加算を繰り返す プログラムに改造する方法を教えてください。 #include <stdio.h> #define MAXDIGIT 70 void reset(char*,int); void input(char*,int); void add(char*,char*,char*,int); void add_digit(char ,char ,char ,char* ,char* ); void display(char* ,char* ,char* ,int ); void lineprint(char ,char* ,int ); void linedraw(char ,int ); int main(void) { char a[MAXDIGIT],b[MAXDIGIT],c[MAXDIGIT]; reset(a,MAXDIGIT); reset(b,MAXDIGIT); reset(c,MAXDIGIT); input(a,MAXDIGIT); input(b,MAXDIGIT); add(a,b,c,MAXDIGIT); display(a,b,c,MAXDIGIT); return 0;} void reset(char* buf,int maxdigit) { int i; for(i=0;i<maxdigit;i++) buf[i]=0; return;} void input(char* buf,int maxdigit) { char str[MAXDIGIT]; int i,j; printf("input data:"); scanf("%s",str); i=0; while(str[i]!='\0') i++; j=0; while(i>0){ buf[j]=str[i-1]-'0'; j++; i--; } return;} void add(char* a,char* b,char* c,int maxdigit) { int i; char carry_in,carry_out; i=0; carry_in=0; while(i<maxdigit) { add_digit(a[i],b[i],carry_in,&c[i],&carry_out); carry_in=carry_out; i++;} return;} void add_digit(char a,char b,char carry_in,char* c,char* carry_out) { *c=(a+b+carry_in)%10; *carry_out=(a+b+carry_in)/10; return;} void display(char* a,char* b,char* c,int maxdigit) { lineprint(' ',a,maxdigit); lineprint('+',b,maxdigit); linedraw('-',maxdigit+1); lineprint(' ',c,maxdigit); return;} void lineprint(char c,char* line,int maxdigit) { int i,maxdigitlimit; maxdigitlimit=maxdigit-1; printf("%c",c); for(i=maxdigitlimit;i>=0;i--){ printf("%1d",line[i]); } printf("\n"); return;} void linedraw(char c,int length) { int i; for(i=0;i<length;i++) printf("%c",c); printf("\n"); return;}

  • C言語<素数を求めるプログラム>

    #include<stdio.h> int j; int prime(int n) { int i; if(n < 2) return 0; if(n == 2) return 1; if(n%2 == 0) return 0; for(i = 3; i*i<= n; i += 2){ if(n%i == 0) return 0; } return 1; } int main(void) { int n; for(n=1; n <= 1000; n++) { if(prime(n)){ printf("%d\n",n); j++; } } printf("素数の個数は全部で %d 件見つかりました。\n",j); return 0; } このプログラムは1から1000までの素数のみを表示させるプログラムでありますが、このアルゴリズムが全くわかりません。 int prime(int n)の中身のアルゴリズムがどういう仕組みになっているのかお分かりになりますでしょうか?

  • C言語でこのプログラムを完成させるには

    C言語でこのプログラムを完成させるには C言語初心者です。 1~6の乱数を100回発生させて、それぞれの出現回数をカウントし、ヒストグラムとして表示するプログラムを作成したいのですが上手くいきません。 #include <stdio.h> #include <time.h> #include <stdlib.h> int rnd(int m, int n) { return (int)(n-m+1)*(rand()/(RAND_MAX+0.1))+m; } int main(void) { int i, j, r; int hist[7]; for (i=1; i<7; i++) hist[i]=0; srand((unsigned)time(NULL)); for (i=0; i<100; i++) { r=6; while (6-- > 0) putchar('*'); putchar('\n'); } for (i=1; i<7; i++) { printf("%2d:", i); for (j=0; j<hist[i]; j++) printf("*"); printf("\n"); } return 0; } 何がいけないのでしょうか? よろしくお願いします。

  • C言語のプログラム作成について

    ●2つの整数a,bを入力し、aがbより大きいとき、aとbを入れ替える場合、どのようなプログラムを作成すればよいのでしょうか? ●aとbを入れ替えるには、入れ替え作業用の領域tempを使い、次の処理を行う。 a→temp, b→a, temp→b 【プログラム作成例】 a =>10 a=>10 b =>5 b=>20 a=5 b=10 a=10 b=20 上記のような問題の解答は下記のようになるのですが、下記以外の解答方法はありませんでしょうか? C言語に詳しい方、解答の方よろしくお願いします! #include <stdio.h> main() { int a,b,temp; /* データの入力 */ printf("a=>"); scanf("%d",&a); printf("b=>"); scanf("%d",&b); /* a>bのときにデータを入れ替える */ if(a>b){ temp = a; a = b; b = temp; } printf("a=%d b=%d\n",a, b); return (0); }