Gast
#2547260
Hallo, ich habe auf einem STM32F107VC ein Programm geschrieben um Protokolle auszugeben. Die Protokolle lassen sie bei einer von au?en angelegten Frequenz an einem GPIO über einen weiten Frequenzbereich ausgeben. Ich möchte diese Protokolle nun allerdings auch über einen internen Frequenzgenerator ausgeben lassen. Dummerweise kommt es dabei zu Fehlern. Vielleicht kann mir einer helfen. Fehlerbeschreibung: - Ausgabe funktioniert, auch mit Überläuften gut, bis zu einer Frequenz von ca. 1/1200µs. (Höhere Frequenzen sind auch kein Problem) - Wird die Frequenz niedriger gewählt, wird die Protokollausgabe doppelt aufgerufen und zwar direckt nach der letzten Ausgabe. Bei weiterer gringer Frequenzerhöhung vervierfacht sich die Protokollanzahl auf ihr Maximum. -Wird die Frequenz weiter heruntergesetzt kommt es nicht zu einer weiteren Erhöhung der Protokollanzahl, aber die Protokolle sind gestört (zeitliche Sprünge bei gewissen Frequenzen) Die Idee ist, dass ich eine Frequenz in Form von einer 32-Bit Variablen einlese, die Überläufe in die Timererweiterung schreibe (alles was größer als 16 Bit ist)und diese Erweiterungen abarbeite. Sind alle Erweiterungen abgearbeitet wird der übrig bleibende 16-Bit Wert als neuer Startwert des Protokolls vorgegeben. Dieser Wert wird von einer anderen Funktion genutzt um das Protokoll auszugeben. Die Funktionen arbeiten alle ordnungsgemäs wenn man sie durch externe Interrupts aufruft. Der Fehler muss also in der Frequenzvorgabe liegen. Am Ende der Frequenzvorgabe wird noch der CaptureCompare Wert auf den neuen Startwert gelegt und das Spiel geht von vorn los.
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 | |
"Flag_pos_Flanke_ausgegeben" und Flag_neg_Flanke_ausgegeben" teilen mit dass das Protokoll vollständig ausgegeben wurde "ADC1_Konv_Wert = 5000" Gibt an dass eine Highflanke detektiert wurde, da das Programm bei externen Flanken die Pegel noch einmal auf ihre Höhe untersucht "Merker_High_Flanke" lässt den Start einer Funktion zu, die den Wert "n_Timer4_Ausgabe_Startwert_pos" an ihre Entgültige Variable weiter gibt, die dann als Comparereferenz für die Ausgabe des Protokols dient. Das ganze Programm läuft also im Polling-Verfahren, lediglich die Ausgabe des Protokols wird durch einen Interrupt aufgerufen. Tests haben gezeigt dass das es keine Zeitkritischen Momente gibt. Weiterhin habe ich festgestellt, dass auch der Überlaufzähler im bereich der fehlerfreien Frequenzen bereits eingesetzt hat und arbeitet. Die letzte If-Bedingung löst jedoch im Fehlerfall zu oft aus und die If Bedingung des Überlaufzählers wird unregelmäsiger aufgerufen. Die Protokollabstände die sich bei in dem von mir als fehlerfrei angegebenen Bereich einstellen stimmen mit den vorgegebenen Werten überein. Somit ist dieser Bereich wirklich der gewünschte und nicht etwa umgedreht. Die Timer arbeiten mit 72 MHz. Ich hoffe ich habe jetzt nichts vergessen. Gruß