Newsgroup: it.comp.lang.pascal
Titolo: DCF77

Hello!
Ho provato a modificare un programmino di test trovato in un programma
per la decodifica del DCF77 (segnale orario via radio) preso su
Fidonet, con il Turbo Pascal 4.0 Borlan ma a volte si comporta in modo
strano.
Per uscire bisogna premere un tasto, ma se lo lancio una seconda volta
spesso mi esce subito come se avesse ancora nel buffer della tastiera
il carattere precedente. Riporto sotto il sorgente ...
qualche idea ?
---------------------------------------------------
PROGRAM TEST_STA;
USES DOS,Crt;
VAR
  H, P, U, V      : INTEGER;
  CurrAH, PrecAH  : INTEGER;
  CurrAL, PrecAL  : INTEGER;
  V1, V2, V3      : STRING[1];
  Reg             : Registers;
  Ch              : CHAR;
  hr,min,sec,cnt  : WORD;
BEGIN
  ClrScr;                       {Bildschirm l*schen}
  Writeln;                      {Erste Zeile nicht beschreeiben}
{----------------------------------------------------------------------------}
  writeln( '1) ax = ',Reg.ax );
  Reg.ax := $DC10;            {Funktionsnummer AL = 10 Hex und AH = DC
Hex   }
  writeln( '2) ax = ',Reg.ax );
  Intr($2F,Reg);              {Interrupt 2F Hex aufrufen
}
  writeln( '3) ax = ',Reg.ax );
  IF Reg.ax = $10DC THEN Writeln ('DCF residente');
  IF Reg.ax = $DC10 THEN BEGIN
                           Writeln ('DCF non caricato');
                         END;
{----------------------------------------------------------------------------}
  Reg.ax := $DC40;
  Intr($2F,Reg);
  GotoXY( 1, 5 );
  Writeln ('Minuti dalla prima sincronizzazione ',Reg.al);
  Write   ('Numero di sincronizzazioni          ',Reg.ah);
  IF Reg.al<>0 THEN Writeln (' = ',Reg.ah*100/Reg.al:3:1,' %');
  CurrAH := Reg.ah;
  CurrAL := Reg.al;
  PrecAH := CurrAH;
  PrecAL := CurrAL;
  Repeat
    GetTime( hr, min, sec, cnt );
    GotoXY( 70, 2 );
    Write( hr:2,':',min:2,':',sec:2 );
    Reg.ax := $DC40;            {Funktionsnummer AL = 40 Hex und AH =
DC Hex
    Intr($2F,Reg);              {Interrupt 2F Hex aufrufen
    GotoXY( 1, 5 );
    Writeln ('Minuti dalla prima sincronizzazione ',Reg.al);
    Write   ('Numero di sincronizzazioni          ',Reg.ah);
    IF Reg.al<>0 THEN Writeln (' = ',Reg.ah*100/Reg.al:3:1,' %');
    Delay( 300 );
    IF KeyPressed THEN Ch := Readkey;
  Until (Ch = #27) OR (Ch = ' ');
END.
Di piu' c'e' un altro programma di cui non c'e' il sorgente ma che
immagino sia stato scritto con lo stesso linguaggio e con lo stesso
compilatore dall'autore del DCF, che ogni tanto quando provavo a
lanciarlo usciva con un errore sui parametri anche se i parametri
glieli davo giusti e da un po' di tempo esce sempre, non riesco piu'
a farlo partire. Inizio a sospettare di non aver settato bene qualche
variabile di ambiente per far girare bene gli exe in questione ...


Sicuramente il carattere non è più nel buffer della tastiera (hai usato
readkey)... dunque non so cosa dire: non è che per compilare usi l'ESC e non
lo rilasci?? :-))
Scherzi a parte, sicuro che non sia un altro errore?? Hai provato a
verificare che il programma termini correttamente??
Per l'altro nonzo :-)
Emanuele Cesena
d.a.m...@iol.it
ICQ n° #10570672
http://www.geocities.com/SiliconValley/Grid/8879
"Il proiettile in arrivo ha diritto di precedenza"


Forse e' dovuto al fatto che non azzeri al variabile Ch.
Dopo la prima esecuzione del programma tu esci premendo 'esc' e cosi'
la variabile Ch assume il valore #27. Ma cosi' nella successiva
esecuzione la variabile Ch ha ancora il valore #27 e l'esecuzione del
programma termina al primo ciclo. La stessa cosa succede se esci
premendo lo spazio.
Ti consiglio di modificare il programma cosi:
- dopo la BEGIN del programma inserisci la riga:
Ch:=''	 : azzeri la variabile
-modifica la terzultima riga in:
IF Keypressed then begin
	Ch:=readkey;
	if Ch=#0 then Ch:=readkey
end;
alcuni caratteri, detti caratteri speciali, sono formati da due
caratteri e per svuotare il buffer vanno letti entrambi
CIAO,   Fabio
fabi...@rocketmail.com