PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C-Contron 2 mit C Programmieren



harri81
03.08.2005, 17:45
Hallo,

müssen in einer Studienarbeit die Ansteuerung eines Modellautos mit C-Controll 2 und dem dazugehörigem Application Board realisieren.
Wollen (müssen trifft eher zu!)alles mit C Programieren, haben aber keine Ahnung wie!
Hat da jemand mal einen Tip für uns(Bücher, Links etc.)??
Ein C-Compiler steht uns vielleicht zu Verfügung(erfahren wir nächste Woche).

Ach ja und wie sieht es eigentlich mit Treibern aus? Weiß jemand ob wir da noch spezielle Sachen brauchen!!

Danke schon mal im Vorraus!!!!

lanzelot
08.08.2005, 16:10
Hallo,
bei der C2 ist eine Entwicklungsumgebung mit dabei, sowie sehr einfache Demoprogramme:

http://www.c-control.de/daten/prog.html

harri81
11.08.2005, 11:08
Gibt es schon irgendwelche fertigen C Funktionen zur Ansteuerung des AD Wandlers, der Compare und Capture Unit(PWM) und Timer (Initialisierung, Ein-Ausgabe)???

Muss alles selbst programmieren mit Keil und bin nicht grad ein C-Profi und der Controller ist auch noch neu für mich!

Wäre nett wenn mir jemand so etwas schicken könnte oder mir sagt wo mann soetwas herbekommt.


Danke schon mal im vorraus!

Bernhard667
21.08.2005, 11:49
Hallo Harri81,

anbei mal die main() aus meinem letzen Projekt. Ist allerdings in Tasking Syntax.

Allerdings kann es Dein Problem sicher nicht wirklich lösen.

Zur Konfiguration der ganzen Register des C164 bleibt Dir kaum etwas anderes übrig als:
-ganzes Manual mal lesen (liest sich etwas härter als die Bild Zeitung ;-) ), damit Du einen Überblick hast, was es überhaupt gibt.
-Wenn dann Dein Problem genau klar ist, die enstprechende Einheit des C64 auswählen, die Dein Problem lösen kann -> Pinout ableiten
-In der Beschreibung der Funktionseinheit exakt Bit für Bit das Konfigurationswort festlegen. Häufig müssen mehrere Register gesetzt werden.

Nach den (schulmeisterlichen) Ratschlägen der Code selbst:
Willst Du das ganze Programm?
Könnte ich Dir mailen, wenn gewünscht.

Gruß
Bernhard






/*************************************************
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");
*/
}
}
}

O:) O:)[/code]