;16 Bits: ;Write H, L ;Read L, H ; ;in r18,SREG pag.80 ;cli ;in temp, xxxL ;in temp2, xxxH ;out SREG,r18 ; ; ou CLI, xxx, SEI // /* +++ Define CASE SENSITIVE +++ */ // //! System clock frequecy. Used to calculate PWM TOP value. #define SYSTEM_FREQUENCY 8000000 //! PWM base frequency. Used to calculate PWM TOP value. #define PWM_BASE_FREQUENCY 20000 //! PWM TOP value. Automatically calculated to give desired \ref PWM_BASE_FREQUENCY. #define PWM_TOP_VALUE (SYSTEM_FREQUENCY / PWM_BASE_FREQUENCY / 2);??? //! I MAX current. 1/10A ???????? #define I_MAX 10 ; ;EPROM variables #define RampL_ini_E $30 #define RampH_Ini_E $31 ;SRAM variables 301/4FF ; #define TX_Buffer_I $0450 ;1/8 for 0451/0458 #define RampH $044F #define RampL $044E #define Ramp_not_end $044D #define RampH_Ini $044C #define RampL_Ini $044B #define SRAM_temp2 $04FF ; #define SRAM_temp $04FE ; #define SQRT_Factor_I $0420 ;2/25 para 420/440, sqrt volta 2/25 (/512) #define TX_MSG_I1 $0410 ;1/15 para 411/41F #define TX_MSG_I2 $0400 ;1/7 para 402/40F #define ADCPos_Ini_I $0302 ;Idx, 1/6 para 303/308 #define ADCPos_Ini_Max $0309 ;MAX value #define ADCPos_Ini_Min $030A ;MIN value #define ADCPos_Calc $030B ;calculated position (0/36) with 3 unit steps ; ;temp vars for startup #define ADCPos_S14 $0310 ; #define ADCPos_S25 $0311 ; #define ADCPos_S36 $0312 ; #define ADCPos_S12 $0313 ; #define ADCPos_S16 $0314 ; #define ADCPos_S23 $0315 ; #define ADCPos_S34 $0316 ; #define ADCPos_S45 $0337 ; #define ADCPos_S56 $0338 ; ;SEQ #define ADCPos_Seq1 $0340 ; #define ADCPos_Seq2 $0341 ; #define ADCPos_Seq3 $0342 ; #define ADCPos_Seq4 $0343 ; #define ADCPos_Seq5 $0344 ; #define ADCPos_Seq6 $0345 ; #define ADCPos_Seq_MaxV $0346 ;Max Value #define ADCPos_Seq_MaxI $0347 ;Idx SEQ Max Value #define ADCPos_Seq_Lim $0348 ;Max/2 #define MUX_BandGap (1<>> 0451 a 0458 SkipLO rjmp WriteW_SRAM_I_Fim ;07/08 bytes ldi YL,Low(@0) ldi YH,High(@0) add YL,@3 ;carry=0. Avoid boundary. inc YL ST Y+, @1 ST Y+, @2 subi @3,-2 Put TX_Buffer_I,@3;status=num buffer bytes WriteW_SRAM_I_Fim: .ENDMACRO ;ReadW_SRAM_I TX_Buffer_I, temp, temp2, status .MACRO ReadW_SRAM_I ;status=num buffer bytes push YL push YH Get @3,@0 ;Read Index (prep read buffer_I) ldi YL,Low(@0) ldi YH,High(@0) ; add YL,@3 ;carry=0. Avoid boundary. inc YL ;read first 2 bytes LD @1, Y+ LD @2, Y+ pop YH pop YL .ENDMACRO ;DelW_SRAM_I TX_Buffer_I, status .MACRO DelW_SRAM_I ;status=num buffer bytes push YL push YH Get @1,@0 ;Read Index (prep read buffer_I) tst @1 breq DelW_SRAM_I_Fim push r1 push r2 push r3 push r4 ldi YL,Low(@0) ldi YH,High(@0) subi YL,-3 ;carry=0. Avoid boundary. LD r1, Y+ ;3 LD r2, Y+ ;4 LD r3, Y+ ;5 LD r4, Y ;6 dec YL ;5 ST -Y,r4 ;4 ST -Y,r3 ;3 ST -Y,r2 ;2 ST -Y,r1 ;1 ;0 cpi @1,7 brlo Del_fim subi YL,-6 ;carry=0. Avoid boundary. LD r1, Y+ ;7 LD r2, Y ;8 dec YL ;7 ST -Y,r2 ;6 ST -Y,r1 ;5 Del_fim: dec @1 SkipEQ dec @1 ;>0 sts @0,@1 ;status=num buffer bytes pop r4 pop r3 pop r2 pop r1 DelW_SRAM_I_Fim: pop YH pop YL .ENDMACRO ;Send TX_BandGap,temp2,temp,status .MACRO xxxSend ; Get @3,TX_Buffer_I ;Read Index (prep read buffer_I) cpi @3,0x06 ;1 a 8 >>> 0451 a 0458 SkipLO rjmp Send_Fim ;07/08 bytes push r16 ldi r16,@0 ldi YL,Low(TX_Buffer_I) ldi YH,High(TX_Buffer_I) add YL,@3 ;carry=0. Avoid boundary. inc YL ST Y+, r16 ST Y+, @1 ST Y+, @2 pop r16 subi @3,-3 Put TX_Buffer_I,@3 ;status=num buffer bytes xxxSend_Fim: rcall TX_UART .ENDMACRO .MACRO xRamp_Factor_CALC push temp push temp2 push temp4 push r2 push r1 push r0 Get temp,RampL Get temp2,RampH Get temp4,Ramp_Factor mul temp4,temp ;R1:R0= RampL_ini*Factor mov r2,r1 ;R2= RampL_ini*Fact/256 mul temp4,temp2 ;R1:R0= RampH_ini*Factor add r0,r2 ;R0= (RampL_ini*Fact/256)+Low(RampH_ini*Factor) brcc Ramp_nocarry inc r1 Ramp_nocarry: put RampH,r1 put RampL,r0 pop r0 pop r1 pop r2 pop temp4 pop temp2 pop temp .ENDMACRO .MACRO xRamp_Root_CALC Get temp,RampL_ini Get temp2,RampH_ini push temp push r2 push r1 push r0 ; mov temp4,Phase_Cnt cpi temp4,2 brlo Ramp_Root_CALC_Fim ; ldi YL,Low(SQRT_Factor_I) ldi YH,High(SQRT_Factor_I) add YL,Phase_Cnt LD temp4, Y+ mul temp4,temp ;R1:R0= RampL_ini*Factor mov r2,r1 ;R2= RampL_ini*Fact/256 mul temp4,temp2 ;R1:R0= RampH_ini*Factor add r0,r2 ;R0= (RampL_ini*Fact/256)+Low(RampH_ini*Factor) brcc nocarry inc r1 nocarry: lsr r1 ror r0 put RampH,r1 put RampL,r0 mov temp4,Phase_Cnt cpi temp4, 16 brlo Ramp_Root_CALC_Fim End_Ramp: puti Ramp_end,11 Ramp_Root_CALC_Fim: pop r0 pop r1 pop r2 pop temp .ENDMACRO ;************************************************** ;Start MACROS ;************************************************** ; SEQ ADCPos_Seq1 ADCPos_S12 ADCPos_S36 ; Seq1=S12-S36 or Seq1=0 .MACRO SEQ ; lds r1,@1 lds r3,@2 sub r1,r3 ;Subtract SkipCC rjmp SEQ0 sts @0,r1 rjmp SEQFim SEQ0: clr r1 sts @0,r1 SEQFim: .ENDMACRO .MACRO Get_MaxMin ; cp @0,r8 SkipLO mov r8,@0 ;max (SH) cp @0,r7 SkipSH mov r7,@0 ;min (LO) .ENDMACRO ;************************************************** ;Motor MACROS ;************************************************** .MACRO Sense_A ldi temp,MUX_A5V ;0x00 Adlar sts ADMUX, temp .ENDMACRO .MACRO Sense_B ldi temp,MUX_B5V ;0x01 Adlar sts ADMUX, temp .ENDMACRO .MACRO Sense_C ldi temp,MUX_C5V ;0x02 Adlar sts ADMUX, temp .ENDMACRO .MACRO Sense_Fall in temp,ACSR sbr temp,(1< % Startup mov temp, PWM_OCR ;OC0B out OCR0B, temp ;OC2A/B sts OCR2A, temp sts OCR2B, temp ; ;OC0B PWM_C0_OFF ldi temp, (1<>> 0451 a 0458 brsh Send_Fim ;7 or more ; push r16 mov r16,temp4 ldi YL,Low(TX_Buffer_I) ldi YH,High(TX_Buffer_I) add YL,status ;carry=0. Avoid boundary. inc YL ST Y+, r16 ST Y+, temp2 pop r16 subi status,-2 sts TX_Buffer_I,status ;status=num buffer bytes Send_Fim: rcall TX_UART ret Send1_NE: ;Send temp4(MSG),temp2,status Get status,TX_Buffer_I ;Read Index cpi status,0x07 ;1 a 8 >>> 0451 a 0458 brsh Send1_Fim ;7 or more ldi YL,Low(TX_MSG_I1) ldi YH,High(TX_MSG_I1) add YL,temp4 LD temp3,Y cp temp3,temp2 brlo Send1_temp2_Bigger sub temp3,temp2 rjmp Send1_Compare Send1_temp2_Bigger: push temp2 sub temp2,temp3 mov temp3,temp2 pop temp2 Send1_Compare: cpi temp3,1 ; limite minimo para fazer SEND !!! (2) brlo Send1_Fim ST Y,temp2 ; push r16 mov r16,temp4 ldi YL,Low(TX_Buffer_I) ldi YH,High(TX_Buffer_I) add YL,status ;carry=0. Avoid boundary. inc YL ST Y+, r16 ST Y+, temp2 pop r16 subi status,-2 sts TX_Buffer_I,status ;status=num buffer bytes Send1_Fim: rcall TX_UART ret Send2_NE: ;Send temp4(MSG),temp2,temp,status Get status,TX_Buffer_I ;Read Index (prep read buffer_I) cpi status,0x06 ;1 a 8 >>> 0451 a 0458 brsh Send2_Fim ;6 or more ldi YL,Low(TX_MSG_I2) ldi YH,High(TX_MSG_I2) add YL,temp4 add YL,temp4 ST Y+,temp2 ST Y,temp ; push r16 mov r16,temp4 subi r16,-16 ldi YL,Low(TX_Buffer_I) ldi YH,High(TX_Buffer_I) add YL,status ;carry=0. Avoid boundary. inc YL ST Y+, r16 ST Y+, temp2 ST Y, temp pop r16 subi status,-3 sts TX_Buffer_I,status ;status=num buffer bytes Send2_Fim: rcall TX_UART ret Init_SRAM: ldi temp,0xFF ldi YL,0x00 ldi YH,0x04 Init_SRAM_loop: ST Y+, temp cpi YL,0x80 brlo Init_SRAM_loop ret Read_ADC_Start: ;Detectar curva e guardar tempo na primeira vez ldi temp2,0 ldi temp,27 DelayVarW_10u lds temp,ADCSRA sbr temp,(1<=128 lsr r1 lsr r2 lsr r3 lsr r4 lsr r5 lsr r6 lsr r7 lsr r8 DeltaLO128: sub r1,r7 ;r8-r7<128 sub r2,r7 ; sub r3,r7 ; sub r4,r7 ; sub r5,r7 ; sub r6,r7 ; sub r8,r7 ; sub r7,r7 ;clr r7 sts ADCPos_Ini_I+1, r1 sts ADCPos_Ini_I+2, r2 sts ADCPos_Ini_I+3, r3 sts ADCPos_Ini_I+4, r4 sts ADCPos_Ini_I+5, r5 sts ADCPos_Ini_I+6, r6 sts ADCPos_Ini_Min, r7 sts ADCPos_Ini_Max, r8 ;0=