mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik M32C+UART1


Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?!

Autor: Stefan Kleinwort (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau mal genau hin. In Zeile 32 ist ein Fehler.

Stefan

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was meinst du mit Zeile 32?

Autor: Stefan Kleinwort (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Was meinst du mit Zeile 32?

Dass man Dir ohne Source nicht helfen kann.

Stefan

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der Main steht nur ne
while(1)-SChleife.

Autor: Sven (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
In der init.c stehen die UART1-Initialisierungen.

Autor: Stefan Kleinwort (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Wait1ms im Interrupt habe ich gelöscht, war vorher aber auch nicht
aktiv!

Autor: Stefan Kleinwort (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan Kleinwort (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
In angeh. Datei ist die Zuweisung des Stacks zu sehen.

Autor: Sven (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Axel Rühl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
an Axel
Das da jetzt P4 = LED_ON steht, war nur ein Test zwischendurch. Vorher
stand da p4=~P4. Ergebnis war das gleiche.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.