;**** includes **** 2009/8/1 ck=8Mhz .include "m88def.inc" .macro ldiw ; ldiw Z(X,Y),var ldi @0L,low(@1) ldi @0H,high(@1) .endm .MACRO cpi16 ;cpi16 ra,rb,0xHHHH ;ra:rb-0xHHHH set flags:N,C,Z push @0 push @1 subi @1,low(@2) sbci @0,high(@2) pop @1 pop @0 .ENDMACRO ;***************************** ;* レジスタ変数 設定 * ;***************************** .def temp1 = r16 .def temp2 = r17 .def e1 = r18 .def e1h = r19 .def e0 = r20 .def ed = r22 .def edh = r23 .def m_max = r15 ;use r0,x,z,r25:24,r21 ;***************************** ;*  ビット 設定  * ;***************************** ;** PORTB *** ;sensor ;right<- 76543210 ->left ;** PORTC *** ; ;** PORTD *** .equ lo = 0 ;led on ;.equ    5 : OC0B left motor drive ;.equ    6 : OC0A right motor drive ;********************* ;* 割込みベクター * ;********************* .dseg s_tab: .byte 42 ;21x2 ;e1_log: .byte 512 ;.eseg ;EEPROM add ;rom_e1: .BYTE 512 .cseg rjmp start ;各種リセット reti ;RJMP EXT_INT0 ;外部割り込み要求0 reti ;RJMP EXT_INT1 ;外部割り込み要求1 reti ;RJMP PCINT0 ;ピン変化割り込み要求0 reti ;RJMP PCINT1 ;ピン変化割り込み要求1 reti ;RJMP PCINT2 ;ピン変化割り込み要求2 reti ;RJMP WDT_OVF ;ウォッチドッグ計時完了 reti ;RJMP TIM2_COMPA ;タイマ/カウンタ2比較A一致 reti ;RJMP TIM2_COMPB ;タイマ/カウンタ2比較B一致 reti ;RJMP TIM2_OVF ;タイマ/カウンタ2溢れ reti ;RJMP TIM1_CAPT ;タイマ/カウンタ1捕獲発生 reti ;RJMP TIM1_COMPA ;タイマ/カウンタ1比較A一致 reti ;RJMP TIM1_COMPB ;タイマ/カウンタ1比較B一致 reti ;RJMP TIM1_OVF ;タイマ/カウンタ1溢れ reti ;RJMP TIM0_COMPA ;タイマ/カウンタ0比較A一致 reti ;RJMP TIM0_COMPB ;タイマ/カウンタ0比較B一致 rjmp TIM0_OVF ;タイマ/カウンタ0溢れ reti ;RJMP SPI_STC ;SPI転送完了 reti ;RJMP USART_RXC ;USART 受信完了 reti ;RJMP USART_UDRE ;USART 送信バッファ空 reti ;RJMP USART_TXC ;USART 送信完了 reti ;RJMP ADC ;ADC変換完了 reti ;RJMP EE_RDY ;EEPROM操作可 reti ;RJMP ANA_COMP ;アナログ比較器出力遷移 reti ;RJMP TWI ;2線直列インターフェース状態変化 reti ;RJMP SPM_RDY ;SPM命令操作可 ;********************* ;* メイン プログラム * ;********************* start: LDI R16,HIGH(RAMEND);RAM最終アドレス上位を取得 OUT SPH,R16 ;スタック ポインタ上位を初期化 LDI R16,LOW(RAMEND);RAM最終アドレス下位を取得 OUT SPL,R16 ;スタック ポインタ下位を初期化 ldi r16,0x80 ;set 8MHz sts CLKPR,r16 ldi r16,0x00 sts CLKPR,r16 i_o_reset: ldi temp1,0 out PORTB,temp1 ; pb0~7 Hi-Z ldi temp1,0 out DDRB,temp1 ; pb0~7 in port ldi temp1,0xff out PORTC,temp1 ; pc0~7 pull up ldi temp1,0 out DDRC,temp1 ; pc0~7 in port ldi temp1,0 out PORTD,temp1 ; pd0~7 clear ldi temp1,0xff out DDRD,temp1 ; pd0~7 out tab_set: ldiw z,table*2 ldiw y,s_tab ldi temp1,0 tab_set1: inc temp1 lpm r0,z st y+,r0 adiw z,21 lpm r0,z std y+20,r0 sbiw z,20 cpi temp1,21 brne tab_set1 timer0_set: ldi temp1,(1<127 rjmp e_end9 ;0<=e1<=127 e_over: ldi e1,127 rjmp e_end9 e_end1: cpi16 e1h,e1,0xff81 brcc e_end9 ;0>e1>=-127 e_under: ldi e1,-127 ;e1<-127 e_end9: ;log: ; dec r21 ; brne log_e ; ldi r21,40 ; st z+,e1 ; sbiw r24,1 ; breq log_w ;log_e: ret ;log_w: ; ldi temp1,0 ; out TCCR0B,temp1 ; out TCCR0A,temp1 ; ldiw y,e1_log ; ldiw z,rom_e1 ; ldi r25,2 ; ldi r24,0 ;log_w1: ; ld temp1,y+ ; rcall EEPROM_WR ; adiw zl,1 ; sbiw r24,1 ; brne log_w1 m_stop: ldi temp1,0 out TCCR0B,temp1 out TCCR0A,temp1 m_stop1: sleep rjmp m_stop1 ;EEPROM_WR: ; SBIC EECR,EEPE ;EEPROM書き込み完了ならばスキップ ; RJMP EEPROM_WR ;以前のEEPROM書き込み完了まで待機 ; LDI R20,(0<