-         

Ergebnis 1 bis 4 von 4

Thema: C-Contron 2 mit C Programmieren

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    03.08.2005
    Beiträge
    5

    C-Contron 2 mit C Programmieren

    Anzeige

    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!!!!

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    21.10.2004
    Beiträge
    5

    Siehe dort

    Hallo,
    bei der C2 ist eine Entwicklungsumgebung mit dabei, sowie sehr einfache Demoprogramme:

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

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    03.08.2005
    Beiträge
    5
    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!

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    03.04.2005
    Beiträge
    181
    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




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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •