chiark / gitweb /
support timer2; get timer[013] calculations right!
authorian <ian>
Tue, 20 Dec 2005 15:15:58 +0000 (15:15 +0000)
committerian <ian>
Tue, 20 Dec 2005 15:15:58 +0000 (15:15 +0000)
detpic/make-clocks

index 40ee2e21f8880698502fe815d0ab50f1e0be5904..9d0bc7d620ccaba8fee251d143ff38b69e6c7168 100755 (executable)
@@ -27,14 +27,15 @@ our ($name,$ms,$interval,$msclock);
 #                 ie  cycles = interval * foscscale * msclock / prescale
 #                 or  msclock = cycles * prescale / (foscscale * interval)
 
-sub scaleable ($$$$$) {
-    my ($width, $foscscale, $scalebitnums, $scales, $deadcycles) = @_;
+sub scaleable ($$$$$$) {
+    my ($width, $foscscale, $scalebitnums, $scales,
+       $deadcycles, $overflowp) = @_;
     my ($maxcycles, $scalespec, $scalebits);
     my ($cycles, $cyequ, @scalebits);
     my ($prescale);
     $maxcycles = (1 << $width) - $deadcycles;
     foreach $scalespec (@$scales) {
-       $scalespec =~ m/^(\d+)\:([01]+)$/;
+       $scalespec =~ m/^0*(\d+)\-([01]+)$/;
        ($prescale,$scalebits) = ($1,$2);
        length($scalebits) == @$scalebitnums
            or die "$scalespec @$scalebitnums";
@@ -54,35 +55,48 @@ sub scaleable ($$$$$) {
 
        $cyequ= "${name}cycles";
        p(sprintf "%s equ %d\n", $cyequ, $cycles);
-       if ($width == 16) {
-           p("${name}inith equ $cyequ / 256\n");
-           p("${name}initl equ $cyequ & 255\n");
-       } elsif ($width == 8) {
-           p("${name}init equ $cyequ\n");
-       } else {
-           die "$width";
+       if ($overflowp) {
+           p("${name}init equ ".(1<<$width)." - $cyequ\n");
+           if ($width == 16) {
+               p("${name}inith equ ${name}init / 256\n");
+               p("${name}initl equ ${name}init & 255\n");
+           }
        }
        return;
     }
     warn "clock speed too high for $name\n";
 }
 
+sub do_T2period {
+    my (@scales, $pre, $prex, $prebits, $posti, $this);
+    for $pre (qw(1-00 4-01 16-10)) {
+       $pre =~ m/^(\d+)\-([01]+)$/;
+       ($prex,$prebits) = ($1,$2);
+       for ($posti=0; $posti<15; $posti++) {
+           $this= sprintf "%03d-%s%04b", $prex * ($posti+1), $prebits, $posti;
+           push @scales, $this;
+       }
+    }
+    local ($name) = "${name}_t2";
+    scaleable(8, 250.0, [qw(T2CKPS1 T2CKPS0 TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0)],
+             [ sort @scales ], 0, 0);
+}
+
 sub do_T13ov ($) {
     my ($n) = @_;
     local ($name) = "${name}_t${n}";
     scaleable(16, 250.0, ["T${n}CKPS1","T${n}CKPS0"],
-             [qw(1:00 2:01 4:10 8:11)], 1);
+             [qw(1-00 2-01 4-10 8-11)], 1, 1);
 }
 
 sub do_T0ov ($) {
     my ($w) = @_;
     local ($name) = "${name}_t0";
     scaleable($w, 250.0, ["PSA","T0PS2","T0PS1","T0PS0"],
-             [qw(1:1000 2:0000 4:0001 8:0010 16:0011
-               32:0100 64:0101 128:0110 256:0111)], 1);
+             [qw(1-1000 2-0000 4-0001 8-0010 16-0011
+               32-0100 64-0101 128-0110 256-0111)], 1, 1);
 }
 
-sub do_T0ov8 { do_T0ov(8); }
 sub do_T0ov16 { do_T0ov(16); }
 sub do_T1ov { do_T13ov(1); }
 sub do_T3ov { do_T13ov(3); }