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:
1 | void ISR_RTC(void) { |
2 | if (RTC_CRL & RTC_CRL_SECF) { |
3 | RTC_CRL = 0; |
4 | while(bit_is_clear(RTC_CRL, RTC_CRL_RTOFF)); |
5 | }
|
6 | }
|
Mag mich jetzt net über solch unwichtige Sachen streiten. Dein Vorschlag mit einfach Null setzen funzt auch net. Sonst noch Ideen?
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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.