Hallo,
ich generiere mit der RTC den Second Interrupt und muss laut RM0008 dann
das SECF Flag in RTC_CRL löschen.
Leider macht der µC das aber nicht, weshalb der Interrupt dauernd
hintereinader aufgerufen wird.
Code im Anhang.
Grüße
Dein Code enthält ziemlich wenige allgemein bekannte C-Elemente
(extern,void,while) und ziemlich viele geheime Bezeichner
"bit_is_clear", "RTC_CRL", "sbi", "cbi", "bit_is_clear", ohne deren
Definition keiner weiß, was da passiert.
Das "extern" ist an Funktionen überflüssig, und an einer
Funktions-Definition widersinnig.
Niklas G. schrieb:> Dein Code enthält ziemlich wenige allgemein bekannte C-Elemente> (extern,void,while) und ziemlich viele geheime Bezeichner> "bit_is_clear", "RTC_CRL", "sbi", "cbi", "bit_is_clear", ohne deren> Definition keiner weiß, was da passiert.>> Das "extern" ist an Funktionen überflüssig, und an einer> Funktions-Definition widersinnig.
Das extern ist nicht überflüssig, da die ISR in der Vectortable mit
pubweak definiert ist. Habs ausprobiert, glaub mir...
bit_is_clear ist eine Mnemonik - sollte klar sein was das macht, falls
nicht - siehe Anhang. Gleiches für sbi und cbi.
Leopold N. schrieb:> Das extern ist nicht überflüssig, da die ISR in der Vectortable mit> pubweak definiert ist. Habs ausprobiert, glaub mir...
Ah, IAR-spezifisch? "extern" bedeutet bei Variablen "diese Variable
ist hier nicht definiert, kommt aber später". Diese Logik wäre bei
einer Funktions-Definition etwas komisch, wenn extern bei Funktionen
denn überhaupt eine Wirkung hätte, was bei Standard-C nicht der Fall
ist. Ziemlich sicher nicht funktionieren würde es allerdings mit
"static".
Leopold N. schrieb:> bit_is_clear ist eine Mnemonik
Mnemoniks gibt's nur in Assembler, nicht in C.
Leopold N. schrieb:> sollte klar sein was das macht
Woher? Nur weil es in AVR-Assembler zufällig ein paar Instruktionen gibt
die genau so heißen?
Leopold N. schrieb:> falls> nicht - siehe Anhang. Gleiches für sbi und cbi.
Da sehe ich nur Makros, keine "Mnemoniks".
Deine Makros machen mehrere sinnlose Read-Modify-Write-Zyklen. Mache
doch mal ganz schlicht:
Leopold N. schrieb:> Dein Vorschlag mit einfach Null setzen funzt auch net.
Kannst du im Debugger sehen, ob das "SECF" Flag kurz auf 0 geht?
Leopold N. schrieb:> Mag mich jetzt net über solch unwichtige Sachen streiten.
Die unwichtigen Makro-Definitionen verhindern halt, dass man den Code
lesen kann.
Niklas G. schrieb:> Leopold N. schrieb:>> Dein Vorschlag mit einfach Null setzen funzt auch net.>> Kannst du im Debugger sehen, ob das "SECF" Flag kurz auf 0 geht?>> Leopold N. schrieb:>> Mag mich jetzt net über solch unwichtige Sachen streiten.> Die unwichtigen Makro-Definitionen verhindern halt, dass man den Code> lesen kann.
Ich habe jetzt einfach mal nen Pin togglen lassen, um die wirkliche
Frequenz zu sehen und sie stimmt haargenau... vielleicht wird das Bit
erst gelöscht, wenn man die ISR verlässt. Löschen muss man es trotzdem
in Software, sonst klappts net.
Danke für die Hilfe
Grüße
Leopold N. schrieb:> vielleicht wird das Bit> erst gelöscht, wenn man die ISR verlässt.
Unwahrscheinlich, die RTC-Peripherie weiß nichts davon ob sich der
Prozessorkern in einer ISR befindet oder nicht. Das Schreiben auf
RTC-Register ist aber verzögert.
Leopold N. schrieb:> Ich habe jetzt einfach mal nen Pin togglen lassen, um die wirkliche> Frequenz zu sehen und sie stimmt haargenau...
Woran lag's jetzt? War's von Anfang an richtig?
Niklas G. schrieb:> Leopold N. schrieb:>> vielleicht wird das Bit>> erst gelöscht, wenn man die ISR verlässt.>> Unwahrscheinlich, die RTC-Peripherie weiß nichts davon ob sich der> Prozessorkern in einer ISR befindet oder nicht. Das Schreiben auf> RTC-Register ist aber verzögert.>> Leopold N. schrieb:>> Ich habe jetzt einfach mal nen Pin togglen lassen, um die wirkliche>> Frequenz zu sehen und sie stimmt haargenau...> Woran lag's jetzt? War's von Anfang an richtig?
Ja sieht so aus.
Aber wenn ich das Bit lösche, sehe ich das in der ISR nicht. Gelöscht
wirds aber scheinbar trotzdem
Leopold N. schrieb:> Aber wenn ich das Bit lösche, sehe ich das in der ISR nicht.
Nicht sofort, erst nachdem der Zugriff über die Taktgrenzen
synchronisiert wurde, d.h. nach der Schleife am Ende. Die ist aber
vermutlich gar nicht nötig, wenn du sonst nichts mit der RTC machst.