📄 asuro 016, build 001, left tracksensor controls left engine.c
字号:
//disconnect both left engine connections from VCC
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
//|port name | PD7 | PD6 | PD5 | PD4 | PD3 | PD2 | PD1 | PD0 |
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
//|bit number | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
//|pin number | 13 | 12 | 11 | 6 | 5 | 4 | 3 | 2 |
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
//|signal name| ODO_LDS | FRT_LED | REV_LFT | FWD_LFT | SWI_INT | SLD_RED | IR_RXD | IR_TXD2 |
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
SFRX ( DDRD , REV_LFT_O|FWD_LFT_O );
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
SFRX ( PORTD , REV_LFT_H|FWD_LFT_H );
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
//disconnect both right engine connections from VCC
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
//|port name | PB7 | PB6 | PB5 | PB4 | PB3 | PB2 | PB1 | PB0 |
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
//|bit number | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
//|pin number | 10 | 9 | 19 | 18 | 17 | 16 | 15 | 14 |
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
//|signal name| XTAL2 | XTAL1 | REV_RGT | FWD_RGT | IR_TXD1 | SPD_RGT | SPD_LFT | SLD_GRN |
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
SFRX ( DDRB , REV_RGT_O|FWD_RGT_O );
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
SFRX ( PORTB , REV_RGT_L|FWD_RGT_L );
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
//set left/right engine speed ports as output
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
//|port name | PB7 | PB6 | PB5 | PB4 | PB3 | PB2 | PB1 | PB0 |
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
//|bit number | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
//|pin number | 10 | 9 | 19 | 18 | 17 | 16 | 15 | 14 |
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
//|signal name| XTAL2 | XTAL1 | FWD_RGT | REV_RGT | IR_TXD1 | SPD_RGT | SPD_LFT | SLD_GRN |
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
SFRX ( DDRB , SPD_RGT_O|SPD_LFT_O);
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
SFRX ( PORTB , SPD_RGT_L|SPD_LFT_L);
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
//---init-timer-counter-register-1-for-controlling-engine-speeds---//
//CLK-i/o lijkt 8MHz/2=4MHz te zijn!
//In Waveform Generation Mode 1, 8-bit, TOP = 0xFF = 255
//In prescaler mode 1, Counter clock (CLK-i/o) should be external clock (8MHz) but seems to be external clock / 2 (4MHz)
//Frequency = CLK-i/o / 8 / 256 = 4MHz / 8 / 256 = 2KHz
//TCCR1A Timer Counter 1 Control Register A
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
SFRX ( TCCR1A ,COM1A1_H |COM1A0_L |COM1B1_H |COM1B0_L | FOC1A_L | FOC1B_L | WGM11_L | WGM10_H );
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
// n n . . . . . . = 00 : normal port operation
// n n . . . . . . = 01 : toggle OC1A (pin15) on match
// 1 0 . . . . . . = 10 : OC1A (pin15) low on match, high at TOP
// n n . . . . . . = 11 : OC1A (pin15) high on match
// . . n n . . . . = 00 : normal port operation
// . . n n . . . . = 01 : toggle OC1B (pin16) on match
// . . 1 0 . . . . = 10 : OC1B (pin16) low on match, high at TOP
// . . n n . . . . = 11 : OC1B (pin16) high on match
// . . . . 0 0 . . = set to 0 in PWM mode (for compatibility, see pdf page 96)
// . . . . . . 0 1 = nn01 : WGM13-WGM10: Waveform Generation Mode 1, PWM Phase correct 8-bit
// XXnn : see TCCR1B register
//TCCR1B Timer Counter 1 Control Register B
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
SFRX ( TCCR1B , ICNC1_L | ICES1_L | WGM13_L | WGM12_L | CS12_L | CS11_H | CS10_L );
//+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
// 0 . . . . . . . = no noise-canceler (no 4 clock AD conversion delay)
// . 0 . . . . . . = no input-capture selection
// . . x . . . . . = unused
// . . . 0 0 . . . = 00nn : WGM13-WGM10: Waveform Generation Mode 1 (nnXX : see TCCR1A register)
// . . . . . 0 1 0 = Counterclock = Systemclock / 8
//
//set left engine speed to zero
OCR1A=0x00;
//set right engine speed to zero
OCR1B=0x00;
//set left engine direction to forward
SFRX(PORTD,PD4_L|PD5_H);
//set right engine direction to forward
SFRX(PORTB,PB4_L|PB5_H);
}
//================================================================================
// GET LEFT TRACKING INFRARED SENSOR VALUES
//================================================================================
unsigned char vGetLeftTrackingInfraredSensorValues(void){
//---prepair-adconverter-and-select-left-odometer-ir-sensor-as-adconverter-input---//
//REFSn = use eternal pin 20 (AVCC) as ad-converter reference voltage (with capacitor at pin 21 (AREF)
//ADLAR = use 'left justify' as ad-converter result mode, using only highest 8 bits of 10-bit ad-converter value, read from ADCH
//MUXn = select left IR odometer sensor ad-converter3 (ADC3)
SFRX(ADMUX,REFS1_L|REFS0_H|ADLAR_H|MUX3_L|MUX2_L|MUX1_H|MUX0_H);
//select: AD-Converter on, Start conversion, Oneshot mode, no interrupt, prescaler 64
//ADEN = enable ad converter
//ADSC = start ad conversion
//ADFR = disable free running (enable one-shot)
//ADIE = disable ad-conversion-ready interrupt
//ADPS = select prescaler (64x) clock frequency for ad conversion
SFRX(ADCSRA,ADEN_H|ADSC_H|ADFR_L|ADIE_L|ADPS2_H|ADPS1_H|ADPS0_L);
//wait until AD-conversion is finished (ADSC-bit low)
while(CHK_BYTE_BIT_SET(ADCSRA,ADSC_H));
//return highest 8 bits of 10-bit ad-converter value (left justified)
return ADCH;
}
//================================================================================
// MAIN
//================================================================================
int main(void){
//var
//stop 36KHz timer2 (left active by boot sector!) but does not harm anything
SFRX(TCCR2,CS22_L|CS21_L|CS20_L);
//init all ports
vInitAllPorts();
//init engines using mode 1
vInitEnginesUsingMode1();
//endless loop
while(1){
//set left engine speed register according left tracksensor value
OCR1A=vGetLeftTrackingInfraredSensorValues();
}
//exit function
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -