LED toggelt nicht

Gast #6212064
Lesenswert?

also meine Therie ist, dass die Wechselzeit, die durch TimerA0 bestimmt 
wird, viel zu schnell ist (2000 Hz). Deswegen hatte ich zu Angfang CLLD 
1 gesetzt, die Änderung der Frequenz/Pulsbreite erst zu übernehemn, wenn 
CCR= erreicht ist. aber das funktioniert auch nicht
Gast #6212225
Lesenswert?

Volker B. schrieb:
> es' mal nach, was das C-Schlüsselwort volatile für eine Funktion hat
Was ich dazu gelesen habe:
Der Operator volatile sagt dem Compiler, dass der Inhalt einer Variablen 
sich außerhalb des normalen Programmflusses ändern kann. Das kann zum 
Beispiel dann passieren, wenn ein Programm aus einer 
Interrupt-Service-Routine einen Wert erwartet und dann über diesen Wert 
einfach pollt

das würde für die Variable i und Wobbel_Dir gelten. als müsste ich vor 
beiden variablen volatile einfügen?
Gast #6212938
Lesenswert?

Eine vereinfache Darstellung:

Stelle dir einfach vor, dass der C Compiler Variablen gerne in CPU 
Registern cached weil der Zugriff darauf schneller ist.

Wenn die Variable innerhalb einer ISR und ausserhalb einer ISR verwendet 
wird, hast du womöglich zwei Caches. Dann sind die Änderungen von der 
ISR ausserhalb der ISR nicht sichtbar (oder umgekehrt).

Das gemeine daran ist, dass der Fehler nicht immer auftritt. Eine 
Codeänderung an ganz anderer Stelle kann das dann aber auslösen.
Gast #6213010
Lesenswert?

lukker schrieb:
> und großen Dank an dich Volker. Hatte das mit volatile nicht auf
> dem
> Schirm, ohne Funktioniert es nicht!

Na Volker, musst dich nicht selbst für Blödsinn belobigen. Der gezeigte 
Code geht ohne volatile, da die Variable nur in einer einzigen 
Funktion verwendet wird!
Gast #6213390
Lesenswert?

MaWin schrieb:
> Volker B. schrieb:
> Les' mal nach, was das C-Schlüsselwort volatile für eine Funktion hat.
>
> Na, das ist jetzt aber ein Eigentor. :-P
> Die Variable Wo... Wird nur in einer Funktion benutzt. Da gibt es kein
> Problem, das volatile lösen könnte.
>
> Hübscher wäre natürlich lokal static.

hi

sorry, aber das ist doch quatsch

wendelsberg
Gast #6213408
Lesenswert?

Stefan ⛄ F. schrieb:
> Zeige dein aktuelles Programm, den Schaltplan und beschreibe dein
> Problem präziser. Am besten wäre, wenn du ein Messprotokoll von einem
> Logic Analyzer bereitstellen würdest.

ein Messprotokoll gibt es nicht. Ich benutze den MSP430F5529, also 
Schaltplan ist frei zugänglich. Mein problem ist folgendes

Was erzeugt werden soll: ein PWM Signals mit variabler Frequenz. D.h., 
dass ich nach jeder Periode sowohl die Frequenz als auch Pulsbreite 
ändere, indem
ich in der ISR eines zweiten Timers eine entsprechende Variable ändere.
Die Wechselzeit des zweiten Timers sollte dabei natürlich schneller sein
als die Frequenz, dass das eign Signal erzeugt. Wenn ich aber jz die
Frequenz über die Variable auf eine kleinere Frequenz einstelle, kann
das zum Überlauf führen. Knann ich das verhindern, indem ich sage, dass 
dem Timer die neue Frequenz und pulsbreite zu einem bestimmten Zeitpunkt 
übergebe
Angehängte Dateien:
Gast #6213432
Lesenswert?

Du toggelst die LED in zwei ISR. Bist du ganz sicher dass das gewollt 
war?

Teile das doch erstmal auf zwei getrennte LEDs auf, dann schauen wir 
weiter.

Ein Messprotokoll wäre schon ziemlich hilfreich, da du die Interaktionen 
der beiden Timer (insbesondere was das Fehlerbild angeht) nicht klar in 
Worte fassen kannst.

> ein Messprotokoll gibt es nicht. Ich benutze den MSP430F5529,
> also Schaltplan ist frei zugänglich.

Der Chip hat 80 Pins, da gibt es viele Möglichkeiten, sie zu beschalten. 
Das musst du uns schon zeigen. Fehlfunktionen kommen nämlich nicht 
selten von falscher Beschaltung - ist logisch, oder?

Nur mal so ein Beispiel, warum dein Text nicht klar ist:

> Wenn ich aber jz die Frequenz über die Variable auf eine kleinere
> Frequenz einstelle, kann das zum Überlauf führen

Welche Frequenz, welche Variable, kleiner als was, was läuft über?

> Knann ich das verhindern, indem ich sage,

Durch "sagen" wird am Verhalten deines Programmes nicht ändern. Du musst 
etwas machen. Du magst jetzt antworten, dass das doch klar war. Aber 
nicht klar war, was du konkret machen willst.

Du hast da viele Informationen im Kopf, die wir auch brauchen, sonst 
können wir dir nicht helfen.

Von welchen konkreten Frequenzen und Pulsbreiten reden wir hier 
überhaupt? Welche stimmen mit deiner Erwartung überein, und wo weichen 
sie ab? Woher weist du das so genau, wenn du kein Messprotokoll hast?
Gast #6213632
Lesenswert?

welche Variablen und Zeiten gemeint sind, wird aus dem beigefügten Code 
ersichtlich. Habe ihn dafür extra aufs Wesentliche zusammengeschrumpft.

Stefan ⛄ F. schrieb:
> Welche Frequenz, welche Variable, kleiner als was, was läuft über?

Die Frequenzen stehen in dem Array Freq, die Werte für die Pulsbreiten 
in dem Array PBreite. Gemeint ist die Variable i, die in der ISR von 
Timer A0 schrittweise inkrementiert wird.

Mit "kleiner als was" ist folgendes gemeint: Je nach dem, welchen Wert 
die Variable Wobbel_Dir hat, wird i inkremntiert oder dekremntiert. Das 
signal sieht dann ähnlich wie die Amplitudenmodulation aus, nur dass die 
Amplitude kontant bleibt =)

über laufen tut das Zählregister des Timer B0, wenn dieser vom Timer A0 
einen kleineren Wert für CCR0 erhält, als wie er breits in der neuen 
Periode gezählt hat.
Gast #6213637
Lesenswert?

lukker schrieb:
> welche Variablen und Zeiten gemeint sind, wird aus dem beigefügten Code
> ersichtlich.

Nein wird es nicht. Soll' ich den jetzt für dich reverse engineeren und 
dann hoffen, dass das auch dem entspricht, was du vor hattest? Soll ich 
raten, woher der Mikrocontroller mit welcher Taktfrequenz versorgt wird?

Weißt du, wenn man so wie du an Probleme heran geht, dann hat man es 
nicht verdient, Erfolg zu haben. Ehrlich Mann, wie kann man nur so faul 
sein!
Gast #6213640
Lesenswert?

Stefan ⛄ F. schrieb:
> Welche stimmen mit deiner Erwartung überein, und wo weichen
> sie ab? Woher weist du das so genau, wenn du kein Messprotokoll hast?

habe die Zeiten ausgrechnet, die sich für die eingestellte Konfiguration 
des Timer B0 für die jeweiligen Arraywerte ergeben sollten. Und es sieht 
zum Beispiel ein Blinder, wenn die Pulsbreite nicht halb so groß ist, 
wie die Frequenz
Gast #6213643
Lesenswert?

Stefan ⛄ F. schrieb:
> Nein wird es nicht. Soll' ich den jetzt für dich reverse engineeren und
> dann hoffen, dass das auch dem entspricht, was du vor hattest? Soll ich
> raten, woher der Mikrocontroller mit welcher Taktfrequenz versorgt wird?
>
> Weißt du, wenn man so wie du an Probleme heran geht, dann hat man es
> nicht verdient, Erfolg zu haben. Ehrlich Mann, wie kann man nur so faul
> sein!

habe doch danach alles beschrieben. ich verstehe dich. Aber ohne den 
Code wirds sehr schwer für mich, es verständlich zu machen
Gast #6213647
Lesenswert?

lukker schrieb:
> Aber ohne den Code wirds sehr schwer für mich,
> es verständlich zu machen

Da ist wohl der Knackpunkt. Wenn du nicht beschrieben kannst, was das 
Programm tun soll und was es stattdessen tut, dann kann Dir keiner 
helfen. Dann kannst du dir nicht einmal selbst helfen. Dazu kommt 
fehlendes Equipment zum nachmessen und visualisieren.

Du musst dir erst einmal selber helfen.
Gast #6213656
Lesenswert?

> es ist kein fehler im Code

Das ist genau die Einstellung, die deinen Weg zur Sackgasse macht.

> Was brauchst du konkret?

Habe ich geschrieben. Aber da du meine Sprache nicht verstehst, warte 
mal ab ob sich hier noch jemand andere meldet, mit dem du dich besser 
verständigen kannst. Ich bin ja nur einer von vielen.
Gast #6213667
Lesenswert?

lukker schrieb:
> du hast viel geschrieben und gleichzeitig wenig. Schade

Ich habe die meiner Meinung nach wichtigen Fragen gestellt. Du hättest 
antworten sollen, dann wären wir weiter gekommen. Du bist meinen Fragen 
aber überwiegend ausgewichen, nur wenige hast du beantwortet.

Nutze die Chance, die Fragen zu beantworten, dann werden andere das 
aufgreifen und weiter machen.

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