Hallo Besucher, der Thread wurde 2,4k mal aufgerufen und enthält 2 Antworten

letzter Beitrag von Unseen am

ARM Pin Change Interrupt

  • Ich bin langsam echt am verzweifeln. Der STM32F4 schafft mich noch ins Irrenhaus. Seit Wochen suche ich einen Fehler den ich einfach nicht fixen kann:



    Die virtuelle 1541 alleine liest Daten vom IEC Bus sauber.


    Ich habe ein zweites IEC Gerät (Emu-Device) implementiert an Geräteadresse 9. Es funktioniert soweit auch, aber eben nicht immer. Der Fehler liegt an der Funktion die ein byte vom IEC Bus liest. Manchmal liest das Emu-Device das erste Bit falsch, und zwar liest es dann 0 statt 1. Es passiert selten, aber es lässt sich immer nachstellen.


    -----------


    Die virtuelle 1541 läuft in einem schnellen Timer Interrupt.


    Das Emu Device läuft in der main loop. Aber die IecGetc() Funktion, die ein Byte vom IEC Bus liest, läuft größtenteils als PinChange Interrupt. Immer wenn DATA oder CLK sich ändern lauft der Interrupt tadellos, es geht kein Event verloren. Der PC Interrupt läuft auf sehr hoher Priorität (ATN höchste, dann CLK, dann DATA, dann alles andere).


    Sobald die 8 Bits übertragen werden, ist die Funktion im richtigen Zustand. Wenn Clk wechselt, löst der PC Interrupt aus. Der erste Befehl im PC Interrupt liest das GPIO und damit den Zustand des DATA Pin. Dieser Zustand wird in die Variable geschoben.


    ----


    Das DATA Bit wird ja erst gesetzt und dann erst das CLK. Daher kann es nicht "zu früh" sein.


    Wenn der CLK Interrupt zu spät käme, also wenn Data bereits wieder high ist, dann wäre klar warum ich 0 bekomme. Aber er müsste unglaublich spät kommen, ziemlich unvorstellbar.


    Wenn die CLK Flanke die falsche wäre (Störimpuls), dann wären die restlichen Bits im Datenbyte nicht ok.


    Und warum immer das erste Bit??!!




    Hat irgendwer eine Idee für mich? Ich bin sicher Betriebsblind inzwischen ... :(

  • Neue Erkenntnis: es hat nichts zu tun mit dem Pin Change Interrupt. Das Emulator Device alleine läuft sauber, stundenlang. Die 1541 Emulation alleine läuft sauber. Fazit: Multitasking ohne OS ist ziemlich tückisch ...


    Das Problem ist, der VIA1 ($1800) Timer 1 hat einen Unterlauf, worauf die virtuelle CPU von einem EOI ausgeht. Ein EOI wird quittiert, indem DATA auf low gezogen wird. Deshalb verliert das Emu Device genau das erste Bit. Da ist wohl irgendwas in der VIA Emulation nicht reentrant ...

  • Fazit: Multitasking ohne OS ist ziemlich tückisch ...


    Aus dem Satz kannst du problemlos das "ohne OS" streichen, auch mit Betriebssystem kann man sich an vielen lustigen Stellen selbst in den Fuss schiessen.