Hallo, ich habe eine Frage zu dem mitgelieferten Beispiel für das Board AT32UC3C-EK von Atmel. Das Beispiel ist folgendermassen aufgebaut: 1. Rx Interrupt wird eingerichtet(aktiviert, ISR ahandler angemeldet) 2. Wenn ein Zeichen empfangen wird, wird die entsprechende ISR aufgerufen in der dann dieser Zeichen als Echo zurückgeschickt wird. Das Ganze funktioniert ohne irgendwelche Änderungen und anpassungen: Compilieren aufs Board laden, fertig. Das ganze funktioniert aber, wenn ich Zeichen für Zeichen in Terminal schicke (hterm). Sobald ich mehrere Zeichen reintippe und aufs "Absenden" drücke, wird das erste Zeichen des Strings oder manchmal auch irgendein Müll empfangen. Meine Fehlersuche ergab bis jetzt: Wenn das erste Zeichen geschickt wurde, ist der uC ja in ISR und versucht in dieser ISR das Zeichen zurück zu schicken, dann trudelt schon das 2. Zeichen an, und ab da springt der uC immer wieder in die ISR und versendet meistens Müll. Der Interrupt request wird also nicht zurück gesetzt. Meine Frage ist also, wie mache ich das manuele Zurücksetzen des Requests bei diesem uC? Und was noch wichtiger, wieso scheitert hier das automatische Rücksetzen des Requests, wo es doch beim "Zeichen für Zeichen" ohne das manuele Eingreifen funktionier? Vielen Dank. Später hänge ich noch entspr. Code
Gast
#2368699
Hallo Franzis, die Beispiele sind immer nur funktional und häufig nur auf ein Thema zugeschnitten. Besser Du suchst Dir eine Demoapplikation, in der ein datenstreaming umgesetzt worden ist. Wenn Du eine Zeichenkette empfangen möchtest, dann solltest Du einen Puffer definieren und zwei Zeiger (Anfang und Ende). Dann kann der Empfang ereignisunabhängig vom Senden durchgeführt werden. Man nennt das auch FIFO. First in First out. Ist allerdings nicht ganz mühelos.
cskulkw schrieb: > die Beispiele sind immer nur funktional und häufig nur auf ein Thema > zugeschnitten. Besser Du suchst Dir eine Demoapplikation, in der ein > datenstreaming umgesetzt worden ist. > > Wenn Du eine Zeichenkette empfangen möchtest, dann solltest Du einen > Puffer definieren und zwei Zeiger (Anfang und Ende). Dann kann der > Empfang ereignisunabhängig vom Senden durchgeführt werden. > > Man nennt das auch FIFO. First in First out. @cskulkw: Vielen Dank für die hilfreihe Antwort. Ich dachte schon deren Beispiel ist schlecht/ mit Fehlern programmiert worden. Ich werde mich nach solch einem Beispiel suchen. @all: Kann jemand was generel zu den Interrupts bei diesem AVR32 sagen, Tips geben? Oder gar zu den USART Interrupts. Hier ist der Code worum es hier geht:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | |
79 | |
80 | |
81 | |
82 | |
83 | |
84 | |
85 | |
86 | |
87 | |
Un dieser "cleared by side effect" scheint wohl nicht immer zu funktionieren und deswegen springt der uC immer wieder in diese ISR.
Keiner, der irgendwas zu den Interrupts bei AVR32 generel oder noch genauer zu den UART Interrupts was sagen?
Gast
#2505233
Hallo Franzis, Ich habe gerade das gleiche Problem und bin über deinen Eintrag gestolpert... Konntest du inzwischen das Problem beheben mit dem clearen des Interruptflags? Würde mir sehr weiterhelfen...
Gast
#2601779
Hallo zusammen, ich habe das gleiche Problem. Hat jemand von euch eine Lösung gefunden? Beste Grüße Locutus
Gast
#2601811
Nachtrag: Bei mir funktioniert der Code solange ich eine Baudrate <3 Mega-Baud verwende. Gehe ich höher, passiert das gleiche wie oben Beschrieben Beste Grüße Locutus
Hallo, ich habe ein sehr sehr ähnliches Problem. Wenn ich ein Zeichen sende, klappt dies wunderbar. Wenn ich aber mehrere direkt hintereinander mit hterm versende, bekomme ich non stop das erste zurückgesendet. Auftreten tut dies auf einem AT32UC3A3256 mit 57600 Baud. Wenn ich die Baudrate auf 9600 senke, dann funktioniert alles. Hat jemand eine Lösung? Gruß Philipp
Gast
#3291025
Hab' auch das Problem. Hat schon jemand eine Lösung!?
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.