From 2b1f8871d2a67e6023d2ec905e3345527f3e19d6 Mon Sep 17 00:00:00 2001 From: Darkress <30271678+DarkressX@users.noreply.github.com> Date: Sat, 17 Jun 2023 20:05:58 +0200 Subject: [PATCH] Some watchdog basics --- .../pic16f84sim/microcontroller/Cycles.java | 2 +- .../pic16f84sim/microcontroller/Memory.java | 5 +-- .../microcontroller/ProgramCounter.java | 5 +++ .../pic16f84sim/microcontroller/Timer.java | 32 ++++++++++++------- .../pic16f84sim/microcontroller/Watchdog.java | 29 +++++++++++++++++ 5 files changed, 59 insertions(+), 14 deletions(-) create mode 100644 de/darkress/pic16f84sim/microcontroller/Watchdog.java diff --git a/de/darkress/pic16f84sim/microcontroller/Cycles.java b/de/darkress/pic16f84sim/microcontroller/Cycles.java index 6dc5695..142dacc 100644 --- a/de/darkress/pic16f84sim/microcontroller/Cycles.java +++ b/de/darkress/pic16f84sim/microcontroller/Cycles.java @@ -5,7 +5,7 @@ public class Cycles { public static void incCycles() { - Timer.increaseTimer(); + Timer.decreasePrescaler(); cycles++; } diff --git a/de/darkress/pic16f84sim/microcontroller/Memory.java b/de/darkress/pic16f84sim/microcontroller/Memory.java index e091220..2bd9fbd 100644 --- a/de/darkress/pic16f84sim/microcontroller/Memory.java +++ b/de/darkress/pic16f84sim/microcontroller/Memory.java @@ -54,7 +54,8 @@ public class Memory setDataFromIndirectAddress(indirectAddress, data); return; } - if(address == 0x01) //Reset PrescalerCounter if change on Option or Timer Register + if(address == 0x01 && !Timer.getPrescalerAssignment()) //Reset PrescalerCounter if change on Option or Timer + // Register { Timer.resetTimeToTimerIncrease(); Timer.setCyclesToTimerIncrease(Timer.getCyclesToTimerIncrease() - 1); //Decrease by one to account for @@ -86,7 +87,7 @@ public class Memory private static void setDataFromIndirectAddress(int address, int data) { - if(address == 0x81 || address == 0x01) //Reset PrescalerCounter if change on Option or Timer Register + if((address == 0x81 || address == 0x01) && !Timer.getPrescalerAssignment()) //Reset PrescalerCounter if change on Option or Timer Register { Timer.resetTimeToTimerIncrease(); Timer.setCyclesToTimerIncrease(Timer.getCyclesToTimerIncrease() - 1); //Decrease by one to account for diff --git a/de/darkress/pic16f84sim/microcontroller/ProgramCounter.java b/de/darkress/pic16f84sim/microcontroller/ProgramCounter.java index 0b2a156..9a4e84d 100644 --- a/de/darkress/pic16f84sim/microcontroller/ProgramCounter.java +++ b/de/darkress/pic16f84sim/microcontroller/ProgramCounter.java @@ -36,4 +36,9 @@ public class ProgramCounter pc++; Memory.setPCL(pc & 0x00FF); } + + public static void resetProgramCounter() { + pc = 0; + Memory.setPCL(0x0); + } } diff --git a/de/darkress/pic16f84sim/microcontroller/Timer.java b/de/darkress/pic16f84sim/microcontroller/Timer.java index 40b9cca..1052708 100644 --- a/de/darkress/pic16f84sim/microcontroller/Timer.java +++ b/de/darkress/pic16f84sim/microcontroller/Timer.java @@ -24,7 +24,7 @@ public class Timer cyclesToTimerIncrease = getPrescalerFactor(); } - private static boolean getPrescalerAsssignment() { + public static boolean getPrescalerAssignment() { return (Memory.getOption() & 0x08) == 0x08; } @@ -32,7 +32,7 @@ public class Timer final int MULTIPLIER = 2; int prescalerPower = Memory.getOption() & 0x07; int prescaler = (int)Math.pow(2, prescalerPower); - if(!getPrescalerAsssignment()) + if(!getPrescalerAssignment()) { return prescaler * MULTIPLIER; } @@ -50,17 +50,27 @@ public class Timer Memory.setTimer(timerRegister); } - public static void increaseTimer() + public static void decreasePrescaler() { - if(!timerEnabled()) - { - return; + if(getPrescalerAssignment()) { // Assigned to WatchdogTimer + cyclesToTimerIncrease--; + if(cyclesToTimerIncrease == 0) { + resetTimeToTimerIncrease(); + Watchdog.increaseWatchdogTimer(); + } + } else { + Watchdog.increaseWatchdogTimer(); } - cyclesToTimerIncrease--; - if(cyclesToTimerIncrease == 0) - { - resetTimeToTimerIncrease(); - increaseTimerRegister(); + if(timerEnabled()) { + if(!getPrescalerAssignment()) { // Assigned to timer0 + cyclesToTimerIncrease--; + if(cyclesToTimerIncrease == 0) { + resetTimeToTimerIncrease(); + Timer.increaseTimerRegister(); + } + } else { + Timer.increaseTimerRegister(); + } } } } diff --git a/de/darkress/pic16f84sim/microcontroller/Watchdog.java b/de/darkress/pic16f84sim/microcontroller/Watchdog.java new file mode 100644 index 0000000..d1c4590 --- /dev/null +++ b/de/darkress/pic16f84sim/microcontroller/Watchdog.java @@ -0,0 +1,29 @@ +package de.darkress.pic16f84sim.microcontroller; + +public class Watchdog +{ + private static int watchdogTimer = 18000; + public static int getWatchdogTimer() + { + return watchdogTimer; + } + + public static void increaseWatchdogTimer() + { + watchdogTimer++; + } + + private static void checkWatchdog() + { + if(watchdogTimer > 18000) + { + + } + } + + private static void resetProgram() + { + + } + +}