Forum: Mikrocontroller und Digitale Elektronik M88 VUSB + INT1-- ISR wird nur einmalig ausgeführt


von Onit (Gast)


Lesenswert?

Moin.
Ich hänge seit3 Tagen am selben Problem:
Habe ein RFM12 in das VUSB-Projekt integriert.(WinAVR(letzte 
Version)+PonyProg)
Habe den INT1 zum NIRQ-Erfassen eingestellt. Jedoch wird die ISR vom 
INT1 nur einmalig ausgeführt. Selbst eine Neuinitialisierung bringt nix. 
Signale am INT1 sind vorhanden und stimmen.
Flanken sind richtig eingestellt, INT1 ist aktiviert, Flags manuell 
löschen bringt auch nichts, und ich deaktiviere den Globalen INT 
nirgendwo im gesamten Softwarekonstrukt. PullUp-Änderung des INT1-Pins 
bewirkt auch nix.
Den PCINT kann ich nicht verwenden.
Ich vermute den Vector der INT1-ISR oder das VUSB-Projekt oder ......
I brauch Hefe...... :-)
Teste gerade ob es bei dem PCINT die ISR mehrfach aufgerufen werden 
kann.
Hat jemand eine Vermutung?
Danke!

von Onit (Gast)


Lesenswert?

Hier noch etwas Code:
Das Programm läuft ohne Probleme,jedoch ändern sich NIRQChange und die 
Leds nur bei der 1. steigenden Flanke.

ISR(INT1_vect)//NIRQ
//ISR(SIG_INTERRUPT1)
//SIGNAL(SIG_INTERRUPT1)//NIRQ
  {
    //extern volatile unsigned char NIRQChange;


    NIRQChange=1;
    //asm volatile ("nop"  );

    WhiteOn;;
    GreenOff;

    //EICRA=0x08;//Int1 auf falling Edge
    //EIMSK=0x02;//Int1 aktivieren
    //EIFR = 0x02;//Flags löschen (write a logical 1)

  }
------------------------------------------------------------------------
main:
------------------------------------------------------------------------
IO-Init();
Read_Status_out_of_EEROM();
Timer_Init();//für USB Poll

    switch(Status)
    {
      case 5:
        if(init)
          {
            init=0;

            EICRA=0x0C;//Int1 auf rising Edge

            EIFR = 0x02;

            EIMSK=0x02;

            sei();

          }


      //RXData_RFM12_M88() setzt NIRQChange bei erfolgreichem Empfang 
auf 0
      //                   und ändert die LED-Zustände aus der ISR
      //                   ändert nix an den Int-Einstellungen

       if(RXData_RFM12_M88())
          {
            //cli();//war einer der Zigtausend Tests

            usart_write_char(RadioCommand);//Wert aus RXData_RFM12_M88()
            usart_write_char(RadioData);//Wert aus RXData_RFM12_M88()

            init=1; //soltte eigentlich nicht nötig sein.....
          }


      break;

      default:
        //usart_write_str("\r\n ERROR: Status undefined\r\n");
      break;
}

von Onit (Gast)


Lesenswert?

Folgendes Reaktiviert die Int1-ISR (Welches Led ist egal):

WhiteOn; // alias (PORTC |= 0x02)
Waitms(1);//egal welcher Wert
WhiteOff;

Sobald eine der 3 Zeilen fehlt, wird die ISR nicht mehr angesprochen.
Hört sich nach ISR-Vektoren an......bezüglich Rücksprugadresse.

von Achim M. (minifloat)


Lesenswert?

Hast du eine mainloop? Oder läuft die main() einfach zuende?
Wenn letzteres der Fall ist bzw. nach allen Inits nichts mehr getan 
werden muss, dann einfach ein
1
for(;;)
2
  ;
vor das
1
return(0);
setzen.

Zusätzliche Interrupts neben dem USB-Interrupt können auch einiges 
durcheinander bringen. Die Atmels haben keinen Interrupt Priority 
Controller. Wenn deine Timer-ISR anspringt und läuft und es kommt 
währenddessen ein USB-Interrupt(damit meine ich den Pin in Hardware), 
hast du verloren. Der USB-Vektor wird nach Ablauf der Timer-ISR 
angesprungen, weil das Flag ja noch gesetzt ist. Dann ist es u.U. schon 
zu spät.
Hast du schon mit verschiedenen Optimierungsstufen rumgespielt?
mfg mf

von Onit (Gast)


Lesenswert?

Hatte hier nur Codeteile reingestellt. Eine for(;;)-Schleife existiert 
natürlich. Hatte auch schon sämtliche Optimierungsstufen durch. Habe 
Interrupts schon mehrfach mit anderen Atmels gemacht. Da gab es nie 
Probleme. Mal abgesehen von der USB-Funktionalität wundert es mich 
immernoch das die INT1-ISR nur einmal aufgrufen wird, bis ich

WhiteOn; // alias (PORTC |= 0x02)
Waitms(1);//egal welcher Wert
WhiteOff;

abarbeite.

Welche(s) LED ich anspreche ist egal. Ob einzeln oder alle zusammen.

von Achim M. (minifloat)


Lesenswert?

Wie sieht denn Whiteoff(); und Greenoff(); aus?
Setzen und löschen die willkürlich irgendeinen Portpin-Status?
Kommt das mit den USB-Pins in die Quere?
mfg mf

von Tobi L. (derarzt)


Lesenswert?

Mini Float schrieb:
> Wie sieht denn Whiteoff(); und Greenoff(); aus?
> Setzen und löschen die willkürlich irgendeinen Portpin-Status?
> Kommt das mit den USB-Pins in die Quere?
> mfg mf

habe ein ähnliches problem^^ hast du es gelöäst bekommen?

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
Noch kein Account? Hier anmelden.