Grüße, ich befasse mich seit ein paar Tagen mit dem eZdsp-Board von SpectrumDigital. Auf deren Homepage habe ich ein paar nützliche Programmbeispiele gefunden (ADC, LED, PWM etc.) welche alle sehr hilfreich und funktionstüchtig waren. Nun bin ich gerade dabei die PWM-Sachen durch zu gehen und hier fängt mein Problem an. Das Programm hierzu schein auf den 1. Blick zu funktionieren, doch wenn ich mir mittels Oszi die PWM-Signale anschauen will, passiert absolut nix (das Oszi funktioniert ;-))! Wenn ihr eine Idee hättet, wäre ich euch sehr dankbar. LG Jens P.S.: Hier seht ihr den C-Code! #include "DSP281x_Device.h" // DSP281x Headerfile Include File #include "DSP281x_Examples.h" // DSP281x Examples Include File // Prototype statements for functions found within this file. void init_eva(void); void init_evb(void); // Global counts used in this example void main(void) { InitSysCtrl(); EALLOW; // Enable PWM pins GpioMuxRegs.GPAMUX.all = 0x00FF; // EVA PWM 1-6 pins GpioMuxRegs.GPBMUX.all = 0x00FF; // EVB PWM 7-12 pins EDIS; DINT; InitPieCtrl(); IER = 0x0000; IFR = 0x0000; InitPieVectTable(); init_eva(); init_evb(); for(;;); } void init_eva() { // EVA Configure T1PWM, T2PWM, PWM1-PWM6 // Initalize the timers // Initalize EVA Timer1 EvaRegs.T1PR = 0xFFFF; // Timer1 period EvaRegs.T1CMPR = 0x3C00; // Timer1 compare EvaRegs.T1CNT = 0x0000; // Timer1 counter // TMODE = continuous up/down // Timer enable // Timer compare enable EvaRegs.T1CON.all = 0x1042; // Initalize EVA Timer2 EvaRegs.T2PR = 0x0FFF; // Timer2 period EvaRegs.T2CMPR = 0x03C0; // Timer2 compare EvaRegs.T2CNT = 0x0000; // Timer2 counter // TMODE = continuous up/down // Timer enable // Timer compare enable EvaRegs.T2CON.all = 0x1042; // Setup T1PWM and T2PWM // Drive T1/T2 PWM by compare logic EvaRegs.GPTCONA.bit.TCMPOE = 1; // Polarity of GP Timer 1 Compare = Active low EvaRegs.GPTCONA.bit.T1PIN = 1; // Polarity of GP Timer 2 Compare = Active high EvaRegs.GPTCONA.bit.T2PIN = 2; // Enable compare for PWM1-PWM6 EvaRegs.CMPR1 = 0x0C00; EvaRegs.CMPR2 = 0x3C00; EvaRegs.CMPR3 = 0xFC00; EvaRegs.ACTRA.all = 0x0666; EvaRegs.DBTCONA.all = 0x0000; // Disable deadband EvaRegs.COMCONA.all = 0xA600; } void init_evb() { EvbRegs.T3PR = 0xFFFF; // Timer3 period EvbRegs.T3CMPR = 0x3C00; // Timer3 compare EvbRegs.T3CNT = 0x0000; // Timer3 counter EvbRegs.T3CON.all = 0x1042; // Initialize EVB Timer4 // Timer4 controls T4PWM EvbRegs.T4PR = 0x00FF; // Timer4 period EvbRegs.T4CMPR = 0x0030; // Timer4 compare EvbRegs.T4CNT = 0x0000; // Timer4 counter // TMODE = continuous up/down // Timer enable // Timer compare enable EvbRegs.T4CON.all = 0x1042; // Setup T3PWM and T4PWM // Drive T3/T4 PWM by compare logic EvbRegs.GPTCONB.bit.TCMPOE = 1; // Polarity of GP Timer 3 Compare = Active low EvbRegs.GPTCONB.bit.T3PIN = 1; // Polarity of GP Timer 4 Compare = Active high EvbRegs.GPTCONB.bit.T4PIN = 2; // Enable compare for PWM7-PWM12 EvbRegs.CMPR4 = 0x0C00; EvbRegs.CMPR5 = 0x3C00; EvbRegs.CMPR6 = 0xFC00; EvbRegs.ACTRB.all = 0x0666; EvbRegs.DBTCONB.all = 0x0000; // Disable deadband EvbRegs.COMCONB.all = 0xA600; }
So auf den ersten Blick würde ich sagen du hast die entsprechenden Pins nicht als Ausgang gesetzt. Beim Starten sind diese aus Sicherheitsgründen (hochohmige) Eingänge und das musst du ändern. Details & Code siehe DSP281x_Gpio.c
Das ist auch nicht das Problem. Habe GPADIR schon auf 0xFFFF bzw. zu Testzwecken auf 0x0000 gesetzt. Ohne Erfolg!
Jens schrieb: > Das ist auch nicht das Problem. Habe GPADIR schon auf 0xFFFF bzw. zu > Testzwecken auf 0x0000 gesetzt. Ohne Erfolg! Es mag vielleicht noch ein anderes Problem dazukommen - um GPxDIR musst du dich aber auf jeden Fall kümmern. An welchen Pins mißt du, wenn ich blöd fragen darf?
Am Board ist es die Buchsenleiste P8 (Pin 9 bis 14 und GND). Am Controller wären es die Pins 92, 93, 94, 95, 98 und 101. Das wäre jetzt nicht gerade förderlich für mein Ego, wenn ich an den falschen Pins gemessen hätte^^! Aber andererseits, hauptsache ich komme mit meinem Projekt weiter!
OK. Schau dir das Ganze nochmal an. Folgende Register musst du konfigurieren: TxPR, TxCNT, TxCON, CMPRy, ACTRz, DBTCONz, COMCONz (x=1...2, y=1...3, z=A...B). Zumindest funktioniert es damit bei mir (PWM1...PWM6 als 3phasige PWM mit Totzeit). GPxMUX und GPxDIR nicht vergessen. Wenn du nur PWM1...PWM6 nutzen möchtest brauchst du dich um GPTCONx nicht kümmern. Das brauchst du nur wenn du TxPWM benötigst. Event Manager B brauchst du auch nicht unbedingt, das hängt aber davon ab was du insgesamt vorhast. Wobei es wirklich interessant ist, dass das TI-Beispiel nicht zu funktionieren scheint... Leider habe ich gerade keine Möglichkeit das zu testen. Die *.cmd-Files sind in Ordnung und du kannst Pins setzen und löschen?
Das Eigenartige ist, ich habe gerade CCS neu gestartet und jetzt läuft das Bspl-Programm und auch mein Eigenes! Jedoch sobald ich ein anderes Programm starte, bsplw. Gpio_Toggle (welches auch funktioniert) und anschließend wieder mein PWM-Programm starte, funktioniert dieses wieder nicht! Sehr mysteriös!
Nach deine Beschreibung stimmt eindeutig die Initialisierung nicht. Der TI behält bestimmt Registerwerte/Einstellungen bei, wenn kein Reset erfolggt, die Stromversorgung beigehalten wird und einfach eine neue SW geflasht wird. Aus diesem grund sollte jedes Flash oder SRAM Projekt einmal geprüft werden, wenn das System vorher resetet wurde.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.