電子工作日記、その他

趣味の電子工作製作の記録、その他思った事

AVR Programming(4)

2013-01-27 13:26:12 | 日記
kumanさんのブログでmikujiさんが質問していたInterrupt処理のasm Programを研究してみる事にした。
asmでは、動作しない事が予想されるので(良く理解していないので)まずCで組む事を考えた。
kumanさんのProgram Libの中から探しても良いのだが、Net検索したらTIMER1_CMPA使用の例題が見つかった。
C Programは下記(出典先のアドレスを記述する事を忘れた。)
実行の結果割り込みが正常動作している事を確認した。
次に、C Programを見ながら、asm で Programを書き、RUNしたが、動作しなかった。
studio4 のdebugを起動してdebugを勉強した。だいたい操作方法は、理解した。
asm Program main の waitloop 内に、割り込みvectにJMP命令を挿入し実行したら、目標の動作を
している事の確認が出来た。
TIMER/COUNTER 1の設定、起動が悪い事が判った。
;*******************************
; timer1 interrupt program asm
;---------------------------------
; CPU: ATMEGA168P
; CLOCK: Internal RC OSC 1MHz
; Event Input:
; TIMER1_COMPA_vect: 100x1024=102,400us (102 ms) 200ms/cycle
; Output:
; Target: PB0 timer1 output
; Debug: PB7 interrupt check
; TIMER1(16bit)
; TIMER0( 8bit)
;--------------------------------------
; ATMEGA168P
;        PB0 14     15 PB1
;        PD7 13     16 PB2
;        PD6 12     17 PB3
;        PD5 11     18 PB4
;        PB7 10     19 PB5
;        PB6 9     20 AVCC
;        GND 8     21 AREF
;        VCC 7     22 GND
;        PD4 6     23 PC0
;        PD3 5     24 PC1
;        PD2 4     25 PC2
;        PD1 3     26 PC3
;        PD0 2     27 PC4
;     *RESET/PC6 1___---____28 PC5
; asm Instraction
;AND Rd,Rr
;ANDI Rd,K
;OR Rd,Rr
;ORI Rd,K
;EOR Rd,Rr Ex-OR
;ORI Rd,K
;COM Rd 1 Compliment
;NEG Rd 2 Compliment
;SBI P,b IO bit set
;CBI P,b IO bit clear
;MOV Rd,Rr Rd<--Rr
;LD Rd,x Rd<--(x) x: x reg
;ST X,Rr (x)<--Rr x reg InDirect
;STS k,Rr (k)<--Rr SRAM Direct
;IN Rd,P Rd <--P
;OUT P,Rd P <--Rd
;RET PC<--STACK
;RETI PC<--STACK
;--------------------------
.include "m168pdef.inc"
;---------------------------
.org $00
;---------------------------
reset:
jmp start ; go start
jmp EX_INT0 ; EX_INT0
jmp EX_INT1 ; EX_INT1
jmp reset ; timer1_capt ;タイマ/カウンタ1捕獲(キャプチャ)発生
jmp TIMER1_COMPA ; timer1_compa ;タイマ/カウンタ1比較A一致
jmp TIMER1_OVF ; timer1_ovf ;タイマ/カウンタ1オーバーフロー
jmp reset ; timer0_ovf ;タイマ/カウンタ0オーバーフロー
jmp reset ; usart_rxc ;USART受信完了
jmp reset ; usart_udre ;USART送信バッファ空き
jmp reset ; usart_tx ;USART送信完了
jmp reset ; ana_comp ;アナログ比較器出力遷移
jmp reset ; pcint ;ピン変化割り込み要求
jmp reset ; timer1_compb ;タイマ/カウンタ1比較B一致
jmp reset ; timer0_compa ;タイマ/カウンタ0比較A一致
jmp reset ; timer0_compb ;タイマ/カウンタ0比較B一致
jmp reset ; usi_strt ;USI開始条件検出
jmp reset ; usi_ovf ;USIカウンタオーバーフロー
jmp reset ; ee_rdy ;EEPROM操作可
jmp reset ; wdt_ovf ;ウォッチドッグ計時完了

start:
jmp start1
;------------------------
; TIMER1_COMPA INTERRUPT
;------------------------
TIMER1_COMPA:
RCALL wait_300m ;
SBIS PORTC, 0 ; if PC0=1? skip
JMP FPC0_01 ;
CBI PORTC, 0 ; PC0 1 to 0
JMP CBJE
FPC0_01: ;
SBI PORTC, 0 ; PC0 0 to 1
CBJE:
RETI
;********************
TIMER1_OVF: ; Overflow Interrupt
;********************
mov r16, r30 ; timer set
sts TCNT1H, r16 ;↑
mov r16, r31 ;↑
sts TCNT1L, r16 ;↑
inc r3 ; interrupt FLAG r3=1
RETI ;
;*******************
; EX_INT1
;********************
EX_INT1:
cli ; interrupt disable
clr r5 ; flag
jmp wait_100m ; chatring remove
sbrs r4, 0 ; Rb(b)=1, PC<--PC + 2or3
jmp time_100mset ; timer2( 34958 )
sbrs r5, 0 ; Rb(b)=1, PC<--PC + 2or3
jmp time_300mset ; timer3( 64740 )
clr r5
RETI

