AVR試用記の掲示板
asm と C言語 - kawana URL
2013/02/02 (Sat) 06:41:25
mikujiさんの質問は、良い例題と思いましたので、勉強する事に
しました。詳細は私のブログで
http://blog.goo.ne.jp/etoy20110830
debugの方法など、理解する事が出来ました。
ありがとうございました。
kumanさんのFC48をATTINY2313で - kawana URL
2013/04/08 (Mon) 21:15:16
kumanさんのFC48をATTINY2313で組んでみた。
FC48はATMEGA48なのでATMEGA168,ATMEGA328でcompileは
問題無くOKになりました。それでは、ATTINY2313ではとCompileしてみました。
ATMEGAは
TIMSK2
TIMSK1
TIMSK0が有りますがATTINY2313は、TIMSKしか有りません。
TIMSK |= _BV(TOIE1)| _BV(TOIE0);とするところ
TIMSK = _BV(TOIE1);
TIMSK = _BV(TOIE0);
こんな誤記をしました。TIMER1,TIMER0のOVF割り込みが掛からないのか、少し悩みました。あわてん坊のダサイなミスの例
ATTINY2313でも動いた。ああ良かった。
37時間で+1秒に調整出来た。 - kawana URL
2013/04/03 (Wed) 19:15:52
kumanさんのStopwatch Programを変更してATTINY2313で
時計を製作し、秒合わせを行ってきた。OSCはInternalRCOSC
8MHzです。毎日、TCNT1=XXXX;を調整してきました。今日
差を確認したら+1秒ほどでした。
F_CPUは 8500000ULに指定していますが、8500XXXのHzの部分もF_CPUに反映されるのでしょうか?変動しているので意味が無いと言えば、意味が無いのですが、
秒の合わせ方ミスしていました。 - kawana URL
2013/03/25 (Mon) 15:13:32
1台のPC で秒調整をしています。
AVRSP>AVRSP -PB1:115200 -d0 clock.hex commmand
opeでcompileで作成されたclock.hexをAVRSP デレクトリに転送して置くのを忘れていました。
(clock.hexが更新されていなかった)
秒の合わせ方 - kawana URL
2013/03/25 (Mon) 09:53:21
TVの時刻表示を見てRESETしていますが、1秒位遅くResetしています。これは、しょうがないとして、毎9分で待ち構え毎10分を見てresetすると比較しやすいのでそうしました。
でも、なかなか+に補正出来ていません。
check と Reset - kawana URL
2013/03/24 (Sun) 07:59:28
正時にresetして、次の正時で差をcheckする様にしました。これでずれているようでは、大きく修正の余地が有ります。
kumanさんの考察に落ち着くと思います。 - kawana URL
2013/03/23 (Sat) 17:57:16
RC OSC CLKOを周波数カウンタで計測してみると、変動しています。
8450123~8650123Hz 200KHzくらい変動しています。
(私の古い周波数カウンタですので信頼性は有りません)
変動幅の中点に設定すると±0仮定して、追い込みが出来るかと
成功性の無い遊び実験と思いやっています。
Re: asm と C言語 - kuman
2013/03/23 (Sat) 14:33:35
16ビットカウンタで調整すると分解能は 65,356分の1ですから1日あたり1.3秒くらいになるのでしょうか。
水晶の精度が約10のマイナス5乗と聞きますからおよそ日差1秒くらいでしょうか。
時計では月差15秒(日差0.5秒)くらいが多いようですね。
RCではいくら合わせても温度変化での差が大きいと思います。
これまでの経験では水晶内臓のタイマーICが最も精度が良いようです。
6時、12時、6時でCheckをすれば - kawana URL
2013/03/23 (Sat) 04:53:39
6時、12時、6時でCheckをすればcheck回数が多くなり
誤差を縮小出来るのではと考えたが?
8万6千4百秒 ±1秒に調整は可能か? - kawana URL
2013/03/22 (Fri) 11:39:24
8万6千4百秒 ±1秒の調整に挑戦しています。
24時間毎にしかズレが確認出来ないので、数日かかりそう。
出来るかな?
どんな物をAVRで製作するか? - kawana URL
2013/03/21 (Thu) 13:37:21
LED6桁の時計は、休み無くCounteUPを続けている。一日は、
何秒なのか?
24x60x60=86400秒/日 8万6千4百秒は、短くも有り、長くも有りか?
LCメ-タ-を作ろう。発振周波数の測定(counteUPと表示の
技術が必要な事が分かる。)
Re: RC OSC 8MHz で1秒調整? - kawana URL
2013/03/18 (Mon) 17:50:55
1秒調整を間違えていた。
TCCR1B=4; // 1/256 clock *************
//TCCR1B=5; // 1/1024 clock
// 8500000/256/1/=33203(1/1 1s ↓)
// TCCR1B=4; 1/256
TCNT1 = 32333; // 65536-33203=32333
秒表示付LED時計の製作 - kawana URL
2013/03/18 (Mon) 12:55:27
Kumanさんの1/100秒Stopwatchから、秒表示付LED時計を製作
してみました。ClockはInternal RC OSCなのであまり正確では無いかも知れません。Chipは、ATTYNY2313.
1秒のTIMER1の設定で詳細理解していないところが有りますが
オシロスコ-プでTIMER1の合わせ込みしました。後で、設定見直をして勉強します。
kumanさんの例題Programは、大変応用が利くProgramに成っていると思います。
感謝、
Re: asm と C言語 - kawana URL
2013/02/22 (Fri) 14:40:54
先駆者が作成したLCD表示のasm Programですが、理解出来ました。それに、2行目にカ-ソルを設定するProgramを追加出来ました。
1行目設定は、lcd_commnd(0x80+colm)
2行目設定は、lcd_commnd(0xC0+colm)でした。
Programを早く作成するコツは、基本命令でまず確認し、それから判断命令を使用し複合化などをすれば良いとおもいました。
参考にしたProgramは
http://
詳細は、私のBlogへ
Re: asm と C言語 - kawana URL
2013/02/21 (Thu) 07:58:35
asmの勉強で、kumanさんの下記asmの勉強は大変役参考に
成りました。感謝致します。
http://www.geocities.jp/kuman2600/o06assembly.html
asmからCへ戻る時の、結果の渡し方、完全に理解出来ていませんが考え方は、理解出来ました。
いろいろやってみた結果、私の遊びProgramでは、asmで組む
必要が無さそうなので一時休止として、acADC.cを完成させたい
と思います。
Re: asm と C言語 - kawana URL
2013/02/18 (Mon) 17:07:24
問題解決と思っていたが、纏めているうちに問題が分かりました。
acADCasm(asm)で結果がZH+ZLが出来るのですが、
C mainに戻ってから、ZH,ZLを利用するには、どうしたら良いでしょうか。
考えている事は
C側
unsigned int ADCr=asmADCasm();
asm側
asm("mov r24, r30"); // ZL
asm("mov r25, r31"); // ZH
asm("ret"); // r0=result
問題解決しないかな、
Re: asm と C言語 - kawana URL
2013/02/13 (Wed) 10:43:32
LCD 表示のasmに取り掛かっています。
下記を参考にしました。
http://homepage2.nifty.com/sfukuda/page064.html
他人が書いたProgramでも自分で一度書いた事が有れば、理解
し易い事は確かですが、
programをcopyして、commentを記述したり、入れ替えたり
していますが、work areaなどの使用commentが無いと理解が
難しく成ります。
分かり易いと言う事は、自分のProgram作成の時間短縮、バグの
折込を少なくする事に繋がると思いました。
asmを参考にしながら、私が書いた(真似した)C Programを
見ながら、asmに変換しています。
それを、見てみると、小さな仕事のブロック化でsubroutineに
している事が分かりました。RCALL命令が多いです。
気が付いた事は、
1.wait routineで、使用Registerをcommentに記述して
例 wait_15ms: ;r19,r20,r21
2.subroutine 使用では、変数の渡し方、結果のmainへの
渡し方をCommentに記述して置くと分かり易いと思いました。
動作確認後、私のblogに書きます。変なasmですが。
Re: asm と C言語 - kawana URL
2013/02/11 (Mon) 12:16:53
人のProgramを見て勉強する時、自分が一番見易い方法で
文字間を空けてTABが揃う様にしています。
RCALLの場合は5chで命令入力後tabします。
LDIの場合は、tab,tabにします。
また、flagのシンボルは文字数を大きくし過ぎない事。
楽しみながら入力修正して行くと同時にProgramを勉強し
理解して行きます。
Re: asm と C言語 - kawana URL
2013/02/11 (Mon) 09:16:58
LED on/offが好きなのでやってみました。最初は基準の
wait_1us作り。
;******** main **********************
MAIN:
LDI W, 0xFF ;1
OUT PORTB, W ;1 PORTB=1
RCALL wait_1us ;3
LDI W, 0 ;1
OUT PORTB, W ;3 PORTB=0
RCALL wait_1us ;3
RJMP MAIN
;---------------------------------------
;wait_1us: ;1.12us NOP ;1 0.125us @8MHz
;8clockで1us
; ret ;4
;---------------------------------------
ret 命令1発で1us?
mainのPORTset&PORTresetを考えると1usと符合した。
Re: asm と C言語 - kawana URL
2013/02/10 (Sun) 17:50:47
次の課題として、asmのLCD表示をやる事にしました。
AT90S2313なのですがATTINY2313でやる事にしました。
CompileはOKでした。
http://www.interline.or.jp/~tomcat/at90s_02.htm
Re: asm と C言語 - kawana URL
2013/02/10 (Sun) 13:29:29
C Programの中にsubroutine ADCをasmで書いてみた。
ADC()
{
asm("sbi 0x1B,1");//PA1=1 for check
asm("nop");//for asm descrition check
asm("ldi r30, 0");//ZL
asm("ldi r31, 0");//ZH
asm("cbi 0x17, 0");//DDRB
asm("sbi 0x18, 0");//PORTB
asm("adiw r30, 1");//ZL
asm("sbis 0x08, 5");//("sbis ACSR, ACO")
asm("rjmp .-2");//("rjmp PC-2")
asm("cbi 0x18, 0");//
asm("sbi 0x17, 0");//
asm("cbi 0x1B,1");//PA1=0 for check
asm("ret");//
}
分かった事
1.I/OのAddressは、0x??で書いた。tn2313def.hを組み込 めば0x18と書かずにPORTBで書けるのか?
2.PC-2は、.-2へ
3.asm("nop");はCompileOKに成る事確認後、一行書いて
compile OKを確認して行くとERROR行が直ぐに分かるでし ょう。
C言語から asmの呼び出しと - kuman
2013/02/06 (Wed) 10:12:48
の回答頂いてから、理解するまで4日掛かりました。
でもレベルUPしたのではと、自画自賛しています。
ご指導ありがとうございました。
kumanさんのBlogの纏めに感謝致します。
また、AVRの良き参考資料として入門者から中堅まで
役立っている事を再確認しました。
Re: asm と C言語 - kawana URL
2013/02/10 (Sun) 10:51:49
kumaさんありがとうございました。おかげさまで、
通常のCのsubroutineの様に、suburoutineをasmで
組めば良い事が分かりました。
時間checkしたProgramは、下記です。
/****************************
asm wait_1ms Program
---------------------------*/
wait_1ms()
{
asm("ldi r16,100");
asm("FF1:");
asm("sbi 0x1B,1"); // PA1=1 PA1 ≒ 1ms
asm("nop");
asm("nop");
asm("nop");
asm("nop"); // 1us @1MHz(CKDIV8=1 1/8 clock)
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("cbi 0x1B,1");//PA1=0 10us x100=1000us 1ms
asm("dec r16");
asm("brne FF1");
}
Re: asm と C言語 - kawana URL
2013/02/10 (Sun) 08:23:06
acADC routineの悪いところが分かった。
RoutineをFlow化は下記
充電処理
|<-------|
ADCCNT++ | while(bit_is_clear(ACSR,ACO))
+----------| {
放電処理 ADCCNT++;
| }
ADCCNT++が1回しか行われないので充電処理が継続されないので充電曲線に成らない。
ADCCNT値が1回の分けが分かった。充電曲線を得るためには
充電処理、放電処理の中間処理も見なければ成らない事を
理解した。考え方の狭い事を知らされた感じ。
次は、Cからasmを呼ぶ方法を勉強してみよう。
while(bit_is_clear(ACSR,ACO))は、下記を参照しました
http://www9.plala.or.jp/fsson/NewHP_elc/AVR/Avr_100macroMemo.html
Re: asm と C言語 - kawana URL
2013/02/09 (Sat) 21:51:10
下記でOKに成ったが、
while(bit_is_clear(ACSR,ACO))// ACO bit !1
{
ADCCNT++;
}
明日asmをcheck
Re: asm と C言語 - kawana URL
2013/02/09 (Sat) 11:39:07
動くと思ったが、動かなかった。?
sbis ACSR, ACO ;Analog Comparator Status RegiのACO Analog Comparator Outgが出ない。?
変な事、ADC+1が1回だけ行われている。?
ここのC変換が悪い?
(kumanさん済みません、自慢気で書いては、いないつもりですが。)
EXCEL入力したがリニアが悪い事が分かった。Cの充電電圧と
入力電圧を比較しているので、Clockも重要な事が分かった。
1/8BitをONして1MHzにしたら、入力追従が良く成った。
Re: asm と C言語 - kawana URL
2013/02/09 (Sat) 07:14:55
C言語からasmをcallする方法が理解出来ていないので、asmの
ル-チンをCで書いてみた。CのLCDと組み合わせ、動作を確認
してみます。
Re: asm と C言語 - kawana URL
2013/02/08 (Fri) 20:28:33
All asmのAnalog Comparator ADCは動作しました。
明日、入力電圧とCounter値を書き出し、EXCELでグラフ化を
してみようと思います。表示は、13bitのLED表示なので沢山はプロット出来ません。それからCの充電カ-ブのオシロ波形観測をしてみようと思います。
後、C 言語から asmを呼ぶ方法は、簡単にはいかない事が
分かった。
下記のインラインasmdでは動作していた。
PORTB=0xFF;
asm("NOP");
”
”
は、動作していた。
(NOP32発で2.5usくらい、clock 8/8 1MHz)
asm callは、もう少し、調べてみなくては、ダメな事に
気が付いた。この様な記述が少ないのは何故だろうか?
私の様な素人では、現在のCompilerはかなり高速なasmを吐き出している様に見える。そんなにasmで組む必要が無いと考えた。1週間位考えてだめなら、放り出し。答えが有りそうなところ一つあり。
Re: asm と C言語 - kawana URL
2013/02/07 (Thu) 21:11:44
file name LEDonoffa.asmでasmで記述し、CompileOKに
なりましたので、LEDonoffa.Sで保存し、asmのS fileを
作成しました。後は、asmをCとリンクさせる事だけですね?
Re: asm と C言語 - kawana URL
2013/02/07 (Thu) 20:47:51
C言語のmainからasmのsubroutine( LED_onoff)を呼ぶ
Programを考えて見ました。これならば、目で見て確認出来ると
思いました。教えて頂いた事やってみなくてはとCodeing開始しました。
有るものを利用できるのでCallとreturnの記述の方法を
理解するだけですね。
kumanさんに感謝します。
Re: asm と C言語 - kawana URL
2013/02/07 (Thu) 16:17:20
acADC.asmのHardは空PORTを利用して2^13=8192までLED
表示する事は出来た。
後は、私のBlogへ記述。
ZH+ZLの内容をPORTB,PORTDに表示するSubroutineが
必要だが、未作成。楽しみながら、作成してみよう。
Re: asm と C言語 - kawana URL
2013/02/07 (Thu) 13:39:39
kumanさんのProgramに下記追記してZ Regi.の動きを確認
出来ました。
;-------------------
mINSTchk:
;-------------------
; Write mINST here
;------------------
LDI r16, 0x34
LDI r17, 0x12
MOV ZL, r16
MOV ZH, r17
;------------------
MOV r18, ZL ; ZL=r30
MOV r19, ZH ; ZH=r31
;-----------------
NOP
RJMP mINSTchk
r18に34,r19に12が入っていました。またMOVで良い事が
分かりました。
Re: asm と C言語 - kawana URL
2013/02/07 (Thu) 11:45:05
kumanさんの下記記述を読んでasmの理解がより深まりました。
ありがとうございました。
http://www.geocities.jp/kuman2600/o06assembly.html#14
asmが少し面白く成って来ましたので、AnalogCompratorによるADCを完成するまでやる自信が出来ました。kumanさんの記述
の中に、参考に成る問題解決のヒントが沢山有りました。
kumanさんのProgramを一部変更して、asm命令のCheckをDebugで見る事を考え下記を作成しました。
LEDchk:
;----------------
LDI r16, 0
OUT PORTB, r16
RCALL wait_100ms
LDI r16, 0xFF
OUT PORTB, r16
RCALL wait_100ms
//RJMP LEDchk
;-------------------
mINSTchk:
;-------------------
; Write mINST here
;------------------
LDI r16, 0x55
ST Z, r16
;------------------
NOP
NOP
NOP
RJMP mINSTchk
これによりZ Regi.の動作が理解出来ました。
adiw ZL, 1で加算しているので、ZH+ZLに加算しています。
Re: asm と C言語 - kawana URL
2013/02/07 (Thu) 06:57:11
Z Regi.? 分かりました。
R0 $00
R1 $01
R2 $02
↓
R13 $0D
R14 $0E
R15 $0F
R16 $10
R17 $11
↓
R26 $1A XL
R27 $1B XH
R28 $1C YL
R29 $1D YH
R30 $1E ZL
R31 $1F ZH
Zero Regi. R0と結び付け理解しようとしていました。
ADC変換の結果は8bitでは256分解能しか得られない事は理解
していたが、短絡思考の悪い点で質問してしまった。
ZH+ZLの連結の考えは、どの様に成っているのか、理解する必要が有るな。新しい課題かも。
chanさんはじめ、技術力の高い人の既知の研究で有り、非常に
興味が湧いた。しかし私の技術は先駆者の足元にも及ばない事は
承知して暇つぶしで勉強しているので、難しい事をしていると言う認識は無い。
何故なら先駆者が既に成し遂げた既知の技術で有るからである。
Re: asm と C言語 - kawana URL
2013/02/06 (Wed) 22:21:52
ATTINY2313のAnalog ComparatorでADC変換の練習をしています。言語はADC、mainともasmです。
ADCの結果ZReg.の内容をmainに渡す方法を教えて下さい。
r0で渡せるか?ZRegi.の内容をRegi.移動する必要が有る?
;*********************
acADC:
;---------------------
Ldi ZL, 0 ; Clear counter
Ldi ZH, 0
Cbi DDRB, 0 ; start to charge
Sbi PORTB, 0
adiw ZL, 1 ; wait for Vc reaches Vi
sbis ACSR, ACO
rjmp PC-2
cbi PORTB, 0 ; Discharge capacitor
sbi DDRB, 0
ret ; Z= result
;ACSR(Analog Comparator Control and Status Register)
;ACSR
ACD ACBG ACO ACI ACIE ACIC ACIS1 ACIS0
; +---Analog Comparator Output
Programは
http://www.felix.or.jp/MPU/Exp/ADC/AVR.html
C言語から asmの呼び出しと - kman
2013/02/06 (Wed) 10:12:48
>C言語mainからasm subをcallする記述方法
何回か使ったことがあるのですが、記録を残していません。
アセンブルに成功すれば通常のサブルーチンコールと同じで良いと思います。
下のページのコメントに少し書いていました。
http://www.geocities.jp/kuman2600/o06assembly.html#14
Re: asm と C言語 - kawana URL
2013/02/05 (Tue) 16:45:23
今、asm programの勉強をしています。2つ質問が有ります。
1.asm でWorkAreaをProgram領域とSRAM領域に取る方法が有ると思うのですが、
①program 領域に
ldi r16, 0x01
rjmp xxx
;************************
DD:
.dw 0x01, 0x23------------------1234
D:
.db 0x45 -----------------------------23
②Memory領域に
SRAM STS, LDS目命令でW/R
EEPROM EICR、EECR, EEAR, EEDR命令でAccess
2.C言語からasmをSubroutine Callsるには?
ADCconv()
{
asm ("ldi ZL, 0") ; clear cunter
ldi ZH, 0 ;
cbi DDRB, 0 ;start to chage
sbi PORTB, 0 ;
adiw ZL,0 ;wait for Vc reaches
sbis ACSR,AC0 ; <---
ADCCconv();// Sub.Call
rjmp PC-2 ; --->
cbi PORTB, 0 ;Discharge capacitor
sbi DDRB, 0 ;
ret ; Z= result
}
C言語mainからasm subをcallする記述方法を教えて。
Re: 遊びとDebug - kawana URL
2013/02/03 (Sun) 08:42:54
kumanさんのStopwatch programで遊んでみました。
timer1_ovfの時間を変更します。
// 2^16=65536
//---------------------------------------
ISR(TIMER1_OVF_vect) { //timer1_overf.Int.
TCNT1=64286; // 8000000/64/100=1250(1/100sec)
// 65536-1250=64286 each 10ms ↓
// 8000000/64/10/=12500(1/10 100ms ↓)
//TCNT1 = 53036;// 65536-12500=53036 each100ms
//----------ps-s--CNT1---------
// 8000000/128/1/=62500(1/1 1s ↓) ps=1/128
// TCCR?? = ?
// TCNT1=62500;// 62500 each 1s countUP 15536
TCNT1 = 50000; // 遅く補正
ps変更に伴い TCCR1Bのclock selectの変更もする。
TCCR1B=0x05;
*遅く補正し過ぎた。
stopwatch programは、いろいろ変更利用が可能な事が分かります。良い点を、利用しない手は有りません。
この事により自分のスキルアップに繋がって行くと
私は、考えています。
Re: Program 記述の工夫 - kawana URL
2013/02/02 (Sat) 21:03:06
/**********************************
time60.c 60分 stop watch
-----------------------------------
AVR: ATTINY2313
clock: Internal RC OSC 8MHz
Fuse set:
Fuse_L: 0xE4
Fuse_H: 0xDF
Fuse_E: 0xFF
INPUT:
EVENT: TIMER1_over flow interrupt 10ms (1/100 sec)
PA2: AVR RESET
PA1: count start
PA0: count stop
OUTPUT:
PB5-0: LED anode(6 Digits) TR Drive b-10K D6 D5 D4 D3 D2 D1
PB6: count rst
PB7: LED-RED
PD6-0:LED segment gfedcba Direct dp:no
*この様なPortの使用Listを記述して置くと良いでしょう。
変更:
ATTINY2313には、PD7は無いので削除、
DDR:
DDRB: 1111 1111
DDRD: -111 1111
DDRA: ---- -000
Re: kumanさんのStopWatch Program - kawana URL
2013/02/02 (Sat) 20:31:12
kumanさんの 60分StopWatch を製作してみました。すんなりと動作しました。そのはずです。Programをcopyしました。
作成とは言えません。そこで何か仕様変更してみる事を考えました。
LEDを取り付ける事です。
Start Buttonを押すと--赤LED点灯
Stop Buttonを押すと--緑LED点灯
Reset Buttonを押すと--赤、緑LED消灯
これなら、簡単に出来るのですが、
計測中は赤LEDを100msで点滅と成ると少し難しい。
計測loopの中に入れるか、
割り込みで点滅させるか、(少しめんどう、まずは、赤緑LED点灯で行く事にしよう)
この様に、Program入力せずに試せる事は大変有りがたい。
動作しない時は、何故かを直ぐに考える入口に立てる。
kumanさんの親切な記事を見て製作された方(初心者、Programに少し慣れてきた方)の座右の銘的な、資料に成っているからだと思います。
資料、記述を正しく、上手に、利用し理解して行く事が効率的なProgramの学習方法と考えている。
力が付いてきたら、自分でどんなProgramを作成するか、Programの実現構想を考えられる様に成れば、Program作成も
最終段階に来ていると言えると思う。
あらためて、kumanさんの資料纏めに感謝します。
StopWatch Programは下記
http://www.geocities.jp/kuman2600/n7stopw.html