Prescaler, Watchdog, (Cycle-) Timer
This commit is contained in:
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user