From 2294f817668a20930f07b84591bf1131a56734ef Mon Sep 17 00:00:00 2001 From: Paul Martin Date: Sun, 2 Jun 2024 16:37:53 +0200 Subject: [PATCH] Interrupts --- .../fabrik/simulator/pic16f84/Commands.java | 11 ++-- .../pic16f84/Controller_Frontend.java | 32 ++++++------ .../simulator/pic16f84/CreateWindow.java | 1 - .../fabrik/simulator/pic16f84/EEPROM.java | 2 +- .../fabrik/simulator/pic16f84/IOPorts.java | 6 ++- .../fabrik/simulator/pic16f84/Interrupts.java | 52 +++++++++++++++++++ .../fabrik/simulator/pic16f84/PreScaler.java | 1 - .../pic16f84/RBInterruptHandler.java | 26 ---------- .../java/fabrik/simulator/pic16f84/Timer.java | 4 +- .../simulator/pic16f84/WatchdogTimer.java | 2 +- 10 files changed, 83 insertions(+), 54 deletions(-) create mode 100644 src/main/java/fabrik/simulator/pic16f84/Interrupts.java delete mode 100644 src/main/java/fabrik/simulator/pic16f84/RBInterruptHandler.java diff --git a/src/main/java/fabrik/simulator/pic16f84/Commands.java b/src/main/java/fabrik/simulator/pic16f84/Commands.java index 91f1549..383573d 100644 --- a/src/main/java/fabrik/simulator/pic16f84/Commands.java +++ b/src/main/java/fabrik/simulator/pic16f84/Commands.java @@ -47,7 +47,7 @@ public class Commands { switch (instruction & 0x3800){ case 0b10000000000000: System.out.println("CALL: " + j); - CALL (j); + CALL (j, true); addExecutionTime(2); return; case 0b10100000000000: @@ -258,6 +258,7 @@ public class Commands { } public static void RETFIE() { + DataRegister.setBit(DataRegister.getINTCON(), 7); // GIE wieder setzen DataRegister.setPC(ProgramStack.pop()); } @@ -270,12 +271,14 @@ public class Commands { DataRegister.setPC(jump-1); } - public static void CALL(int jump) { + public static void CALL(int jump, boolean normalUse) { ProgramStack.push(DataRegister.getPC()+1); - DataRegister.setPC(jump-1); + if (normalUse) + DataRegister.setPC(jump-1); + else + DataRegister.setPC(jump); addExecutionTime(1); - } public static void MOVWF(int file) { diff --git a/src/main/java/fabrik/simulator/pic16f84/Controller_Frontend.java b/src/main/java/fabrik/simulator/pic16f84/Controller_Frontend.java index 200208d..2f23458 100644 --- a/src/main/java/fabrik/simulator/pic16f84/Controller_Frontend.java +++ b/src/main/java/fabrik/simulator/pic16f84/Controller_Frontend.java @@ -96,26 +96,26 @@ public class Controller_Frontend { return isSleeping; } - public static void stopRunFromBackend(String message){ + public static void stopRunFromBackend(String message, boolean resetPC){ isAutoRunActive = false; if (isSleeping) isSleeping = false; - else + else if (resetPC) DataRegister.resetPC(); - Stage stoppedStage = new Stage(); - stoppedStage.setTitle("Programm unterbrochen!"); - VBox vbox = new VBox(); - vbox.setAlignment(javafx.geometry.Pos.CENTER); - Label grundlabel = new Label("Grund: " + message); - grundlabel.setStyle("-fx-font-size: 16px; -fx-font-weight: bold;"); - Label ueberlabel = new Label("Programm unterbrochen!"); - vbox.getChildren().add(ueberlabel); - vbox.getChildren().add(grundlabel); - VBox.setMargin(grundlabel, new javafx.geometry.Insets(10, 10, 10, 10)); - Scene scene = new Scene(vbox, 300, 90); - stoppedStage.setAlwaysOnTop(true); - stoppedStage.setScene(scene); - stoppedStage.show(); +// Stage stoppedStage = new Stage(); +// stoppedStage.setTitle("Programm unterbrochen!"); +// VBox vbox = new VBox(); +// vbox.setAlignment(javafx.geometry.Pos.CENTER); +// Label grundlabel = new Label("Grund: " + message); +// grundlabel.setStyle("-fx-font-size: 16px; -fx-font-weight: bold;"); +// Label ueberlabel = new Label("Programm unterbrochen!"); +// vbox.getChildren().add(ueberlabel); +// vbox.getChildren().add(grundlabel); +// VBox.setMargin(grundlabel, new javafx.geometry.Insets(10, 10, 10, 10)); +// Scene scene = new Scene(vbox, 300, 90); +// stoppedStage.setAlwaysOnTop(true); +// stoppedStage.setScene(scene); +// stoppedStage.show(); } public static void sleep() { diff --git a/src/main/java/fabrik/simulator/pic16f84/CreateWindow.java b/src/main/java/fabrik/simulator/pic16f84/CreateWindow.java index 391f472..7e1e17b 100644 --- a/src/main/java/fabrik/simulator/pic16f84/CreateWindow.java +++ b/src/main/java/fabrik/simulator/pic16f84/CreateWindow.java @@ -19,7 +19,6 @@ public class CreateWindow extends Application { public static GridPane grid = new GridPane(); @Override - public void start(Stage primaryStage) throws IOException { DataRegister.initDataRegister(); table = Table.refresh(); diff --git a/src/main/java/fabrik/simulator/pic16f84/EEPROM.java b/src/main/java/fabrik/simulator/pic16f84/EEPROM.java index 18141d3..b76a2af 100644 --- a/src/main/java/fabrik/simulator/pic16f84/EEPROM.java +++ b/src/main/java/fabrik/simulator/pic16f84/EEPROM.java @@ -83,7 +83,7 @@ public class EEPROM { public static void registerTime(boolean reset) { if (reset) startTime = getTotalExecutionTime(); - else if ((getTotalExecutionTime() >= (startTime + 1000)) && writeControl) { + else if ((getTotalExecutionTime() >= (startTime + 1)) && writeControl) { eecon2stages = new boolean[]{false, false}; DataRegister.setDirectBit(EECON1, EEIF, 1); DataRegister.setDirectBit(EECON1, WR, 0); diff --git a/src/main/java/fabrik/simulator/pic16f84/IOPorts.java b/src/main/java/fabrik/simulator/pic16f84/IOPorts.java index 91b6117..f324481 100644 --- a/src/main/java/fabrik/simulator/pic16f84/IOPorts.java +++ b/src/main/java/fabrik/simulator/pic16f84/IOPorts.java @@ -156,10 +156,14 @@ public class IOPorts { int bit = params[1]; int value = params [2]; value = (value == 1) ? 0 : 1; + int oldValue = DataRegister.getDirectBit(port, bit); DataRegister.setDirectBit(port, bit, value); refreshPorts(); refreshTable(parent); - + if (port == PORTB && bit >= 4) + Interrupts.triggerRBInterrupt(oldValue, value); + else if (port == PORTB && bit == 0) + Interrupts.triggerRB0Interrupt(oldValue, value); } public static void setLEDs (boolean[] leds) { diff --git a/src/main/java/fabrik/simulator/pic16f84/Interrupts.java b/src/main/java/fabrik/simulator/pic16f84/Interrupts.java new file mode 100644 index 0000000..6967bdd --- /dev/null +++ b/src/main/java/fabrik/simulator/pic16f84/Interrupts.java @@ -0,0 +1,52 @@ +package fabrik.simulator.pic16f84; + +public class Interrupts { + private static final int INTCON = 0xB; + private static final int T0IF = 0x2; + private static final int ISR = 0x4; + private static final int GIE = 0x7; + private static final int T0IE = 0x5; + private static final int RBIE = 0x3; + private static final int RBIF = 0x0; + private static final int INTEDG = 0x6; + private static final int OPTION = 0x81; + private static final int INTE = 0x4; + private static final int INTF = 0x1; + + public static void triggerTMR0() { + triggerInterrupt(T0IF, T0IE); + } + + private static void triggerInterrupt(int flag, int enableFlag) { + DataRegister.setBit(INTCON, flag); + enableFlag = DataRegister.getDirectBit(INTCON, enableFlag); + int globalFlag = DataRegister.getDirectBit(INTCON, GIE); + if (globalFlag == 1 && enableFlag == 1) { + DataRegister.clearBit(INTCON, GIE); + Commands.CALL(ISR, false); + Controller_Frontend.stopRunFromBackend("Interrupt", false); + } + } + + + public static void triggerRBInterrupt(int oldValue, int newValue) { + if (newValue != oldValue){ + triggerInterrupt(RBIF, RBIE); + } + } + + public static void triggerRB0Interrupt(int oldValue, int newValue){ + if (newValue != oldValue){ + int intedg = DataRegister.getDirectBit(OPTION, INTEDG); + if (intedg == 1) { + if (oldValue == 0 && newValue == 1) + triggerInterrupt(INTF, INTE); + } else { + if (oldValue == 1 && newValue == 0) + triggerInterrupt(INTF, INTE); + } + } + } + + +} diff --git a/src/main/java/fabrik/simulator/pic16f84/PreScaler.java b/src/main/java/fabrik/simulator/pic16f84/PreScaler.java index 3331e40..4ed4baa 100644 --- a/src/main/java/fabrik/simulator/pic16f84/PreScaler.java +++ b/src/main/java/fabrik/simulator/pic16f84/PreScaler.java @@ -32,6 +32,5 @@ public class PreScaler { scaler = getFactor(); Timer.increment(); } - System.err.println("VT: " + scaler); } } diff --git a/src/main/java/fabrik/simulator/pic16f84/RBInterruptHandler.java b/src/main/java/fabrik/simulator/pic16f84/RBInterruptHandler.java deleted file mode 100644 index 59781cb..0000000 --- a/src/main/java/fabrik/simulator/pic16f84/RBInterruptHandler.java +++ /dev/null @@ -1,26 +0,0 @@ -package fabrik.simulator.pic16f84; - - - -public class RBInterruptHandler { - - public static void handleRB4Interrupt() { - - System.out.println("RB4 Interrupt durchgeführt"); - } - - public static void handleRB5Interrupt() { - // Aktion durchegfürht - System.out.println("RB5 Interrupt durchgeführt"); - } - - public static void handleRB6Interrupt() { - // Aktion durchegfürht - System.out.println("RB6 Interrupt durchgeführt"); - } - - public static void handleRB7Interrupt() { - // Aktion durchegfürht - System.out.println("RB7 Interrupt durchgeführt"); - } -} diff --git a/src/main/java/fabrik/simulator/pic16f84/Timer.java b/src/main/java/fabrik/simulator/pic16f84/Timer.java index f5be2e2..b1cfa4c 100644 --- a/src/main/java/fabrik/simulator/pic16f84/Timer.java +++ b/src/main/java/fabrik/simulator/pic16f84/Timer.java @@ -2,10 +2,8 @@ package fabrik.simulator.pic16f84; public class Timer { private static final int TIMERREG = 0x1; - private static final int T0IF = 0x2; private static final int T0SE = 0x4; private static final int T0CS = 0x5; - private static final int INTCON = 0x0B; private static final int OPTION = 0x81; private static int oldpin = 0; @@ -55,8 +53,8 @@ public class Timer { int timer = DataRegister.getDirectRegister(TIMERREG); timer++; if (timer > 0xFF){ + Interrupts.triggerTMR0 (); DataRegister.setDirectRegister(TIMERREG, 0); - DataRegister.setBit(INTCON, T0IF); } else { DataRegister.setDirectRegister(1, timer); } diff --git a/src/main/java/fabrik/simulator/pic16f84/WatchdogTimer.java b/src/main/java/fabrik/simulator/pic16f84/WatchdogTimer.java index af6eeb8..6cfc84e 100644 --- a/src/main/java/fabrik/simulator/pic16f84/WatchdogTimer.java +++ b/src/main/java/fabrik/simulator/pic16f84/WatchdogTimer.java @@ -15,7 +15,7 @@ public class WatchdogTimer { if (Commands.getTotalExecutionTime() >= (watchdogTime + lastReset - 1)) { DataRegister.clearBit(3, 4); lastReset = Commands.getTotalExecutionTime(); - Controller_Frontend.stopRunFromBackend("Watchdog Timer"); + Controller_Frontend.stopRunFromBackend("Watchdog Timer", true); } } }