Hallo! Ich beschäftige mich seit geraumer Zeit mit dem MSP430F449. Ich habe mir ein Programm in C# geschrieben welches Daten die über COM0 kommen anzeigt. Das Problem ist folgendes: wenn ich im Debug-Modus Zeile für Zeile durchgehe arbeitet alles so wie es soll. Lass ich das Programm selbstständig arbeiten (ohne Breakpoints und so..) kommt nur Mist am PC an. Allerdings ist immer der selbe Mist zu sehen!! hier der Codeausschitt: #pragma vector = PORT2_VECTOR __interrupt void PORT2(void) { for(int i=0;i<2000;i++){} // wenn diese Zeile nich da ist, schickt er endlos "0" rüber. keine Ahnung warum... int tmp; tmp=1; sent(tmp); if(P2IFG & BIT0){//Interrupt bei PIN 79 // TODO P2IFG &= ~BIT0; // Flag wider aus } else if(P2IFG & BIT1){//Interrupt bei PIN 78 // TODO P2IFG &= ~BIT1; // Flag wider aus } else if(P2IFG & BIT2){//Interrupt bei PIN 77 P2IE &= ~BIT2;//Interrupt PIN77 aus if((~P2IES) & BIT2){//prüfe ob von 0 auf 1 ist tmp = 2; sent(tmp); P2IES |= BIT2; // ändere Flanke }else{ tmp = 3; sent(tmp); P2IES &= ~BIT2; // ändere Flanke } P2IFG &= ~BIT2; // Flag aus P2IE |= BIT2; // Interrupt PIN 77 an } else if(P2IFG & BIT3){//Interrupt bei PIN 76 // TODO P2IFG &= ~BIT3; // Flag wider aus } tmp=4; sent(tmp); } void sent(int x){ while (!(IFG1 & UTXIFG0)); TXBUF0 = x; } Vielen Dank! MFG
Ein tip: Mach mal eine Minimalbeispiel. Irgendetwas funktioniert mit deinem Timing nicht. While Schleifen und senden macht man nicht in einer ISR
Danke für die Antwort! Ja, ich weiss das da keine while schleifen hinkommen. Vielleicht hat das auch mit meinem eigentlich Problem zu tun!?!? :-/ Minimalbeispiel? Wie meinst das? ein kleines Programm das überhaupt mal was zum PC sendet?? Das hab ich! Funktioniert auch tadellos! Es treten nur Fehler auf wenn ich mit diesem Interrupts arbeite... Was meinst du mit Timing?? gz
Stimmt! Int müsste 16 Bit sein. Habe jetzt mal auf Char geändert. Hatte aber leider keinerlei Auswirkung. Bei meinem Minimalbeispiel hatte es auch mit Int funktioniert.... Vielleicht noch ne andere Idee?? Besten Dank nochmal!!
Also beim AVR-GCC sind die Bitnamen keine Masken, sondern die Bitposition (0..7). Vielleicht macht es Dein MSP-Compiler ja auch. Also:
1 | void sent(char x){ |
2 | while (!(IFG1 & 1<<UTXIFG0)); |
3 | TXBUF0 = x; |
4 | }
|
Peter
>Also beim AVR-GCC sind die Bitnamen keine Masken, sondern die >Bitposition (0..7). ich weiss nich was du mir damit sagen möchtest!??! BIT2 ist doch nichts anderes als 0000 0100 oder in dezimal ne 4. Oder Hex 0x04.
1 | while (!(IFG1 & 1<<UTXIFG0)); |
das bewirkt bei mit nur das jetzt garnichts mehr gesendet werden kann. Ich komm nicht mal in die ISR rein.....
Problem gelöst! Habe von woanders einmal den Tip bekommen nur nur in LPM1 zu gehen. (Ich hatte LPM2). Denn muss ich jetzt wohl nochmal nachschauen wo da genau die unterschiede waren! Ich bedanke aber trotzdem für eure Hilfe! MfG der Jens
wie oft gehst du in den lpm2? der oscilator braucht einige zeit um stabil zu werden, nachdem du den prozessor zurückholst.
oft!! der MSP wird nachher mit 4 Taster betrieben und soll auf alle Schaltzustände (also 8) reagieren und sich dann wieder "schlafen legen".
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.