AVRマイコン総合スレ Part46
レス数が950を超えています。1000を超えると書き込みができなくなります。
マイコンの取り扱いを一から始めるなら、多分アセンブラの方が簡単じゃね。
IOレジスタについてはどっちでやっても覚えること変わらないし、むしろ何かするのに C ではどう書くことになってるのかを知る必要がある。
アセンブラなら単純にそれをする命令を置くだけで、非常に直感的。
いちいち自前でレジスタ操作しないでありもののライブラリ使っとけということで C を勧めるのは分かるけど、言語は本質じゃない。 開発カンキョー様が整えて用意してくれてた諸々の初期化処理の数々を
いちいち自前で工面する手間を考えると
簡単と言えるのか大いに疑問といわざるをえないんじゃね?しらんけど;^p^) ライブラリ云々なら、別にASMから呼んだってっていいんだから、本質じゃねえわな え~と、いろいろでてますが
最初に出したコード部分については、動いてるコードと一致しましたので
原因は他の部分にあるようです
データシートも見ずにうんたらかんたら言ってる人もいますが
データシートなしにあんなレジスタ名わかんないですからね
的外してますよ マイコンのレジスタを使ってみたい人と
マイコンで何かを動かしたいあるいは処理したい人とでも、何をもって簡単とするかは違ってくるな。
そこを見ないでどっちが簡単と断じることができるのは、自分の観点しかないからだろう。 ごちゃごちゃ言わんでも、普段使ってる物のほうが簡単ってことよ
日本人は日本語、中国人は中国語のほうが簡単にきまっとるわい
ちなみに日本語の習得難易度は各言語の中で唯一、「悪夢」だそうな >>849
書き込んで一回だけ動作するようなレジスタ以外は書き込み順は関係ないよ。
UARTの送信データくらいじゃね?
sei してないから割り込み来ないとかじゃないよね? >>858
seiはしてるよ
念のため最初にcliして設定終わって無限ループ入る前にsei
そこらへんは基本でしょ、てか、同じ機能の設定に使うビット群が複数レジスタに分散してるとかで
データシートが読みづらい、これがriscあるあるか~ってw >>858
データシートで16bitレジスタアクセス手順を確認した方がいいよ。
8bit プロセッサで 16bit値の上下バイトを同じクロックで確定するため、内部では TEMPレジスタを使ってる。
tiny10 では上位バイト書き込みは TEMPレジスタに書かれ、下位バイト書き込み時に TEMPレジスタの値と合わせて 16bit を一息に適用する。
だから上位下位の順で書かないといけない。 >>861
先に出したコードは動いてるのと一致したから、そこもOK
なんか見逃してるんだろうけどなあ >>860
「そこらへんは基本でしょ」とか言われても
>>817 に書いてないだろ。コードの一部分だけ出してその言い草か。
>>861
>データシートで16bitレジスタアクセス手順を確認した方がいいよ。
そこらへんは基本でしょ >>862
出したコード動いてるなら
動いてないコード出さないと意味ない
簡略化してスタートアップコードから全部出した方が話が早そう >>863
>>その言い草か。
べつにやしめてるつもりは無いんだが
そううけとれちゃったんなら、ごめんな >>865
出してもいいけど
3行で長いって怒るひとが居るから、だいじょうぶかなあw >>867
だから 簡略化してって
つか、どこまで動いてて、どこから動いてないか
理解してる? 行大すぎで書き込みできんかった
分割するわ
.device atmega328p
.equ tccr1a = $80
.equ tccr1b = $81
.equ tcnt1l = $84
.equ tcnt1h = $85
.equ ocr1al = $88
.equ ocr1ah = $89
.equ ocr1bl = $8a
.equ ocr1bh = $8b
.equ timsk1 = $6f
.equ sreg = $5f
.equ portd = $2b
.equ ddrd = $2a
.equ pind =$29 .cseg
rjmp start ;RESET 電源ON, WDT, BOD等の各種リセット
reti ;INT0 外部割り込み要求0
reti ;INT1 外部割り込み要求1
reti ;PCINT0 (PCI0) ピン変化0群割り込み要求
reti ;PCINT1 (PCI1) ピン変化1群割り込み要求
reti ;PCINT2 (PCI2) ピン変化2群割り込み要求
reti ;WDT ウォッチドッグ計時完了
reti ;TIMER2_COMPA タイマ/カウンタ2 比較A一致
reti ;TIMER2_COMPB タイマ/カウンタ2 比較B一致
reti ;TIMER2_OVF タイマ/カウンタ2 溢れ
rjmp int_500 ;TIMER1_CAPT タイマ/カウンタ1 捕獲発生
rjmp int_500 ;TIMER1_COMPA タイマ/カウンタ1 比較A一致
rjmp int_500 ;TIMER1_COMPB タイマ/カウンタ1 比較B一致
rjmp int_500 ;TIMER1_OVF タイマ/カウンタ1 溢れ
reti ;TIMER0_COMPA タイマ/カウンタ0 比較A一致
reti ;TIMER0_COMPB タイマ/カウンタ0 比較B一致
reti ;TIMER0_OVF タイマ/カウンタ0 溢れ
reti ;SPI0_STC SPI0 転送完了
reti ;USART0_RX USART0 受信完了
reti ;USART0_UDRE USART0 送信緩衝部空き
reti ;USART0_TX USART0 送信完了
reti ;ADC A/D変換器 変換完了
reti ;EE_RDY EEPROM 操作可
reti ;ANALOG_COMP アナログ比較器 出力遷移
reti ;TWI0 TWI0 状態変化
reti ;SPM_READY SPM命令 操作可
reti ;USART0_START USART0 フレーム開始検出
reti ;PCINT3 (PCI3) ピン変化3群割り込み要求
reti ;USART1_RX USART1 受信完了
reti ;USART1_UDRE USART1 送信緩衝部空き
reti ;USART1_TX USART1 送信完了
reti ;USART1_START USART1 フレーム開始検出
reti ;TIMER3_CAPT タイマ/カウンタ3 捕獲発生
reti ;TIMER3_COMPA タイマ/カウンタ3 比較A一致
reti ;TIMER3_COMPB タイマ/カウンタ3 比較B一致
reti ;TIMER3_OVF タイマ/カウンタ3 溢れ
reti ;CFD クロック障害検出
reti ;PTC_EOC 周辺機能接触制御器 変換終了
reti ;PTC_WCOMP 周辺機能接触制御器 窓比較動作
reti ;SPI1_STC SPI1 転送完了
reti ;TWI1 TWI1 状態変化
reti ;TIMER4_CAPT タイマ/カウンタ4 捕獲発生
reti ;TIMER4_COMPA タイマ/カウンタ4 比較A一致
reti ;TIMER4_COMPB タイマ/カウンタ4 比較B一致
reti ;TIMER4_OVF タイマ/カウンタ4 溢れ start:
cli
;pd2出力
ldi r16,$04
sts ddrd,r16
sts portd,r16 ;点灯
;tccr1a ctcモード pinout無効
ldi r17,0
sts tccr1a,r17
;tccr1b 分周なし ctcモード
ldi r17,9
sts tccr1b,r17
;ocr1a 7999 $1f3f
ldi r17,$1f
ldi r16,$3f
sts ocr1ah,r17
sts ocr1al,r16
;tcnt1=0
ldi r16,0
ldi r17,0
sts tcnt1h,r17
sts tcnt1l,r16
;timsk 一致割り込み許可
ldi r16,2
sts timsk1,r16
sei
loop: rjmp loop
int_500:
ldi r16,0
sts portd,r16 ;消灯、一度でも割り込まれれば消えるはずだが・・・
reti >>871
シミュレータで動かしてたみたら?
レジスタやフラグの動きも全部見られるよ。 だから、なんでSRAMに書き込むんだよ
何一つ前進してねぇ…
ってか、本質的なことを理解せず、つまみ食い
しては「分かった気」になって、うまくいかないと
アラシさながらに書き込み、揶揄されると逆ギレ ページまで教えて貰ったデータシートを読んでないのか、
読んでも理解する能力がないのか… >>873
汎用レジスタもIOレジスタもSRAMもNVMも sts/lds でシームレスにアクセスできるでしょ 例えばPORTDがIOアドレスで定義されていたらSTS/LDSではアクセスできない。
メモリアドレスで再定義しないと。 >>878
ずいぶん無責任な奴だな、言い訳がそれか >>879
まあまあ、一部だけ見て反応するのはネラーの特徴だから、しょうがねえよ
資料云々言ってる人も居るけど、入手出来てないって書いてるの読んでくれてないみたいだしw 割鋳込み → 割り込み
CPUはmega328だよね >>881
あ、ほんまや、でかいねこれw
でもベクターの位置は12番目で合ってるから、メモリ食ってるだけと思います ゴメン、そうだよね、冗長なだけで動かない原因とはならないな >>883
ソースが出たから誰かが解決するのは時間の問題だと思うけど
あと出しでもめないように
1. マイコンの動作クロック ?
2. 書き込んだフューズの値
3. アセンブルするときのコマンド全部
4. 逆アセンブルリスト startから int_500まででOK
もあると安心 >>882
328ですよ~
328系の資料しか開いてなかったはずなんだけど
どっからコピったんだ>俺w では、後出し行きますw
クロック4mhz
ヒューズ
h D9
l E6
e FF
コマンド
"C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avrassembler\avrasm2.exe" -fI -l 0list.txt -m 0map.txt clock.asm
リスト
start:
00002d 94f8 cli
;pd2出力
00002e e004 ldi r16,$04
00002f 9300 002a sts ddrd,r16
000031 9300 002b sts portd,r16 ;点灯
;tccr1a ctcモード pinout無効
000033 e010 ldi r17,0
000034 9310 0080 sts tccr1a,r17
;tccr1b 分周なし ctcモード
000036 e019 ldi r17,9
000037 9310 0081 sts tccr1b,r17
;ocr1a 7999 $1f3f
000039 e11f ldi r17,$1f
00003a e30f ldi r16,$3f
00003b 9310 0089 sts ocr1ah,r17
00003d 9300 0088 sts ocr1al,r16
;tcnt1=0
00003f e000 ldi r16,0
000040 e010 ldi r17,0
000041 9310 0085 sts tcnt1h,r17
000043 9300 0084 sts tcnt1l,r16
;timsk 一致割り込み許可
000045 e002 ldi r16,2
000046 9300 006f sts timsk1,r16
000048 9478 sei
000049 cfff loop: rjmp loop
int_500:
00004a e000 ldi r16,0
00004b 9300 002b sts portd,r16 ;消灯、一度でも割り込まれれば消えるはずだが・・・
00004d 9518 reti 昔作ったプログラムを見たら、TIFR1レジスタにも設定してた
あまりに昔すぎて内容をよく覚えていない、参考になればいいけど
;----- setup timer#1:CTC 0.5S inteval for time base
clr ZL ;not output, OR1A_CTC
sts TCCR1A,ZL ; WGM1,0=0,0
ldi ZL,0b00001101 ;prescale 8M/2/1024 (125nS to 256uS)
sts TCCR1B,ZL ; WGM3,2=0,1 CS2,1,0=1,0,1
ldi ZL,HIGH(3906) ;19531 * 256uS = 0.5S
sts OCR1AH,ZL
ldi ZL,LOW(3906)
sts OCR1AL,ZL
ldi ZL,0b00000010 ;OCF1A flag
sts TIFR1,ZL ;enable int.
sts TIMSK1,ZL ;set mask flag >>889
ありがとうです
TIFR1設定追加してみましたが変化無しです
TIFRってなんぞ?と見てみたらすでに見てましたw
マッチした後に設定されて、割り込みが発生するとかで
ユーザーがいじらなくてもいいとこみたいな感じだったので
意識に残ってなかったですね、まあavr.jpの資料ですけどw
そっからまた、他のレジスタにも波及するようなので、
そっちが、なんか関係あるかもしれません >>849
横からですが、そういうのあるんですね。
考えたことなかったです。気にしてみます! >>857
日本語を習得した英語圏の人でも、難しいのは英語。という声もあるので諸説あるようです https://pastebin.com/rzeV2PEg
これで動くんじゃね?
たぶん\(^o^)/
あとコード貼るときは以下のサイトを使うといいと思うの
codepad.org
pastebin.com >>894
質問者ではないが割り込みベクタアドレス合ってる? >>893
謙譲語とか尊敬語とか難しいでごじゃる。 というかシミュレータ便利だよ。
Atmel Studio だか Microchip Studio 入れれば使えるしタダだし。
フラグ変化のタイミングやクロック数とか、実機じゃ確認しづらいことも確認できる。
全部の割り込みベクタにブレーク張っとけば割り込みベクタの間違いにも気付けるし。
まあ、いろいろ変な挙動も多いんだけどね。
CPUステータスレジスタを読むコードをシングルステップで実行してしまうと Iフラグがおちちゃったり、シングルステップで流していくとタイマー割り込みが入らなかったり。
power down な sleep は実質ハングアップするから、そういうのを含むコードはすごく追いづらいってのもあるし、周辺IO によってはクソの役にも立たないと思うけど。
でもそれを差し引いても便利過ぎる。
実際に見てみないと分からないデータシートから読み取りづらい挙動が多いよ。 >>898
どうやってシミュ起動するかちょこっとレクチャーよろしくです >>899
プロジェクトのプロパティ、Tool のタブでデバッガとして Simulator を選択。
F9 でブレーク張って F5 で実行だけど、Debugメニューの中見れば操作方法は分かると思う。
ちなみにディレクトリパスにマルチバイト文字が入ってるとうまく動かない。 >>900
マイクロチップスタジオのプロジェクトとして作っておかないとだめな感じですか? >>901
それ以外でやったことないけど、まだ実験コードなんだからコピペしちゃえばいい。
アセンブラプロジェクトを作ると main.asm ってのが自動的に出来上がるから、そこに。
プロジェクトが自動的に include するデバイス毎の定義と自前の equ が被る場所はちょっと調整する必要があるけど、これから作るものは標準の定義に合わせていくといい。 いきなりEQUかぶってんで詰まりますね
スタジオがデフォで読み込んでる定義を抑制できればいいんですが・・・
EQUを全部コメントアウトすればとりあえず先へ進めるけど
デフォの定義はメモリーアドレスなのか、IOアドレスなのかすらわからない
この件でキレてた人居たからIOですかね?
うん別名で定義しなおしますか >>904
in/out でアクセスできるレジスタはそっち使う方が命令長も実行クロックも短くなるよ。
sts/lds は 2ワード命令 >>905
outだと、大きいアドレスが来ると届かなくてASMに怒られるんで
めんどくさくないようにメモリアクセスで統一してます
あと数バイトたりね~とかになったら、削ります I/Oアドレスの問題もそうだけど、命令の対象レジスタの制限、即値の制限など、
AVRには色々と制約が多い。
生まれて初めてAVRでアセンブルしたときに
エラーメッセージ(この命令はR16〜R31でしか使えません)が一杯出てきた。
「なんだよぉ、コード16ビットにしちゃ命令の種類が多いなと感心したのに
そういうカラクリだったのね、詐欺みたいなCPUだな」
と思ったw
でも3回ほどプログラムを作った後は、
「良く出来たPUだな、プログラミングが楽しいCPUだな
これからも使いつづけよう」
に変り、今に至るw
逆に3回ほど使って「二度と使うか!」と思ったのがPIC。
(PICファンの人、ゴメンね、相性です)w あるあるw
16ビット加算ないのぉ?って命令表見てたら、あるじゃ~ん
もっとよく見るとオペランド6bitってwww、こけたよ >>896
少なくともMicrochip Stadio7.0+中華328P(16MHz)では意図したであろう動作はしてるよ
リセット -> PD2(High) -> 8ms -> PD2(Low)
たぶん\(^o^)/ >>909
ほんとだ、TIMER1 COMPA のベクタアドレスは 0x16 だった。
同じデータシートに複数モデルのベクタ表があって見間違ってた。 >>910
まあ、アップした表も間違ってんだけど
ベクター位置は合ってるからまあいいかで放置w
複数モデルのベクター表載ってるデーターシートがあるの?
そこからコピったのかな>俺w >>912
ベクター位置は合ってるって、>>870 は間違ってるけど今試してるやつは修正済みということ? >>913
コンペアマッチAについては同じ位置ですよ >>914
ベクタ番号とベクタアドレスの対応をよーーーーーく見てみ >>909
実機で動いてんですか?
じゃあコードのもんだいじゃなくて他だと
う~ん >>915
12番目で
csegアドレスなら0b
実体で16h
でまちがってます? cseg上だからどうやっても一バイト間隔にはできませんけど >>919
アドレスの単位はバイトじゃなくてワード。
メモリアクセスのためのメモリマップ上のアドレスはバイト単位でポイントできるけど、それはコードのアドレスの2倍が基準。 アセンブラでcsegに直配置すると、ワード単位でしか配置できないので2バイト確保できてないなんて心配は要らないと思いますが? なんでm328pdef.incを使わないんだろう… >>923
その表は初めて見ました
ん~、4バイトごとに配置しろってことですか?
試します
」
動きました
LED消灯したので、交互にオンオフするように書き換えて
ばっちり点滅してます
感謝感激
あり豪ございます >>924
program address と言われたら、バイトじゃなくワードアドレスってことに留意ね。
アドレス 0x0000 の次の命令のアドレスは 0x0001 ね。 >>925
私がcsegアドレスって言ってたのがそれなんで
そこに見解の相違は無いと思います
なにはともあれ、たすかりまし、ありがとう >>926
そっちじゃなくデータシートの読み方だよ。
ベクタ12 のアドレスは 0x0016 って書いてあったでしょ。
これはバイトアドレスじゃなくワードアドレスね。
ともかく動いてよかったね。 >>927
こっちで見てた表はアドレス無いやつです
12番目しかわかりませんでした これ下位のCPUだったら、全然気が付いてなかったかもですね
ベクターサイズ網羅した表ほしいですねえ >>929
ちなみに番号歯抜けもあるからね。
少なくともオフィシャルのデータシートにはアドレスも書いてあるよ。
秋月に貼られてるデータシートにも書いてあるから見ておくといいよ。 >>930
avr.jpのにも書いてありました
物自体が他のcpuのだし
謎な所から拾ってしまったのが敗因ですね
改めてコピペしようとしたら、すんなりコピーさせてくれなかったので
あ、なるほど、これでwebに探しに行って、変なの拾っちまったわけかと納得 そういう違いを吸収して移植性を高めるために
MPU毎に定義マクロ(.inc)があるのに、
なぜ使わないんだろう
何が何でも、車輪を再発明しなきゃ気がすまない
タイプの人? >>932
実際にベクタの中身書いたことあってそれ言ってるの? >>934
定義マクロ使ってベクタを書くサンプル見せてください。参考にしたい。 >>935
その前に聞きたいんだけど
開発環境に何使ってるの? >>936
おれは atmel studio よ。 >>937
だとすると、わざわざプロジェクトの
プロパティを編集してatmel studioが
用意してくれたアセンブラオプションを
毎回削除してるわけ? >>938
え、どういうこと?
普通にプロジェクト作ると main.asm の中身んてただの無限ループひとつでしょ? >>938
いいからマクロ定義使ったベクタ定義見せてくれよ。
もしかして全部のベクタに org 付けるって話? >>940
そうだよ。
こんな感じ
.org OVF1addr
rjmp myhandler
myhandler:
insructions
reti そんなものが無くてもアセンブラで書けるけど(サンプル>>491)
取りあえず言える事は、<マニュアルは眼光紙背に徹するほどいちいち叮嚀に読もう>
ベクタが2Wであるのはマニュアルを見さえすれば気が付くし、納得する。 >>941
ベクタ以外の実処理の org はどう書くの?
ベクタの最終アドレスの定義がある?
まあ実際全部のベクタを org で指定すればどのプロセッサにも適用できそうなコードにはなるんだろうし、それなりのメリットはあるんだろうね。
でも多分自分はやらないなぁ
よく空きベクタに別のコード置いたりしてクロックやらサイズやら節約してるってのもあるし、どのプロセッサでも動くようなものじゃなくターゲットが明確なことが多いからな。
アセンブラで書くのは1クロック1バイトを削りたいからという目的もあって、中途半端な移植性のために無駄の出る書き方するなら本末転倒だ。
もちろん個人のスタンスの話で、一般論を語るつもりではない。 >>943
あの?なんでコードサイズに影響すると思ったの??
もしかして、まるで理解できてない? とりあえず、べくたーを修正中
4バイト間隔にするために、とりあえずnopで埋めたけど
なんかかっこ悪いな~ >>945
空きベクタの領域にコードを書くなら、そのアドレスを強く意識する必要があるでしょ。
そのアドレスを隠蔽する書き方じゃ目的を果たせないよね? >>898
これ
外部ピンを互いに任意に接続できるようにしてくれるともう無敵なんだがなあ >>949
対応しているチップが限定されるけどSimulIDEとか >>902
使い方がだいたわかってきたところで、答え出ちゃったので使う機会がなくなっちゃいましたけど
ありがとう レス数が950を超えています。1000を超えると書き込みができなくなります。