Code:
/*************************************************
Name: main()
Zweck:
Date: 12.12.2004
**************************************************/
void
main( void )
{
unsigned int i, uii;
unsigned int uitemp_bak=0;
//Hardware initialisieren
_putbit(0,PSW,11); //Alle Interrupts sperren, bis Konfiguration abgeschlossen ist
_putbit(0,DP1H,4); //Vsync
_putbit(0,DP3,6); //ODD_EVEN
_putbit(1,DP3,13); //L_Drive Output
_putbit(1,P3,13); //L_Drive aktiv
T78CON = 0x04040; //400ns Auflösung, 26ms period, Timer mode für T7 und T8
_bfld(CCM6, 0x00F, 0x0002); //CC24 an T7 haengen, Capture on negative egde Vsync
//I2C Bus konfigurieren
_putbit(1, DP3,9 ); // SDA as output
_putbit(1, DP3,8 ); // SCL as output
//Konfiguriere Capcom6 für Burst und L_Found
_putbit(0,DP1L,0); //neuer Burst an CC60 auf Input
_putbit(0,DP1L,2); //neuer L_Found an CC61 auf Input
_putbit(1,DP1L,4); //CC62 auf Output, PWM für Motor 3 HAND
T12P = 0x0ffff; //T12 soll komplette 16 Bit durchlaufen. Stimmt so, bei 0 geht gar nichts
CTCON = 0x2028; //T12 an, Period 50ns, Shadow transfer, Edge aligned mode, T13 ist aus
CC6MSEL = 0x0166; //CC62 Compare Output, CC61 capture falling edged, CC60 Capture falling edge
//Scheduler konfigurieren
T7REL = T7_RELOAD; //Periode 1ms 63036
T7IC = PRIO_T7OVER; //Interrupt aktivieren, schon läuft der Scheduler
//ADC konfigurieren. Auto scan Contiouus conversion. ADC Start jede ms im Scheduler
_putbit(1,P5DIDIS,0); //Digitalen Eingang an ADC0 P5.0 disablen um Störungen zu reduzieren
_putbit(1,P5DIDIS,1);
_putbit(1,P5DIDIS,2);
//serielle Schnittstelle konfigurieren
init_serio();
S0RIC = PRIO_S0R;
struct_rs232.ucEreignis = NICHTS; //anfangen mit Leer
//Motoren konfigurieren+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//Motoren disablen, damit ich PWM anschalten kann
I2cStart();
I2cSend( 0x42 ); // PCF8574 #2 Motortreiber disasablen
I2cSend( 0x00 );
I2cStop();
I2cStart();
I2cSend( 0x40 ); // PCF8574 #2 Motortreiber disasablen
I2cSend( 0x01F );
I2cStop();
//PWM Output für Motortreiber konfigurieren
_putbit(1,DP8,0); //CC16IO MC0_IN1 auf Output
_bfld(CCM4, 0x0000F, 0x00007); //CC16 an T7 haengen, Compare Mode 3 kein Interrupt
CC16 = 64500;
_putbit(1,DP8,2); //CC18IO MC1_IN1 auf Output
_bfld(CCM4, 0x00F00, 0x00700); //CC18 an T7 haengen, Compare Mode 3 kein Interrupt
CC18 = 64500;
_putbit(1,DP8,3); //CC19IO MC1_IN1 auf Output
_bfld(CCM4, 0x0F000, 0x07000); //CC19 an T7 haengen, Compare Mode 3 kein Interrupt
CC19 = 64500;
//Motorstruct füllen
for(uii = 0; uii < ANZAHL_MOTOREN; uii++){
struct_motor[uii].uiAktiv = 0; //Motor sei noch aus
struct_motor[uii].uiFehler = 5; //erlaube Fehler in Position
struct_motor[uii].uiRichtung = RECHTS;
struct_motor[uii].uiPwm_max = 1400;
struct_motor[uii].uiPwm_min = 250; //darunter bleibt Motor stehen
struct_motor[uii].uiAnfahr = MOTOR_ANFAHR_LANGSAM;
struct_motor[uii].uiGeschwind_akt = 0; //noch fahre ich nicht
}
motor_struct_2_hardware(); // Infos aus motor_struct in Hardware programmieren
//RTC konfigurieren für Pause
T14REL = 0xFFEC; //Prescaler für RTC auf 1.024ms einstellen
_putbit(1, DP1H,5); //Kamera einschalten
_putbit(1, P1H,5); //Kamera einschalten
_putbit(1,PSW,11); //Alle Interrupts freigeben, da Konfiguration fertig
//Holen der analogen Werte mit PEC aufsetzen. Muss geschehen, wenn Interrupt schon enabled ist, da
// sonst Werte nicht von PEC abgeholt werden und überschrieben werden
SRCP7 = (unsigned int ) &ADDAT; //AD-Daten dort holen
DSTP7 = (unsigned int ) &uiADC[0]; //und dorthin schreiben
PECC7 = 0x200 + AD_KANAELE; //Word transfer, alle AD-Kanaele PECen
ADCIC = PRIO_ADC; //Interrupt einschalten
ADCON= 0x0B0B0+AD_KANAELE-1; //Auto scan Contiouus conversion, 12KHz Samplingfrequenz, ab Kanal max (per define)
printf("Programm gestartet\n");
Triggerlevel_bestimmen();
while(1){
Serielle_Befehle_verarbeiten();
//Ein Bild capturen
uiFlag = 0;
uiZeile=0;
_putbit(1,P3,13); //Laser an
for(i=0; i<ZEILEN; i++){
uiTiefe[i] = 1;
}
uiHalbbild = 0;
CC24IC = PRIO_VSYNC; //Interupt fuer Vsync
while(uiFlag == 0); //Warten bis Bild da ist
if(!uiLaser_immer_an){
_putbit(0,P3,13); //Laser wieder aus
}
if(uiVerbose != 0){
printf("Basis: %d Schulter %d Ellbogen %d ", uiADC[ADC_BASIS] & 0x3ff,uiADC[ADC_SCHULTER] & 0x3ff,uiADC[ADC_ELLBOGEN] & 0x3ff);
printf("CC16 %d CC18 %d CC19 %d CC62 %d ", CC16, CC18, CC19, CC62);
printf("Richtung %d %d %d %d ", struct_motor[MOTOR_BASIS].uiRichtung,struct_motor[MOTOR_SCHULTER].uiRichtung,struct_motor[MOTOR_ELLBOGEN].uiRichtung,struct_motor[MOTOR_ZANGE].uiRichtung);
printf("%d \n",struct_motor[MOTOR_ZANGE].uiGeschwind_akt);
/*for(i=0; i<8; i++){
uitemp = uiADC[i] & 0x3ff;
printf("%d %d ",i,uitemp);
}
printf("\n");
*/
}
}
}
Lesezeichen