모터 > 쿼드콥터 변속기 - i2c_r09_01 - I2C version with sources.zip

TODAY782 TOTAL2,229,340
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


BASIC4MCU | 모터 | BLDC모터 | 쿼드콥터 변속기 - i2c_r09_01 - I2C version with sources.zip

페이지 정보

작성자 키트 작성일2017-09-05 15:03 조회1,901회 댓글0건

첨부파일

본문

;**** **** **** **** ****
;
;Die Benutzung der Software ist mit folgenden Bedingungen verbunden:
;
;1. Da ich alles kostenlos zur Verf?ung stelle, gebe ich keinerlei Garantie
;   und ?ernehme auch keinerlei Haftung f? die Folgen der Benutzung.
;
;2. Die Software ist ausschlie?ich zur privaten Nutzung bestimmt. Ich
;   habe nicht gepr?t, ob bei gewerblicher Nutzung irgendwelche Patentrechte
;   verletzt werden oder sonstige rechtliche Einschr?kungen vorliegen.
;
;3. Jeder darf 훞derungen vornehmen, z.B. um die Funktion seinen Bed?fnissen
;   anzupassen oder zu erweitern. Ich w?de mich freuen, wenn ich weiterhin als
;   Co-Autor in den Unterlagen erscheine und mir ein Link zur entprechenden Seite
;   (falls vorhanden) mitgeteilt wird.
;
;4. Auch nach den 훞derungen sollen die Software weiterhin frei sein, d.h. kostenlos bleiben.
;
;!! Wer mit den Nutzungbedingungen nicht einverstanden ist, darf die Software nicht nutzen !!
;
; October 2004
; autor: Bernhard Konze
; email: bernhard.konze@versanet.de
;
;**** **** **** **** ****
; Device
;
;**** **** **** **** ****
.include "m8def.inc"
;//.include "6a_i2c.inc"
;*********************************************************** 
;* TP-18A                                                  *
;* Mai.2007
;* http://home.versanet.de/~b-konze/                       *
;***********************************************************

#define Typ "6a_i2c"

; activate Motor brake

;.equ MOT_BRAKE      = 0

;Select Brake Power
; 1 = min Brake
; 2 = medium Brake
;   3 = hard Brake

.equ BrakeSelect    = 2

.equ CALIBRATE   = 1      
.equ OSCAL_VALUE  = 0x01ff  ; eeprom position

.equ FORCE_LIPO  = 1   ; 1=Lipo und 0=NC wenn keine Buecke
.equ ActiveFreeRun = 0

;**** **** **** **** ****
; PORT  definitions
;**** **** **** **** ****

;*********************
; PORT D 
;*********************  
;.equ      = 7     ;i
.equ c_comp  = 6 ;i common comparator input (AIN0)
.equ ApFET  = 5 ;o
.equ CpFET  = 4 ;o
.equ BpFET  = 3 ;o
.equ rcp_in  = 2 ;i r/c pulse input

.equ INIT_PD  = 0
.equ DIR_PD  = (1<<ApFET)+(1<<BpFET)+(1<<CpFET)
.equ BRAKE_PD = 0

#define ApFET_on sbi PORTD,5
#define ApFET_off cbi PORTD,5
#define BpFET_on sbi PORTD,3
#define BpFET_off cbi PORTD,3
#define CpFET_on sbi PORTD,4
#define CpFET_off cbi PORTD,4


;*********************
; PORT C definitions *
;*********************
;.equ   = 5 ; phase input
;.equ        = 4 ; ADC4
.equ mux_c  = 3 ; phase input
.equ mux_b  = 2 ; phase input
.equ  mux_a  = 1  ; ADC1 temperature control input 
.equ  accu_adc = 0  ; ADC0 voltage control input

;*********************
; ADC only
;*********************
;.equ        = 7 ; ADC7
;.equ        = 6 ; ADC6

.equ INIT_PC  = 0x30 ; set pullup for i2c
.equ DIR_PC  = 0
.equ BRAKE_PC = 0


;*********************
; PORT B definitions *
;*********************
;.equ  = 7 
;.equ  = 6 
;.equ  = 5 (sck stk200 interface) 
;.equ  = 4 (miso stk200 interface)
;.equ  = 3 (mosi stk200 interface) 
;.equ  = 2 
;.equ  = 1 
;.equ  = 0

.equ AnFET  = 2 ;o
.equ CnFET  = 1 ;o
.equ BnFET  = 0 ;o

.equ INIT_PB  = 0
.equ DIR_PB  = (1<<AnFET)+(1<<BnFET)+(1<<CnFET)
.equ BRAKE_PB = (1<<AnFET)+(1<<BnFET)+(1<<CnFET)

#define AnFET_on sbi PORTB,2
#define AnFET_off cbi PORTB,2
#define BnFET_on sbi PORTB,0
#define BnFET_off cbi PORTB,0
#define CnFET_on sbi PORTB,1
#define CnFET_off cbi PORTB,1

;
; 8K Bytes of In-System Self-Programmable Flash
; 512 Bytes EEPROM
; 1K Byte Internal SRAM
;**** **** **** **** ****
;**** **** **** **** ****
; fuses must be set to internal calibrated oscillator = 8 mhz
;**** **** **** **** ****
;**** **** **** **** ****

.equ MOT_BRAKE    = 0

.equ I2C_ADR  = 0x50
.equ MOTOR_ID = 1  ; 1, 2, 3 or 4

.equ CHANGE_TIMEOUT = 1
.equ CHANGE_TOT_LOW = 1

.equ POWER_RANGE = 100   ; full range of tcnt0 setting
.equ MIN_DUTY = 10   ; no power
.equ NO_POWER = 256-MIN_DUTY  ; (POWER_OFF)
.equ MAX_POWER = 256-POWER_RANGE ; (FULL_POWER)

.equ PWR_MAX_RPM1 = POWER_RANGE/4
.equ PWR_MAX_RPM2 = POWER_RANGE/2

.equ PWR_STARTUP = MIN_DUTY
.equ PWR_MAX_STARTUP = MIN_DUTY+20

.equ timeoutSTART = 48000
.equ timeoutMIN = 36000

.equ T1STOP = 0x00
.equ T1CK8 = 0x02

.equ EXT0_DIS = 0x00 ; disable ext0int
.equ EXT0_EN  = 0x00 ; disable ext0int

.equ OCT1_RANGE1 = 16 ; ( ~2400 RPM )
.equ OCT1_RANGE2 = 8 ; ( ~4800 RPM )

;.equ PWR_RANGE1 = 0x40 ; ( ~2400 RPM )
;.equ PWR_RANGE2 = 0x20 ; ( ~4800 RPM )
.equ PWR_RANGE1 = 0x20 ; ( ~2400 RPM )
.equ PWR_RANGE2 = 0x10 ; ( ~4800 RPM )

.equ ENOUGH_GOODIES = 60

;**** **** **** **** ****
; Register Definitions
.def i_sreg   = r1 ; status register save in interrupts
.def tcnt0_power_on  = r2 ; timer0 counts nFETs are switched on
.def tcnt0_change_tot = r3 ; when zero, tcnt0_power_on is changed by one (inc or dec)
.def byte_cnt  = r4
.def uart_cnt  = r5
.def tcnt0_pwron_next = r6

.def start_rcpuls_l  = r7
.def start_rcpuls_h  = r8
.def motor_count  = r9
;.def    = r10
.def i2c_timeout  = r11
.equ I2C_TOT   = 100

.def current_err  = r12 ; counts consecutive current errors
.equ CURRENT_ERR_MAX  = 3 ; performs a reset after MAX errors

.def sys_control  = r13
.def t1_timeout  = r14
.def run_control  = r15


.def temp1 = r16   ; main temporary
.def temp2 = r17   ; main temporary
.def temp3 = r18   ; main temporary
.def temp4 = r19   ; main temporary

.def i_temp1 = r20   ; interrupt temporary
.def i_temp2 = r21   ; interrupt temporary
.def i_temp3 = r22   ; interrupt temporary

.def flags0 = r23 ; state flags
 .equ OCT1_PENDING = 0 ; if set, output compare interrunpt is pending
 .equ UB_LOW  = 1 ; set if accu voltage low
 .equ I_pFET_HIGH = 2 ; set if over-current detect
 .equ GET_STATE = 3 ; set if state is to be send
 .equ C_FET  = 4 ; if set, C-FET state is to be changed
 .equ A_FET  = 5 ; if set, A-FET state is to be changed
      ; if neither 1 nor 2 is set, B-FET state is to be changed
 .equ I_OFF_CYCLE = 6 ; if set, current off cycle is active
 .equ T1OVFL_FLAG = 7 ; each timer1 overflow sets this flag - used for voltage + current watch

.def flags1 = r24 ; state flags
 .equ POWER_OFF = 0 ; switch fets on disabled
 .equ FULL_POWER = 1 ; 100% on - don't switch off, but do OFF_CYCLE working
 .equ CALC_NEXT_OCT1 = 2 ; calculate OCT1 offset, when wait_OCT1_before_switch is called
 .equ RC_PULS_UPDATED = 3 ; new rc-puls value available
 .equ EVAL_I2C = 4 ; if set, new rc puls is evaluated, while waiting for OCT1
 .equ EVAL_SYS_STATE = 5 ; if set, overcurrent and undervoltage are checked
 .equ EVAL_RPM = 6 ; if set, next PWM on should look for current
 .equ EVAL_PWM = 7 ; if set, PWM should be updated

.def flags2 = r25
 .equ RPM_RANGE1 = 0 ; if set RPM is lower than 1831 RPM
 .equ RPM_RANGE2 = 1 ; if set RPM is between 1831 RPM and 3662 RPM
 .equ SCAN_TIMEOUT = 2 ; if set a startup timeout occurred
 .equ POFF_CYCLE = 3 ; if set one commutation cycle is performed without power
 .equ COMP_SAVE = 4 ; if set ACO was high
 .equ STARTUP  = 5 ; if set startup-phase is active
 .equ RC_INTERVAL_OK = 6 ; 
 .equ NO_SYNC  = 7 ;

; here the XYZ registers are placed ( r26-r31)

; ZH = new_duty  ; PWM destination


;**** **** **** **** ****
; RAM Definitions
.dseg     ;EEPROM segment
.org SRAM_START

tcnt1_sav_l: .byte 1 ; actual timer1 value
tcnt1_sav_h: .byte 1
last_tcnt1_l: .byte 1 ; last timer1 value
last_tcnt1_h: .byte 1
timing_l: .byte 1 ; holds time of 4 commutations 
timing_h: .byte 1
timing_x: .byte 1

timing_acc_l: .byte 1 ; holds the average time of 4 commutations 
timing_acc_h: .byte 1
timing_acc_x: .byte 1

rpm_l:  .byte 1 ; holds the average time of 4 commutations 
rpm_h:  .byte 1
rpm_x:  .byte 1

 

wt_comp_scan_l: .byte 1 ; time from switch to comparator scan
wt_comp_scan_h: .byte 1       
com_timing_l: .byte 1 ; time from zero-crossing to switch of the appropriate FET
com_timing_h: .byte 1
wt_OCT1_tot_l: .byte 1 ; OCT1 waiting time
wt_OCT1_tot_h: .byte 1
zero_wt_l: .byte 1
zero_wt_h: .byte 1
last_com_l: .byte 1
last_com_h: .byte 1

stop_rcpuls_l: .byte 1
stop_rcpuls_h: .byte 1
new_rcpuls_l: .byte 1
new_rcpuls_h: .byte 1

duty_offset: .byte 1
goodies: .byte 1
comp_state: .byte 1
uart_command: .byte 1

av_current: .byte 1
max_pwm: .byte 1
i2c_pwm: .byte 1

uart_data: .byte 100  ; only for debug requirements


;**** **** **** **** ****
; ATmega8 interrupts

;.equ INT0addr=$001 ; External Interrupt0 Vector Address
;.equ INT1addr=$002 ; External Interrupt1 Vector Address
;.equ OC2addr =$003 ; Output Compare2 Interrupt Vector Address
;.equ OVF2addr=$004 ; Overflow2 Interrupt Vector Address
;.equ ICP1addr=$005 ; Input Capture1 Interrupt Vector Address
;.equ OC1Aaddr=$006 ; Output Compare1A Interrupt Vector Address
;.equ OC1Baddr=$007 ; Output Compare1B Interrupt Vector Address
;.equ OVF1addr=$008 ; Overflow1 Interrupt Vector Address
;.equ OVF0addr=$009 ; Overflow0 Interrupt Vector Address
;.equ SPIaddr =$00a ; SPI Interrupt Vector Address
;.equ URXCaddr=$00b ; USART Receive Complete Interrupt Vector Address
;.equ UDREaddr=$00c ; USART Data Register Empty Interrupt Vector Address
;.equ UTXCaddr=$00d ; USART Transmit Complete Interrupt Vector Address
;.equ ADCCaddr=$00e ; ADC Interrupt Vector Address
;.equ ERDYaddr=$00f ; EEPROM Interrupt Vector Address
;.equ ACIaddr =$010 ; Analog Comparator Interrupt Vector Address
;.equ TWIaddr =$011 ; Irq. vector address for Two-Wire Interface
;.equ SPMaddr =$012 ; SPM complete Interrupt Vector Address
;.equ SPMRaddr =$012 ; SPM complete Interrupt Vector Address
;-----bko-----------------------------------------------------------------

;**** **** **** **** ****
.cseg
.org 0
;**** **** **** **** ****

;-----bko-----------------------------------------------------------------
; reset and interrupt jump table
  rjmp reset
  nop ; int0
  nop ; ext_int1
  nop ; t2oc_int
  nop ; t2ovfl_int
  nop ; icp1
  rjmp t1oca_int
  nop ; t1ocb_int
  rjmp t1ovfl_int
  rjmp t0ovfl_int
  nop ; spi_int
  nop ; urxc
  nop ; udre
  nop ; utxc
  nop ; adc_int
  nop ; eep_int
  nop ; aci_int
  rjmp twi_int
; not used nop ; spmc_int


version: .db 0x0d, 0x0a
  .db "6a_i2c_410r09 "
version_end: .db 0x0d, 0x0a


;-----bko-----------------------------------------------------------------
; init after reset

reset:  ldi temp1, high(RAMEND) ; stack = RAMEND   ;//Rd,K  // Load Immediate // Rd←K
  out SPH, temp1       ;//P,Rr  // Out Port  // P←Rr
  ldi temp1, low(RAMEND)      ;//Rd,K  // Load Immediate // Rd←K
  out SPL, temp1       ;//P,Rr  // Out Port  // P←Rr
 ; oscillator calibration byte is written into the uppermost position
 ; of the eeprom - by the script 1n1p.e2s an ponyprog
;CLEARBUFFER
;LOAD-PROG 1n1p.hex
;PAUSE "Connect and powerup the circuit, are you ready?"
;READ-CALIBRATION 0x21FF DATA 3     # <EEProm 8Mhz
;ERASE-ALL
;WRITE&VERIFY-ALL
;  ldi temp1,0x01       ;//Rd,K  // Load Immediate  // Rd←K
;  out EEARH,temp1       ;//P,Rr  // Out Port   // P←Rr
;  ldi temp1,$ff       ;//Rd,K  // Load Immediate  // Rd←K
;  out EEARL,temp1       ;//P,Rr  // Out Port   // P←Rr
;  sbi EECR,EERE       ;//P,b   // Set Bit in I/O Register // I/O(P,b)←1
;  in temp1,EEDR       ;//Rd,P  // In Port   // Rd←P
;  out osccal ,temp1  ;schreiben     ;//P,Rr  // Out Port   // P←Rr

 ; portB - all FETs off
  ldi temp1, INIT_PB ; PORTB initially holds 0x00   ;//Rd,K  // Load Immediate  // Rd←K
  out PORTB, temp1       ;//P,Rr  // Out Port   // P←Rr
  ldi temp1, DIR_PB       ;//Rd,K  // Load Immediate  // Rd←K
  out DDRB, temp1       ;//P,Rr  // Out Port   // P←Rr

 ; portC reads comparator inputs
  ldi temp1, INIT_PC       ;//Rd,K  // Load Immediate  // Rd←K
  out PORTC, temp1       ;//P,Rr  // Out Port   // P←Rr
  ldi temp1, DIR_PC       ;//Rd,K  // Load Immediate  // Rd←K
  out DDRC, temp1       ;//P,Rr  // Out Port   // P←Rr

 ; portD reads rc-puls + AIN0 ( + RxD, TxD for debug )
  ldi temp1, INIT_PD       ;//Rd,K  // Load Immediate  // Rd←K
  out PORTD, temp1       ;//P,Rr  // Out Port   // P←Rr
  ldi temp1, DIR_PD       ;//Rd,K  // Load Immediate  // Rd←K
  out DDRd,temp1       ;//P,Rr  // Out Port   // P←Rr

 ; timer0: PWM + beep control = 0x02 ; start timer0 with CK/8 (1탎/count)
  ldi temp1, 0x02       ;//Rd,K  // Load Immediate  // Rd←K
  out TCCR0, temp1       ;//P,Rr  // Out Port   // P←Rr

 ; timer1: commutation control = 0x02 ; start timer1 with CK/8 (1탎/count)
  ldi temp1, T1CK8       ;//Rd,K  // Load Immediate  // Rd←K
  out TCCR1B, temp 1      ;//P,Rr  // Out Port   // P←Rr

 ; reset state flags
  clr flags0        ;//Rd    // Clear Register  // Rd←Rd^Rd
  clr flags1        ;//Rd    // Clear Register  // Rd←Rd^Rd
  clr flags2        ;//Rd    // Clear Register  // Rd←Rd^Rd

 ; clear RAM
  clr XH        ;//Rd    // Clear Register   // Rd←Rd^Rd
  ldi XL, low (SRAM_START)      ;//Rd,K  // Load Immediate   // Rd←K
  clr temp1        ;//Rd    // Clear Register   // Rd←Rd^Rd
clear_ram: st X+, temp1       ;//X+,Rr // Store Indirect and Post-Inc. // (X)←Rr,X←X+1
  cpi XL, uart_data+1       ;//Rd,K  // Compare Register with Immediate // Rd-K
  brlo clear_ram       ;//k     // Branch if Lower   // if(C=1)PC←PC+k+1

 ; power off
  rcall switch_power_off

 ; reset rc puls timeout
  ldi temp1, I2C_TOT       ;//Rd,K  // Load Immediate  // Rd←K
  mov i2c_timeout, temp1      ;//Rd,Rr // Move Between Registers // Rd←Rr
  
; rjmp control_start  ; for simulator only

  rcall wait260ms ; wait a while
  rcall wait260ms

  rcall beep_f1
  rcall wait30ms
  rcall beep_f2
  rcall wait30ms
  rcall beep_f3
  rcall wait30ms
  rcall wait30ms
  rcall wait30ms
  rcall wait30ms
  rcall beep_f4   ; signal: rcpuls ready
  rcall beep_f4
  rcall beep_f4

control_start: ; init variables
  ldi temp1, CHANGE_TIMEOUT      ;//Rd,K  // Load Immediate  // Rd←K
  mov tcnt0_change_tot, temp1      ;//Rd,Rr // Move Between Registers // Rd←Rr
  ldi temp1, NO_POWER       ;//Rd,K  // Load Immediate  // Rd←K
  mov tcnt0_power_on, temp1      ;//Rd,Rr // Move Between Registers // Rd←Rr

  ldi temp1, 0 ; reset error counters    ;//Rd,K  // Load Immediate  // Rd←K
  mov current_err,temp1      ;//Rd,Rr // Move Between Registers // Rd←Rr
  mov sys_control, temp1      ;//Rd,Rr // Move Between Registers // Rd←Rr

 ; init registers and interrupts
  ldi temp1, (1<<TOIE1)+(1<<OCIE1A)+(1<<TOIE0)   ;//Rd,K  // Load Immediate  // Rd←K
  out TIFR, temp1 ; clear TOIE1,OCIE1A & TOIE0   ;//P,Rr  // Out Port   // P←Rr
  out TIMSK, temp1 ; enable TOIE1,OCIE1A & TOIE0 interrupts ;//P,Rr  // Out Port   // P←Rr

  sei   ; enable all interrupts

  ldi temp1, 30       ;//Rd,K  // Load Immediate  // Rd←K
  sts duty_offset, temp1      ;//k,Rr  // Store Direct to SRAM // (k)←Rr

  rcall set_all_timings

  rcall wait30ms

 ; i2c init
  ldi temp1, I2C_ADR+(MOTOR_ID<<1)     ;//Rd,K  // Load Immediate  // Rd←K
  out TWAR, temp1       ;//P,Rr  // Out Port   // P←Rr
  ldi temp1, (1<<TWINT) | (1<<TWEN) | (1<<TWIE) | (1<<TWEA)  ;//Rd,K  // Load Immediate  // Rd←K
  out TWCR, temp1       ;//P,Rr  // Out Port   // P←Rr

  rjmp init_startup
  
;-----bko-----------------------------------------------------------------
; output compare timer1 interrupt
t1oca_int: in i_sreg, SREG       ;//Rd,P  // In Port   // Rd←P
  cbr flags0, (1<<OCT1_PENDING) ; signal OCT1 passed   ;//Rd,K  // Clear Bit(s) in Register // Rd←Rd^(0xFF-K)
  out SREG, i_sreg       ;//P,Rr  // Out Port   // P←Rr
  reti
;-----bko-----------------------------------------------------------------
; overflow timer1 / happens all 65536탎
t1ovfl_int: in i_sreg, SREG       ;//Rd,P  // In Port   // Rd←P
  sbr flags0, (1<<T1OVFL_FLAG)     ;//Rr,b  // Skip if Bit in Register is Set  // if(Rr(b)=1)PC←PC+2or3

  tst t1_timeout       ;//Rd    // Test for Zero or Minus // Rd←Rd&Rd
  breq t1ovfl_10       ;//k     // Branch if Equal  // if(Z=1)PC←PC+k+1
  dec t1_timeout       ;//Rd    // Decrement   // Rd←Rd?1

t1ovfl_10: tst i2c_timeout       ;//Rd    // Test for Zero or Minus // Rd←Rd&Rd
  breq t1ovfl_99       ;//k     // Branch if Equal  // if(Z=1)PC←PC+k+1
  dec i2c_timeout       ;//Rd    // Decrement   // Rd←Rd?1

t1ovfl_99: out SREG, i_sreg       ;//P,Rr  // Out Port   // P←Rr
  reti
;-----bko-----------------------------------------------------------------
; timer0 overflow interrupt
t0ovfl_int: in i_sreg, SREG       ;//Rd,P  // In Port    // Rd←P
  sbrc flags0, I_OFF_CYCLE      ;//Rr,b  // Skip if Bit in Register Cleared // if(Rr(b)=0)PC←PC+2or3
  rjmp t0_on_cycle

t0_off_cycle: sbr flags2, (1<<COMP_SAVE)      ;//Rr,b  // Skip if Bit in Register is Set      // if(Rr(b)=1)PC←PC+2or3
  sbic ACSR, ACO ; mirror inverted ACO to bit-var  ;//P,b   // Skip if Bit in I/O Register Cleared // if(P(b)=0)PC←PC+2or3
  cbr flags2, (1<<COMP_SAVE)      ;//Rd,K  // Clear Bit(s) in Register  // Rd←Rd^(0xFF-K)

 ; changes in PWM ?
  mov i_temp1, tcnt0_power_on       ;//Rd,Rr // Move Between Registers // Rd←Rr
  mov i_temp2, tcnt0_pwron_next      ;//Rd,Rr // Move Between Registers // Rd←Rr
  cp i_temp2, i_temp1       ;//Rd,Rr // Compare   // Rd ? Rr
  brsh lower_pwm  ; next power-on-time is lower or same  ;//k     // Branch if Same or Higher // if(C=0)PC←PC+k+1
higher_pwm: dec tcnt0_change_tot ; change-timeout passed ?   ;//Rd    // Decrement   // Rd←Rd?1
  brne nFET_off  ; .. no      ;//k     // Branch if Not Equal  // if(Z=0)PC←PC+k+1
  ldi i_temp2, CHANGE_TIMEOUT ; .. yes - change-timeout for more power ;//Rd,K  // Load Immediate  // Rd←K
  mov tcnt0_change_tot, i_temp2 ; reset change-timeout and decrement  ;//Rd,Rr // Move Between Registers // Rd←Rr
  dec i_temp1   ; <dec> increases power-on-time   ;//Rd    // Decrement   // Rd←Rd?1
  rjmp set_next_pwm

lower_pwm: breq nFET_off  ; pwm is unchanged    ;//k     // Branch if Equal  // if(Z=1)PC←PC+k+1
  dec tcnt0_change_tot ; change-timeout passed ?   ;//Rd    // Decrement   // Rd←Rd?1
  brne nFET_off  ; .. no      ;//k     // Branch if Not Equal  // if(Z=0)PC←PC+k+1
  ldi i_temp2, CHANGE_TOT_LOW ; .. yes - change-timeout for lower power ;//Rd,K  // Load Immediate  // Rd←K
  mov tcnt0_change_tot, i_temp2 ; reset change-timeout and increment  ;//Rd,Rr // Move Between Registers // Rd←Rr
  inc i_temp1   ; <inc> decreases power-on-time   ;//Rd    // Increment   // Rd←Rd+1

set_next_pwm: mov tcnt0_power_on, i_temp1       ;//Rd,Rr // Move Between Registers // Rd←Rr

댓글 0

조회수 1,901

등록된 댓글이 없습니다.

모터HOME > 모터 > 전체 목록

게시물 검색

2022년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2021년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2020년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2020
모바일버전으로보기