Prescaler, Watchdog, (Cycle-) Timer

This commit is contained in:
2024-05-13 20:53:56 +02:00
parent 3722bff281
commit af17397a1c
6 changed files with 117 additions and 91 deletions

View File

@ -1,93 +1,27 @@
package fabrik.simulator.pic16f84;
import java.util.Timer;
import java.util.TimerTask;
public class WatchdogTimer {
private int prescaler;
private int counter;
private final int MAX_PRESCALER = 128;
private static long watchdogTime;
private static long lastReset = 0;
public WatchdogTimer(int prescaler) {
this.prescaler = Math.min(prescaler, MAX_PRESCALER);
this.counter = 0;
private static long getTimeFromRegister() {
return (PreScaler.isPrescalerOnTimer()) ? 18L : PreScaler.getFactor() * 18L;
}
public void start() {
activateWatchdog(prescaler);
int watchdogTime = 18 * prescaler; // Zeit in Millisekunden
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
counter++;
if (counter >= MAX_PRESCALER) {
reset();
System.out.println("Watchdog Timeout!");
}
}
}, 0, watchdogTime);
}
public void reset() {
counter = 0;
}
private void activateWatchdog(int prescaler) {
// Teilerfaktor entsprechend einstellen durch zweierpotenz
switch (prescaler) {
case 1:
DataRegister.setBit(0x81, 0); // Setze PS2:0 auf 000
DataRegister.setBit(0x81, 1); // Deaktiviere den Watchdog-Timer
break;
case 2:
DataRegister.clearBit(0x81, 0); // Setze PS2:0 auf 001
DataRegister.setBit(0x81, 1); // Deaktiviere den Watchdog-Timer
break;
case 4:
DataRegister.setBit(0x81, 0); // Setze PS2:0 auf 010
DataRegister.setBit(0x81, 1); // Deaktiviere den Watchdog-Timer
break;
case 8:
DataRegister.setBit(0x81, 0); // Setze PS2:0 auf 011
DataRegister.setBit(0x81, 1); // Deaktiviere den Watchdog-Timer
break;
case 16:
DataRegister.clearBit(0x81, 0); // Setze PS2:0 auf 100
DataRegister.clearBit(0x81, 1); // Aktiviere den Watchdog-Timer
break;
case 32:
DataRegister.setBit(0x81, 0); // Setze PS2:0 auf 101
DataRegister.clearBit(0x81, 1); // Aktiviere den Watchdog-Timer
break;
case 64:
DataRegister.clearBit(0x81, 0); // Setze PS2:0 auf 110
DataRegister.setBit(0x81, 1); // Aktiviere den Watchdog-Timer
break;
case 128:
DataRegister.setBit(0x81, 0); // Setze PS2:0 auf 111
DataRegister.setBit(0x81, 1); // Aktiviere den Watchdog-Timer
break;
default:
System.out.println("NÜCHTITTGGGGG für den Watchdog-Timer.");
break;
public static void testAndTrigger () {
watchdogTime = getTimeFromRegister() * 1000;
if (!PreScaler.isPrescalerOnTimer() && (Commands.getTotalExecutionTime() >= (watchdogTime + lastReset))){
DataRegister.resetPC();
System.err.println("Watchdog Timer triggered");
DataRegister.clearBit(3, 4);
lastReset = Commands.getTotalExecutionTime();
}
}
public static void reset (){
lastReset = Commands.getTotalExecutionTime();
PreScaler.reset();
DataRegister.setBit(3, 3);
DataRegister.setBit(3, 4);
}
}