Interrupts
This commit is contained in:
@ -47,7 +47,7 @@ public class Commands {
|
|||||||
switch (instruction & 0x3800){
|
switch (instruction & 0x3800){
|
||||||
case 0b10000000000000:
|
case 0b10000000000000:
|
||||||
System.out.println("CALL: " + j);
|
System.out.println("CALL: " + j);
|
||||||
CALL (j);
|
CALL (j, true);
|
||||||
addExecutionTime(2);
|
addExecutionTime(2);
|
||||||
return;
|
return;
|
||||||
case 0b10100000000000:
|
case 0b10100000000000:
|
||||||
@ -258,6 +258,7 @@ public class Commands {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void RETFIE() {
|
public static void RETFIE() {
|
||||||
|
DataRegister.setBit(DataRegister.getINTCON(), 7); // GIE wieder setzen
|
||||||
DataRegister.setPC(ProgramStack.pop());
|
DataRegister.setPC(ProgramStack.pop());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -270,12 +271,14 @@ public class Commands {
|
|||||||
DataRegister.setPC(jump-1);
|
DataRegister.setPC(jump-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void CALL(int jump) {
|
public static void CALL(int jump, boolean normalUse) {
|
||||||
ProgramStack.push(DataRegister.getPC()+1);
|
ProgramStack.push(DataRegister.getPC()+1);
|
||||||
|
if (normalUse)
|
||||||
DataRegister.setPC(jump-1);
|
DataRegister.setPC(jump-1);
|
||||||
|
else
|
||||||
|
DataRegister.setPC(jump);
|
||||||
|
|
||||||
addExecutionTime(1);
|
addExecutionTime(1);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void MOVWF(int file) {
|
public static void MOVWF(int file) {
|
||||||
|
|||||||
@ -96,26 +96,26 @@ public class Controller_Frontend {
|
|||||||
return isSleeping;
|
return isSleeping;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void stopRunFromBackend(String message){
|
public static void stopRunFromBackend(String message, boolean resetPC){
|
||||||
isAutoRunActive = false;
|
isAutoRunActive = false;
|
||||||
if (isSleeping)
|
if (isSleeping)
|
||||||
isSleeping = false;
|
isSleeping = false;
|
||||||
else
|
else if (resetPC)
|
||||||
DataRegister.resetPC();
|
DataRegister.resetPC();
|
||||||
Stage stoppedStage = new Stage();
|
// Stage stoppedStage = new Stage();
|
||||||
stoppedStage.setTitle("Programm unterbrochen!");
|
// stoppedStage.setTitle("Programm unterbrochen!");
|
||||||
VBox vbox = new VBox();
|
// VBox vbox = new VBox();
|
||||||
vbox.setAlignment(javafx.geometry.Pos.CENTER);
|
// vbox.setAlignment(javafx.geometry.Pos.CENTER);
|
||||||
Label grundlabel = new Label("Grund: " + message);
|
// Label grundlabel = new Label("Grund: " + message);
|
||||||
grundlabel.setStyle("-fx-font-size: 16px; -fx-font-weight: bold;");
|
// grundlabel.setStyle("-fx-font-size: 16px; -fx-font-weight: bold;");
|
||||||
Label ueberlabel = new Label("Programm unterbrochen!");
|
// Label ueberlabel = new Label("Programm unterbrochen!");
|
||||||
vbox.getChildren().add(ueberlabel);
|
// vbox.getChildren().add(ueberlabel);
|
||||||
vbox.getChildren().add(grundlabel);
|
// vbox.getChildren().add(grundlabel);
|
||||||
VBox.setMargin(grundlabel, new javafx.geometry.Insets(10, 10, 10, 10));
|
// VBox.setMargin(grundlabel, new javafx.geometry.Insets(10, 10, 10, 10));
|
||||||
Scene scene = new Scene(vbox, 300, 90);
|
// Scene scene = new Scene(vbox, 300, 90);
|
||||||
stoppedStage.setAlwaysOnTop(true);
|
// stoppedStage.setAlwaysOnTop(true);
|
||||||
stoppedStage.setScene(scene);
|
// stoppedStage.setScene(scene);
|
||||||
stoppedStage.show();
|
// stoppedStage.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void sleep() {
|
public static void sleep() {
|
||||||
|
|||||||
@ -19,7 +19,6 @@ public class CreateWindow extends Application {
|
|||||||
public static GridPane grid = new GridPane();
|
public static GridPane grid = new GridPane();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
||||||
public void start(Stage primaryStage) throws IOException {
|
public void start(Stage primaryStage) throws IOException {
|
||||||
DataRegister.initDataRegister();
|
DataRegister.initDataRegister();
|
||||||
table = Table.refresh();
|
table = Table.refresh();
|
||||||
|
|||||||
@ -83,7 +83,7 @@ public class EEPROM {
|
|||||||
public static void registerTime(boolean reset) {
|
public static void registerTime(boolean reset) {
|
||||||
if (reset)
|
if (reset)
|
||||||
startTime = getTotalExecutionTime();
|
startTime = getTotalExecutionTime();
|
||||||
else if ((getTotalExecutionTime() >= (startTime + 1000)) && writeControl) {
|
else if ((getTotalExecutionTime() >= (startTime + 1)) && writeControl) {
|
||||||
eecon2stages = new boolean[]{false, false};
|
eecon2stages = new boolean[]{false, false};
|
||||||
DataRegister.setDirectBit(EECON1, EEIF, 1);
|
DataRegister.setDirectBit(EECON1, EEIF, 1);
|
||||||
DataRegister.setDirectBit(EECON1, WR, 0);
|
DataRegister.setDirectBit(EECON1, WR, 0);
|
||||||
|
|||||||
@ -156,10 +156,14 @@ public class IOPorts {
|
|||||||
int bit = params[1];
|
int bit = params[1];
|
||||||
int value = params [2];
|
int value = params [2];
|
||||||
value = (value == 1) ? 0 : 1;
|
value = (value == 1) ? 0 : 1;
|
||||||
|
int oldValue = DataRegister.getDirectBit(port, bit);
|
||||||
DataRegister.setDirectBit(port, bit, value);
|
DataRegister.setDirectBit(port, bit, value);
|
||||||
refreshPorts();
|
refreshPorts();
|
||||||
refreshTable(parent);
|
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) {
|
public static void setLEDs (boolean[] leds) {
|
||||||
|
|||||||
52
src/main/java/fabrik/simulator/pic16f84/Interrupts.java
Normal file
52
src/main/java/fabrik/simulator/pic16f84/Interrupts.java
Normal file
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -32,6 +32,5 @@ public class PreScaler {
|
|||||||
scaler = getFactor();
|
scaler = getFactor();
|
||||||
Timer.increment();
|
Timer.increment();
|
||||||
}
|
}
|
||||||
System.err.println("VT: " + scaler);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -2,10 +2,8 @@ package fabrik.simulator.pic16f84;
|
|||||||
|
|
||||||
public class Timer {
|
public class Timer {
|
||||||
private static final int TIMERREG = 0x1;
|
private static final int TIMERREG = 0x1;
|
||||||
private static final int T0IF = 0x2;
|
|
||||||
private static final int T0SE = 0x4;
|
private static final int T0SE = 0x4;
|
||||||
private static final int T0CS = 0x5;
|
private static final int T0CS = 0x5;
|
||||||
private static final int INTCON = 0x0B;
|
|
||||||
private static final int OPTION = 0x81;
|
private static final int OPTION = 0x81;
|
||||||
|
|
||||||
private static int oldpin = 0;
|
private static int oldpin = 0;
|
||||||
@ -55,8 +53,8 @@ public class Timer {
|
|||||||
int timer = DataRegister.getDirectRegister(TIMERREG);
|
int timer = DataRegister.getDirectRegister(TIMERREG);
|
||||||
timer++;
|
timer++;
|
||||||
if (timer > 0xFF){
|
if (timer > 0xFF){
|
||||||
|
Interrupts.triggerTMR0 ();
|
||||||
DataRegister.setDirectRegister(TIMERREG, 0);
|
DataRegister.setDirectRegister(TIMERREG, 0);
|
||||||
DataRegister.setBit(INTCON, T0IF);
|
|
||||||
} else {
|
} else {
|
||||||
DataRegister.setDirectRegister(1, timer);
|
DataRegister.setDirectRegister(1, timer);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,7 +15,7 @@ public class WatchdogTimer {
|
|||||||
if (Commands.getTotalExecutionTime() >= (watchdogTime + lastReset - 1)) {
|
if (Commands.getTotalExecutionTime() >= (watchdogTime + lastReset - 1)) {
|
||||||
DataRegister.clearBit(3, 4);
|
DataRegister.clearBit(3, 4);
|
||||||
lastReset = Commands.getTotalExecutionTime();
|
lastReset = Commands.getTotalExecutionTime();
|
||||||
Controller_Frontend.stopRunFromBackend("Watchdog Timer");
|
Controller_Frontend.stopRunFromBackend("Watchdog Timer", true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user