📄 asuro 017, build 001, l-r tracksensor controls l-r breakled.c
字号:
//|signal name|COM1A1_X |COM1A0_X |COM1B1_X |COM1B0_X | FOC1A_X | FOC1B_X | WGM11_X | WGM10_X |
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
SFRX ( TCCR1A ,
COM1A1_L |COM1A0_L | //deselect 'timer1 controlling pin OC1A (left engine speed) directly'
COM1B1_L |COM1B0_L | //deselect 'timer1 controlling pin OC1B (right engine speed) directly'
FOC1A_L | FOC1B_L | //set to 0 in PWM mode (for compatibility, see pdf page 96)
WGM11_H | WGM10_L ); //low part of timer1 operating mode 10 selection
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
//+-------------------------------------------------------------------------------------------+
//| TIMSK = Timer/Counter Interrupt Mask Register |
//+-------------------------------------------------------------------------------------------+
//| |
//| OCIE2 = timer/counter2, output-compare-match interrupt enable |
//| TOIE2 = timer/counter2, overflow interrupt enable |
//| TICIE1 = timer/counter1, input-capture interrupt enable |
//| OCIE1A = timer/counter1, equal to output-compare-A-match register, interrupt enable |
//| OCIE1B = timer/counter1, equal to output-compare-B-match register, interrupt enable |
//| TOIE1 = timer/counter1 overflow interrupt enable |
//| RESERVED = unused |
//| TOIE0 = timer/counter0 overflow interrupt enable |
//| |
//+-------------------------------------------------------------------------------------------+
//| enable timer/counter1 interrupt on output compares A and B |
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
//| | Timer2 | Timer2 | Timer1 | Timer1 | Timer1 | Timer1 | - | Timer0 |
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
//|bit number | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
//|signal name| OCIE2_X | TOIE2_X |TICIE1_X |OCIE1A_X |OCIE1B_X | TOIE1_X |RESERVED | TOIE0_X |
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
SFRX ( TIMSK ,
OCIE2_L | TOIE2_L |TICIE1_L |RESERVED | TOIE0_L | //not used
OCIE1A_H |OCIE1B_H | //A + B compare interrupts enable
TOIE1_H ); //timer1 overflow interrupt enable
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
}
//================================================================================//
// ENABLE GLOBAL INTERRUPT //
//================================================================================//
void vEnableGlobalInterrupt(void){
//+-------------------------------------------------------------------------------------------+
//| SREG = Status Register |
//+-------------------------------------------------------------------------------------------+
//| |
//| GIE = I = Global Interrupt Enable |
//| BCS = T = Bit Copy Storage |
//| HCF = H = Half Carry Flag |
//| SB = S = Sign Bit |
//| TCOF = V = Two's Complement Overflow Flag |
//| GIE = I = Global Interrupt Enable |
//| NF = N = Negative Flag |
//| ZF = Z = Zero Flag |
//| CF = C = Carry Flag |
//| |
//+-------------------------------------------------------------------------------------------+
//| programmer settings comment |
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
//|bit number | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
//| SREG | GIE_X | BCS_X | HCF_X | SB_X | TCOF_X | NF_X | ZF_X | CF_X |
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
SFRX ( SREG , GIE_H );
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
// n . . . . . . . = 1 = global interrupt enable
// . n . . . . . . = 1 =
// . . n . . . . . = 1 =
// . . . n . . . . = 1 =
// . . . . n . . . = 1 =
// . . . . . n . . = 1 =
// . . . . . . n . = 1 =
// . . . . . . . n = 1 =
//+-------------------------------------------------------------------------------------------+
}
/*
//================================================================================//
// SELECT LEFT TRACK SENSOR AS AD-CONVERTER INPUT //
//================================================================================//
void vSelectLeftTrackSensorAsAdcInput(void){
//+-------------------------------------------------------------------------------------------+
//| ADMUX = ADC Multiplexer Selection Register |
//+-------------------------------------------------------------------------------------------+
//| |
//| REFSn = select reference voltage source (= maximum measurement voltage value) |
//| ADLAR = left justify or right justify measured value into register ADCH/ADCL |
//| MUXn = select measurement-point to be connected to the AD-converter measurement input |
//| |
//+-------------------------------------------------------------------------------------------+
//| select AVCC pin as reference, use left justify, use left track sensor as measurement-point|
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
//|bit number | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
//| ADMUX | REFS1_X | REFS0_X | ADLAR_X |RESERVED | MUX3_X | MUX2_X | MUX1_X | MUX0_X |
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
SFRX ( ADMUX , REFS1_L | REFS0_H | ADLAR_H |RESERVED | MUX3_L | MUX2_L | MUX1_H | MUX0_H );
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
// n n . . . . . . = 00 = external AREF pin
// n n . . . . . . = 01 = external AVCC pin with capacitor at AREF pin
// n n . . . . . . = 10 = reserved
// n n . . . . . . = 11 = internal 2.56V Voltage Reference with external capacitor at AREF pin
// . . n . . . . . = 0 = right justify => ADCH:ADCL = ......98:76543210
// . . n . . . . . = 1 = left justify => ADCH:ADCL = 98765432:10......
// . . . . n n n n = select AD-Converter measurement input
// n n n n = 0000-0111 = external pins ADC0 - ADC7
// n n n n = 1000-1101 = reserved
// n n n n = 1110 = internal bandgap level 1.23V
// n n n n = 1111 = external AGND pin level
//+-------------------------------------------------------------------------------------------+
}
*/
//================================================================================
// INIT AD-CONVERTER USING INTERRUPT
//================================================================================
void vInitAdConverterUsingInterrupt(void){
//+-------------------------------------------------------------------------------------------+
//| ADMUX = ADC Multiplexer Selection Register |
//+-------------------------------------------------------------------------------------------+
//| |
//| REFSn = select reference voltage source (= maximum measurement voltage value) |
//| ADLAR = left justify or right justify measured value into register ADCH/ADCL |
//| MUXn = select measurement-point to be connected to the AD-converter measurement input |
//| |
//+-------------------------------------------------------------------------------------------+
//| select AVCC pin as reference, use left justify, use left track sensor as measurement-point|
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
//|bit number | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
//| ADMUX | REFS1_X | REFS0_X | ADLAR_X |RESERVED | MUX3_X | MUX2_X | MUX1_X | MUX0_X |
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
SFRX ( ADMUX , REFS1_L | REFS0_H | ADLAR_H |RESERVED | MUX3_L | MUX2_L | MUX1_L | MUX0_L );
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
// n n . . . . . . = 00 = external AREF pin
// n n . . . . . . = 01 = external AVCC pin with capacitor at AREF pin
// n n . . . . . . = 10 = reserved
// n n . . . . . . = 11 = internal 2.56V Voltage Reference with external capacitor at AREF pin
// . . n . . . . . = 0 = right justify => ADCH:ADCL = ......98:76543210
// . . n . . . . . = 1 = left justify => ADCH:ADCL = 98765432:10......
// . . . . n n n n = select AD-Converter measurement input
// n n n n = 0000-0111 = external pins ADC0 - ADC7
// n n n n = 1000-1101 = reserved
// n n n n = 1110 = internal bandgap level 1.23V
// n n n n = 1111 = external AGND pin level
//+-------------------------------------------------------------------------------------------+
//+-------------------------------------------------------------------------------------------+
//| ADCSRA = ADC Control and Status Register A |
//+-------------------------------------------------------------------------------------------+
//| |
//| A complete ad-conversion takes 13 clock cycles (clock speed defined by prescaler) |
//| |
//| ADEN = enable ad-converter (switch ad-converter on, consumes extra current) |
//| ADSC = start ad-conversion (set low by microcontroller if conversion has finished) |
//| ADFR = select free-running mode (checking on ADSC or ADIF bit is useless) |
//| ADIF = ad-converter interrupt flag (is set when conversion has finished, using interrupt) |
//| ADIE = ad-converter interrupt enable (interrupt occurs when conversion has finished) |
//| ADPSn = select ad-converter clock prescaler |
//| |
//+-------------------------------------------------------------------------------------------+
//| ADC Clock frequency should be between 50KHz and 200KHz (.pdf) |
//| |
//| Prescaler ADC clock freq. measured ADC duration (by oscilloscoop) |
//| |
//| 000 8 MHz/ 2 = 4000 KHz 7.8 us |
//| 001 8 MHz/ 2 = 4000 KHz 7.8 us |
//| 010 8 MHz/ 4 = 2000 KHz 10 us |
//| 011 8 MHz/ 8 = 1000 KHz 16 us |
//| 100 8 MHz/ 16 = 500 KHz 30 us |
//| 101 8 MHz/ 32 = 250 KHz 55 us |
//| 110 8 MHz/ 64 = 125 KHz 110 us <--- use these |
//| 111 8 MHz/128 = 63 KHz 230 us |
//| |
//+-------------------------------------------------------------------------------------------+
//| enable ADC, nostart ADC, no free-running, interrupt enabled, clear int. flag, prescaler 6 |
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
//|bit number | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
//| ADCSRA | ADEN_X | ADSC_X | ADFR_X | ADIF_X | ADIE_X | ADPS2_X | ADPS1_X | ADPS0_X |
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
SFRX ( ADCSRA , ADEN_H | ADSC_L | ADFR_L | ADIF_L | ADIE_H | ADPS2_H | ADPS1_H | ADPS0_L );
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
// n . . . . . . . = 1 = AD-Converter enable
// . n . . . . . . = 1 = start AD-conversion
// . n . . . . . . = 0 = AD-conversion finished
// . . n . . . . . = 1 = free running mode
// . . . n . . . . = 1 = interrupt (or: conversion finished)
// . . . . n . . . = 1 = AD-conversion interrupt enable
// . . . . . n n n = ADC prescaler
// . . . . . n n n = 000-111 = adc clock division factors
// . . . . . n n n = 0=2,1=2,2=4,3=8,4=16,5=32,6=64,7=128
//+-------------------------------------------------------------------------------------------+
}
//================================================================================
// INIT TIMER 0
//================================================================================
void vSetupFreeRunningTimer0UsingOverflowInterrupt(void){
//+-------------------------------------------------------------------------------------------+
//| TCCR0 = Timer/Counter Control Register |
//+-------------------------------------------------------------------------------------------+
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -