Hallo zusammen Ich habe hier schon einmal geschrieben und war dankbar für die Hilfe. Ich habe aber immernoch Probleme mit dem einlesen von Daten über den UART. Ich benütze das StarterKit von Infineon mit dem XC866. Das gemeine ist bei der Simulation funktioniert alles. Ich beschäftige mich jetzt mit diesem Problemm schon seit einer Woche, ich komme aber irgendwie nocht vom Fleck. Ich poste hier einmal den Code. Vieleicht erkennt jemand auf anhieb einen Fehler. Initialisiert habe ich das ganze mit DaVE. Gruss Matthias Code: //********************************************************************** ** //********************************************************************** ** //********************************Tariersystem************************** ** //********************************************************************** ** //********************************************************************** ** #include "MAIN.H" #include <stdio.h> #include <math.h> void MAIN_vInit(void) { /// Initialization of module 'GPIO' IO_vInit(); /// Initialization of module 'UART (Serial Interface)' UART_vInit(); /// Initialization of module "ADC" ADC_vInit(); //Timer 2 Initialisieren T2_vInit(); // Interrupt Priority IP = 0x20; // load Interrupt Priority Register // Priorität von T2 IPH = 0x20; // load Interrupt Priority High Register// höher als von UART IP1 = 0x00; // load Interrupt Priority 1 Register IPH1 = 0x00; // load Interrupt Priority 1 High Register EA = 1; //Interupt einschalten ET2 = 1; ES = 1; } //***********Variablen definieren********************************** float winkel; float winkel_print; float x ; float y ; float esum ; float Ausgabe_Stellgroesse ; float e; float Ta; float w = 0; unsigned int Reload_Wert; unsigned int xx; int result; int Kp; int Ki; int Frequenz; int Ua; int Empfangen ; char print_zaehler; //****************Hauptprogramm***************************************** * void main(void) { MAIN_vInit(); TR2 = 1; //Timer2 einschalten TI = 1; // Senden ermöglichen //********AD-Wandler********************************************* while(1) { ADC_PAGE = 0x06; ADC_CRCR1 |= 0x40; // write channel information to be converted ADC_CRMR1 |= 0x40; // generate load event while(ADC_bBusy()); // warten bis Wandlung komplett ADC_PAGE = 0x02; { result = ADC_RESR2H; //Das 8-Bit resultat wird gelesen } PORT_PAGE = 0x00; P3_DATA = result ; // Port3 als Visualisierungsausgang benützen //************Winkelberechnen************************************ winkel = ((result/51.2 - 2.5)/4); winkel = asin(winkel); winkel *= 180; x = winkel; winkel_print = winkel; winkel_print =winkel_print+50.0; print_zaehler++; if(print_zaehler >= 5) { printf (" %.2f ",winkel_print); print_zaehler =0; } //********************************************Motorendanschlag********** *********************** /* if (winkel ==0) { // zaehler reseten zaehler = 0; } if ((zaehler >=1000)||(zaehler <=-1000)) {TR2=0;} else {TR2=1;} */ //****************Motoransteuerung********************************* if (winkel>w) //Motordrehrichtung festlegen {P04 = 0;} //Gewicht nach rechts else //Motordrehrichtung festlegen {P04 = 1;} //Gewicht nach links if ((winkel>(w-4))&& (winkel <(w+4))){ // Halbschrittmodus einschalten P03 = 1; } else { P03 = 0;} if ((winkel >(w-0.4))&&(winkel<(w+0.4))){ P02=0; else { P02=1; } //printf (" %i\t",zaehler); //*****************PI Regler*********************************** w = Empfangen ; // w = 0.0 ; Kp = 20.0 ; Ki = 40.0 ; Ta = 0.01; e = w - x; // Vergleich w = Sollwert x = Istwert esum = esum + e; // Integration I - Anteil if ( esum < -400) {esum = -400;} // Begrenzung I - Anteil if (esum > 400) {esum = 400;} y = Kp * e + Ki Ta esum ; // Reglergleichung if (y < -280) {y = -280;} // Begrenung Stellgrösse if (y > 280) {y = 280;} Ausgabe_Stellgroesse = y; // Übergabe der Stellgrösse //*************Reload Wert ermitteln********************* Ausgabe_Stellgroesse= abs(Ausgabe_Stellgroesse); xx=1668750 / (Ausgabe_Stellgroesse) ; Reload_Wert = (65535 - xx)/(pow(2,8)); //Reload Wert High //***************Empfangen****************************** while(RI == 1) // Warten bis Zeichen im Interrupt anliegt { scanf("%2i",&Empfangen); // dann mit Nicht-Interrupt-Funktion klauen //printf (" %1i ",Empfangen); RI =0; } } }
Mit dem Code ist nicht alles erkennabr, poste bitte auch mal die anderen Files, und wenn es geht auch das DAVE File mit dem du den Code erzeugt hast. Am besten vielleicht als ZIP File. Andere Frage; Warum benutzt du FLOAT, der µC hat keine FPU. Also wird in der LIB alles auf INT umgerechnet. Der Nachteil ist das du dann keinen Einfluß auf die Skalierungen hast, und die Genauigkeit der Berechnung nicht kennst. Es wäre günstiger wenn du die Skalierung, mit der von dir benötigten Genauigkeit, auf INT selbst machst und die Berechnungen mit INT machen lässt. Das hätte den Vorteil das du die Genauigkeit der Berechnung kennst, und das die Berechnungszeit kalkuierbar ist, du kennst ja die Befehle die ausgeführt werden. Ralph
Hallo Raplph Danke das du mir geantwortet hast. In einem anderen Beispielprogramm habe ich es jetzt geschaft einen Wert einzulesen und dann wieder auszulesen. Ich werde es jetzt dann auch mit diesem Programm versuchen. Bis jetzt habe ich die Variable z.B. so definiert (char sagen). Neu habe ich es so versucht: #define BUFFER 10 char sagen [BUFFER]; so hat es im Beispielprogramm funktioniert. Ich bin nicht sicher, vieleicht haben sich verschiedene Werte überschrieben. Gruss Matthias
Hallo Matthias Achte mal auf dem Rambedarf, du solltes bei diesem µC unter 115 Byte IDATA bleiben. Wenn du mehr benötigst bekommst du Probleme mit dem Stack und den internen Registern. Verlagere dann mehr in das XDATA ram. Gruß Ralph
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.