Hi folks, ich sitze seit einiger Zeit am AVR-FPGA Interface und die Datenübertragung vom AVR zum FPGA funktioniert aber nicht umgekehrt. Der Interrupt "RCO" (INT0) sollte im AVR die ISR aufrufen um die Daten vom Bus zu lesen, leider kommt kein Interrupt durch. Was mache ich falsch? process (CLOCK, RESET, INPUT, ENABLE, FIOREA) --sensivity list variable rRCO : std_logic; variable varOUT : std_logic_vector(7 downto 0); begin if CLOCK'event and CLOCK = '0' then if (ENABLE = '1' and FIOREA = '1') then varOUT := "01000001"; rRCO := '1'; else varOUT := "ZZZZZZZZ"; rRCO := '0'; end if; end if; RCO <= rRCO; -- Interrupt for AVR OUTPUT <= varOUT; -- data output -- end process; Was mache ich mit dem ENABLE? In den Atmel Beispielen wird es nie mit einem Kontakt verbunden.. Danke für jegliche Hilfe. Thomas
Sorry, mit dem Stück Sourcecode ist kaum eine Analyse möglich. Warum sind varOUT und rRC0 Variablen ? Nimm doch besser Signale dafür. Warum stehen RESET und INPUT in der Sens-List, wenn sie gar nicht verwendet werden ? Hast Du das ganze mal mit ModelSim simuliert ? Das wäre das erste, was ich machen würde. Hast Du mit nem Scope auf der Interrupt-Leitung gemessen dass der INT wirklich nicht kommt?
Ich habe den Code mit Modelsim simuliert und herausgefunden, dass das ganze Problem wirklich nur am Interrupt liegt. In der Dokumentation (Seite 59)steht, wie man den setzt aber das klappt irgendwie nicht URL: http://www.atmel.com/dyn/resources/prod_documents/doc1138.pdf In den Beispielen von Atmel wurden Variablen statt der Signale benutzt, deshalb habe ich daran auch nix geändert. Die ISR setzt das ENABLE und FIOREA, d.h. der Interrupt muss vor dem Schleifeneintritt aufgerufen werden. Quellcode ISR: SIGNAL (SIG_FPGA_INTERRUPT0) { FISCR = ((1 << XFIS0) | (0 << XFIS1)); //Configure FPGA I/O Select Lines - clear XFIS1 and XFIS0 receive = FISUA; //recv Data fom FPGA and set FIOREA } Kann mir jemand weiterhelfen, wie man den Interrupt setzt? Die Beschreibung in der Doku klingt kompliziert. Thomas
Das Problem lag am Interrupt, welcher manuell um 2 Takte verzögert werden muss, damit er vom AVR erkannt wird. Thomas
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.