ISR Probleme

OP (Firma: tet) #4394138
Lesenswert?

Hello,

kann es sein, dass eine längere/aufwendigere Funktion() nicht richtig 
funktioniert, sobald man mit Interrupts arbeitet (C-Microcontroller)?
Beim debugging wird mir sobald ich die ISR einfüge nach ca. 1-4 Cycles 
in die Variablen (in der Funktion) = not defined angezeigt.

Grüße
Gast #4394142
Lesenswert?

Joh W. schrieb:
> kann es sein, dass eine längere/aufwendigere Funktion() nicht richtig
> funktioniert, sobald man mit Interrupts arbeitet (C-Microcontroller)?
> Beim debugging wird mir sobald ich die ISR einfüge nach ca. 1-4 Cycles
> in die Variablen (in der Funktion) = not defined angezeigt.

Ja, vielleicht.

Bei mehr Details wäre u.A. auch eine präzisere Antwort möglich.
#4394228
Lesenswert?

@ Joh Wolf (Firma: tet) (hampel)

>kann es sein, dass eine längere/aufwendigere Funktion() nicht richtig
>funktioniert, sobald man mit Interrupts arbeitet (C-Microcontroller)?

Im Normalfall passiert sowas nicht, im Einzelfall ist es aber möglich.

>Beim debugging wird mir sobald ich die ISR einfüge nach ca. 1-4 Cycles
>in die Variablen (in der Funktion) = not defined angezeigt.

Aha. Du hast also ein Problem mit dem Simulator. Das sollte man auch so 
sagen. Meistens tritt das Problem auf, wenn der Optimierer eingeschaltet 
ist. Dann muss man die Simulation mit dem compilierten programm ohne 
Optimierer machen.
OP (Firma: tet) #4394272
Lesenswert?

Leider Nein, weil wenn ich das Programm einfach so durchlaufen lasse und 
die Werte mir über die UART ausgeben lassen --> ab der 2-3 Ausgabe sind 
alle Wert dauerhaft 0 und sobald ich die ISR wieder raus nehme --> 
funktioniert! und löst die ISR so langsam aus, dass sichergestellt wird, 
das die Madgwick() komplett druchgeführt werden kann z.B. mit 1Hz --> 
funktioniert ....
Gast #4394293
Lesenswert?

Joh W. schrieb:
> und sobald ich die ISR wieder raus nehme -->
> funktioniert!

Erstens, du bist nicht auf meinen Beitrag eingegangen.
Schade...

Und dieses hast du auch wohl noch nicht gelesen:
https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmieren_mit_Interrupts
Schade ...


Und vielleicht, das interessiert mich jetzt auch nicht mehr, wirst du 
das SREG retten und wiederherstellen dürfen


Und, was das in der ISR tun soll...
1
if (CpuTimeNow == 65534)
2
  {
3
    CpuTimeNow = 0;
4
  }
Ist das vielleicht ein Witz, oder so...?



PS:
Und sowas traue ich mich als Arduino Jünger zu sagen...
Auch schade....
Gast #4394329
Lesenswert?

Joh W. schrieb:
> Ulrich F. schrieb:
>> Und, was das in der ISR tun soll...if (CpuTimeNow == 65534)
>>   {
>>     CpuTimeNow = 0;
>>   }
>> Ist das vielleicht ein Witz, oder so...?
>
>
> würde ich die if Anweisung mit in die Main() nehmen, könntest du mir
> dann bei meiner Herausforderung einen kleinen Tipp geben?

Die If Anweisung ist komplett über!
16 Bit Variablen machen den Wrap Around automatisch.
Oder verfolgst du damit einen besonderen Zweck?

Mit dem CY8C29466-24PXI und seinen Brüdern kenne ich mich leider nicht 
aus.
OP (Firma: tet) #4394346
Lesenswert?

Ulrich F. schrieb:
> Wäre sowas nicht besser:ISR (NAME_OF_INTERRUPT_vect) {
>
> }

Habe dazu :
#pragma interrupt_handler
<func1> [ ,<func2> ]*


For interrupt handlers written in C. Virtual registers are saved only if
they are used, unless the handler calls another function. In that case,
all Virtual registers are saved.
This interrupt handler changes the ret to reti at the end of the 
function.
The function can be used as an interrupt handler by adding a
ljmp _name at the interrupt vector in boot.tpl. It cannot be used in
regular C code because the reti expects the flags to be pushed on
the stack.
In the large memory model, the Page Pointer registers (CUR_PP,
IDX_PP, MVW_PP, and MVR_PP) are saved and restored in addition
to the Virtual registers for a #pragma interrupt_handler.

gefunden

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