; subroutine
;----------------
Timer1_init: ;
;----------------
;OCR1A = 100 ;
ldi r16, 0 ;
sts OCR1AH, r16 ;
ldi r16, 100 ; 7654 3210
sts OCR1AL, r16 ; 0b0110 0100 OCR1A=100 100x1024=102,400us (4.88Hz)
; ++---------COM1A1:COM1A0 00 (OC1A cut)
;TCCR1A=0 ; ||++-------COM1B1:COM1B0 00 (OC1B cut)
ldi r16, 0 ; |||| ++--WGM11,10 00(WGM 4bit(1:0)
STS TCCR1A, r16 ; 0b0000 0000

;TCCR1B=0x0D ; 0b0000 1101
ldi r16, 0 ; || | |+++--CS12,11,10 101 1/1024
STS TCCR1B, r16 ; || +-+-----WGM13,12 01(WGM 4bit(3:2) CTC TOP
; ++---------ICNC1,ICES 00
;TIMSK1=0x02 ; 0b0000 0010
ldi r16, 2 ; +-- compA interrupt enable
STS TIMSK1, r16 ;
RET

start1:
;--------------------
ldi r16,low(ramend) ; RAM End Address set to SPL
out spl,r16 ;
;--------------------
ldi r16, 0xFF ; PB output
out DDRB, r16 ;
ldi r16, 0x3F ; 7654 3210
out DDRC, r16 ; PC5-0 output 0011 1111
;--------------------
ldi r16, 0xFF ; PD output
out DDRD, r16 ;
;--------------------
ldi r16, 0 ;
out PORTB, r16 ; PB=0
ldi r16, 5 ;
out PORTC, r16 ; PC=0
ldi r16, 0 ;
out PORTD, r16 ; PD=0
;****************************
main:
;****************************
ldi r16, 0x01 ;
out DDRC, r16 ; PC0: output
ldi r16, 0x01 ; PC0=1
out PORTC, r16 ;
RCALL timer1_init;
sei

mloop:
NOP
NOP
RCALL TIMER1_COMPA
NOP
NOP
JMP mloop
;-----------------------
; execute LED
;-----------------------
asmendchk:
SBI PORTB, 4 ; PB4
RCALL wait_1m
CBI PORTB, 4
RCALL wait_1m
RET
;--------------------
; EX_INT1_LED
;--------------------
EX_INT1_LED:
SBI PORTB, 6 ; PB6
RCALL wait_1m
CBI PORTB, 6
RCALL wait_1m
RET
;--------------------
; TIMER1 OVF LED
;--------------------
TIMER1_OVF_LED:
SBI PORTB, 7 ; PB7=1
RCALL wait_1m
CBI PORTB, 7
RCALL wait_1m
RET
;*********************
; EX_INT0 LED
;*********************
EX_INT0:
RETI
;*******************
; LED for Debug
;-------------------
PB7_ON:
SBI PORTB,7 ; PB7=1
RCALL wait_1m ;
CBI PORTB,7 ; PB7=0
RCALL wait_1m ;
RET
;--------------------
; time300mset
;--------------------
time_300mset:
ldi r30, 0x88 ;
ldi r31, 0x8e ; 65536-34958=30578 305μ
inc r4 ;
inc r5 ;
ret
;--------------------
; time100mset
;--------------------
time_100mset:
ldi r30, 0xfc ;
ldi r31, 0xe4 ; 65536-64740=826 82 μ
clr r4 ;
inc r5 ;
ret
;*******************
wait_300m: ; 300 ms wait(1MHzクロック時)
;-------------------
LDI R18,3
wait_300m2:
;-------------------
RCALL wait_100m ; <00ms sub>
DEC R18
BRNE wait_300m2
RET
;*******************
wait_100m: ; 100 ms wait(1MHzクロック時)
;-------------------
LDI R19,100
wait_100m2:
;-----------------------
RCALL wait_1m ; <ms sub>
DEC R19
BRNE wait_100m2
RET
;*******************
wait_10m: ; 100 ms wait(1MHzクロック時)
;-------------------
LDI R19,10
wait_10m2:
;-----------------------
RCALL wait_1m ; <ms sub>
DEC R19
BRNE wait_10m2
RET
;********************
wait_1m: ; 1ms wait(1MHzクロック時)
;-----------------------
LDI R20,250
wait_1m2:
;-----------------------
NOP ; 4 clock
DEC R20 ;
BRNE wait_1m2
RET

//************************
; C Program
;************************
; TIMER1 LED_On/Off Test
;---------------------------
CPU: ATMEGA168P
CLOCK: Internal RC OSC 1MHz
Input:
Output:
Test_LED:
PB7: INT1 ↓
*/

//****************************
#define F_CPU 1000000UL
#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>

//------------------------
ISR(TIMER1_COMPA_vect)
{
PORTB ^= 0x01;
LIT_7_ON(); // for Interrupt check
}
//-----------------------
void timer_init(unsigned t)
{
OCR1A = t;
TCCR1A = 0;
TCCR1B = 0x0D;
TIMSK1 = 0x02;
//sei(); // no interrupt check
sei();
}
//--------------------------
LIT_7_ON() // Interrupt check LED for debug
{
PORTB |= _BV(7);
_delay_ms(10); //10ms on
PORTB &= ~_BV(7);
_delay_ms(10); //10ms off
}
//****************************
int main()
{
DDRB = 0x81; // modify from 0x01
PORTB = 0x01;
timer_init(100);

while(1);
}

荒らしと、荒らしを助長する行為?

2013-01-24 10:20:21 | 日記
荒らしと、荒らしを助長する行為?

私は、2chからアクセス禁止に成っている。この処置で2chの平和が来ている事を
認める。しかし、残った一部の人による、他サイトの会話を監視し、他人の誹謗中傷に
2chを使用している事は、一種のプロパガンダ行為であり有害で有ると私は考える。

私が、他サイトに記述すれば、お前は、病気だ、馬鹿だと罵り、独善的な記述で
他人の記事、行動にイチャモンを付ける。まるで、正義の味方、月光仮面の様に、
他サイトに来てまで、他人の記事に対し、お前の記事は、悪いと一方的に記述する。

お互いに、もっと他人の意見を聞きいわゆる、いいとこ取りをする必要が有ると思う。

私の記述も悪い事が有る事を認めるが、(がた老さん、上間さんから、指摘を受けている
事は、認識している。)
私の記述は、空くまで私の考えを言ったまでで有って、読者自身が、自分の信条や経験を通して自由に考えれば良い事である。私は、自分の考えで他人を拘束、示唆する事は
考えていない。出来るだけ他人の考えを否定する記述は、控えている積りだ。

質問者に対する回答として一番良いと思うのは、kuga氏の回答で、過不足の無く
感情を抜きにした、技術的に適切な回答であり、誰から見ても適切な回答と見ている。

私の回答で、読者や質問者が、迷う様な回答は、していない積りだ。私達の回答で
理解出来た事は何か、これは違うのでは無いか、これは、ほぼ正しいのではの
判断が出来なくては、どんな文章を読んでも理解出来ない。質問する前にどんな回答を
欲しているかを明示した質問にしなければいけないと思う。

Mikujiさんの質問は、質問文章を良く再読しProgramの:の記入ミス等を修正してからでも良いのではと思った。私は、C言語でダメですかの質問には無回答で有った。
また文章記述に未だに曖昧な点が残っている。
自分はここまでTESTしたがXXXNGだったと言う記述が無い事を不自然に思った。
(若しかしたら、初心者では無いかもと思った。若しかしたら、2chの方かもと思った)

この様な点から、私は、まず、Compileの結果はこの様で、実行の結果は、こうでしたと2分して記述すると質問として分かり易かったと思う。
合っているか見てくださいは、いけないと思う。
この様な文章を書くならば、ATMELのStudio6の無料で優秀なCompilerが有るので、使用し、Program LED_onoff.c とInerrupt Programを作成し、実行をトレ-ニングしてからasm Programに進むべきで有ると思った。
がた老さんも、私と同様な事を記述されている。

私は、mikujiさんのProgramを詳細に見ている。見た結果、もうあと一歩のところで
良いか悪いかの検証が出来ていないと思った。
またそれは、初心者の歩む道のgoal前の様の状態にも見えた。
今、mikujiさんのProgramを修正している。完成したら私のサイトに記述してみようと
考えている。
私はasmを使用しないが、mikujiさんのProgramを勉強する機会を与えてくれた事に
感謝します。

この事を捉えて、2chの第三者があれこれ私に絡んで来る。2chで他人をあれこれ
誹謗中傷し、あげくの果ては、Kumanさんサイトに来てまで、いちゃもんを記述する事は、これこそ、本当の荒らしに他ならないと私は考える。

私の記述が、貴方の考えと相いれない事は承知した。貴方がたに屈服したわけでは無いが
Kumanさんのサイトには、出ない事にしよう。

貴方がたが、真の、壊し屋、荒らし屋と確認した。これからも、その行動を続けると思うが、貴方の人生の貴重な時間をムダにしているのではなかろうか。

この文章を書くのに、1時間強を費やした。これも良しとしよう。
2013.1.24 川名

世の中の問題点

2013-01-10 17:19:44 | 新聞記事
大阪市立、桜宮高校バスケ部キヤプテンの自殺問題

管理の出来ない校長、副校長、バスケ顧問教師は、
問題を正確に認識出来ない。職務怠慢である。
(管理職としても、教員としても、教育の本質を
理解していないのでは?教職失格で有るとも思われる?)
自己退職すべきか、解雇すべきと思うが?