M32C+UART1

Gast #90491
Lesenswert?

Hallo
Gibt es bei der Interrupt-Routine für UART1-Empfang irgendwelche
Besonderheiten zu beachten? (z.B. Reihenfolge beim setzen der Register
oder so was?)

Habe die Routine derzeit so programmiert, daß sie angesprungen wird,
wenn ein Byte über RS232 empfangen wird.(Funktioniert auch!)
In der Routine wird eine LED an- u. ausgeschaltet.
Zu Beginn der "main" wird LED ausgeschaltet, so daß sie mit dem
ersten empfangen Byte immer eingeschaltet wird.Das kann man mit dem
Oszi auch sehen.
Problem ist daß die LED aber nach 5 us wieder ausgeht.
Dieses ein- u. nach 5us wieder ausschalten geschieht bei jedem
gesendetem Byte?!
Gast #90497
Lesenswert?

Wofür ist folgende Zeile im Interrupt:
Wait1ms(50);

Eine Wartezeit im Interrupt sollte grundsätzlich vermieden werden.
Wo ist Wait1ms definiert?

Dein Problem sieht danach aus, dass der Controller entweder ständig
einen Reset bekommt. Dies kann z.B. an fehlender Stack-Initialisierung
liegen. Oder Aufruf von software_reset().
Oder in main() ist die while(1)-Schleife nicht aktiv. Wenn main beendet
wird, dann wird es sofort wieder neu gestartet - und führt damit die
Initialisierung wieder komplett neu aus, also auch LED-Pin -> low.

Stefan
Gast #90498
Lesenswert?

Hab jetzt in die while(1) eine for-Schleife eingebaut mit der die LED
interupt-gesteuert im Sec-Takt ein-7ausgeschaltet wird.
(Funktioniert!)
Sobald ich ein Byte sende verharrt die LED in ihrem Zustand.
D.h. doch zum einen, daß die while(1) aktiv ist und zum anderen kein
Reset ausgelöst wird, weil dann die LED ja wieder toggeln müßte.
Gast #90500
Lesenswert?

>Sobald ich ein Byte sende verharrt die LED in ihrem Zustand.

Schaltet der IR die LED nochmal oder nicht?
Viellecit ist es sinnvoll, 2 unterschiedliche LEDs für den Test zu
benutzen, dann wird Dein Problem vielleicht klarer.

Hast Du den Stack korrekt initialisiert?

Benutzt Du den Debugger für den M32C?

Stefan
Gast #90501
Lesenswert?

LED bleibt direkt in dem Zustand stehen in dem sie sich befindet, sobald
ich am Rechner auf den Senden-Button klicke, schaltet also nicht mehr
um. 2. LED nicht möglich, da es sich um eine fertige Appl. handelt.
Benutze den IAR Compiler und flashe das Program direkt in den
Controller.Debugger wird nicht benutzt.
Zum Stack kann ich im Moment noch nichts sagen, habe das Bsp
"toggle-led" von der Glyn-Homepage runtergeladen und alle
Einstellungens so gelassen und nach und nach meinen Source dazu
gemacht.
Gast #90502
Lesenswert?

Dann wird der Code der IR-Routine wohl garnicht ausgeführt?
Schau mal, ob die IR-Vektoren korrekt sind.

Ob der Stack funktioniert, kannst Du brute-force testen: in main() eine
Funktion (die nicht tun muss) aufrufen. Wenn Du danach nicht wieder in
main() landest, ist der Stack nicht gesetzt.

Ich habe beim M16C nur den nc30 benutzt. Aber auch mit dem IAR-Compiler
sollte Debuggen möglich sein.

Stefan
Gast #90504
Lesenswert?

Hab in der while(1) nach der for-Schleife (Schleife zählt bis 5) für
toggle-LED eine Funktion aufgerufen in der nichts drin steht.
Led toggelt aber ununterbrochen weiter, demnach müßte der Stack gesetzt
sein.

In obiger Datei sind die Interruptvektoren. Da Timer-Int ausgeführt
wird, müßten die wohl stimmen
Angehängte Dateien:
Gast #90505
Lesenswert?

in der RX_ISR wird die LED eingeschaltet,
<Zitat>

        inByte = U1RB;  //Daten aus Buffer holen
        P4 = LED_ON;     //Port-Toggle

</Zitat>

(wobei //PORT-TOGGLE ja so nicht stimmt... "p4=~P4" wäre
port-toggle)
die ISR wird ausgeführt, und danach wird die Main Schleife wieder
durchfahren, die LED geht wieder aus(toggle), die LED sollte doch also
bei jedem empfangenen Zeichen aufblitzen, was du ja am Oszi bestätigen
konntest. Ich denke, hier liegt kein Fehler vor. die 5us sind einfach
die Zeit, die vergeht, bis deine Main Schleife wieder durchlaufen wird.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren