/** BIOS.C ********************************************************** Meßwerterfassung über die serielle Schnittstelle MAKROS TERMINAL einschalten, wenn die Gegenstelle ein Terminal ist (Antworten werden mit CR-LF beendet, Liste aller Funktionen wird ausgegeben) ausschalten, wenn Steuerung vom PC erfolgt LDEBUG wird LDEBUG definiert, werden die Aufrufe der Funktionen in den anderen Moduln ausgeschaltet __C51__ kann sowohl mit KEIL als auch mit BORLAND kompiliert werden LOCAL wtag[] Tabelle der Wochentage str2dez() Verwandelt zwei aufeinanderfolgende ASCII-Zeichen in eine Dezimal-Zahl PUBLIC serial_loop() Holt und interpretiert Zeichen von SER0 *******************************************************************/ #include "bios.h" #include #ifdef TERMINAL #include "ser0.h" #else #include "watchd.h" #include "timer0.h" #include "ser0.h" #include "adc.h" #include "date.h" #include "time.h" #endif #include #ifdef __C51__ #else #include #include #define rxs kbhit #define _getkey getch #endif #define ECHOC() printf("%c",rxc) #define ASCII2BIN(a) ((a)-0x30) #ifdef TERMINAL #define PROMPT "\n\r?01234567adDtTwWx." #else #define PROMPT "." #endif #ifdef LDEBUG #define hide #else #define hide static #endif /** LOCAL **********************************************************/ hide unsigned char str2dez(unsigned char *pc) { return ASCII2BIN(*pc)*10+ASCII2BIN(*(pc+1)); } /** PUBLIC **********************************************************/ void serial_loop(void) { static unsigned char xdata state = 255; static unsigned char xdata count = 0; static unsigned char xdata str[6]; unsigned char xdata dj,dm,dt; unsigned char xdata th,tm,ts; unsigned char xdata i; if (state==255) { printf(PROMPT); state=0; } if (rxs()) { unsigned char rxc = _getkey(); switch (state) { case 1: /* Datum einstellen */ if (isdigit(rxc)) { ECHOC(); str[count++]=rxc; if (count==6) { /* Daten übergeben */ dj=str2dez(&str[0]); dm=str2dez(&str[2]); dt=str2dez(&str[4]); state=255; #ifndef LDEBUG date_set_jmt(dj,dm,dt); #endif } } else state = 255; break; case 2: /* Zeit einstellen */ if (isdigit(rxc)) { ECHOC(); str[count++]=rxc; if (count==4) { /* Daten übergeben */ th=str2dez(&str[0]); tm=str2dez(&str[2]); ts=0; state=255; #ifndef LDEBUG time_set_hms(th,tm,ts); #endif } } else state = 255; break; case 0: switch (rxc) { default: printf("#"); state=255; break; #ifdef TERMINAL case '?': printf("\n? Hilfe\n" \ "0..7 ADC-Kanal ablesen\n" \ "a Alle ADC-Kan„le ablesen\n" \ "d Datum ablesen\n " "Djjmmtt Datum setzen\n" "t Tageszeit ablesen\n" \ "Thhmm Tageszeit setzen\n" \ "w Watchdog einschalten\n" \ "W Watchdog ausschalten\n" \ "x Ende\n"); break; #ifndef __C51__ case 'x': exit(0); #endif #endif /* TERMINAL */ case 'd': /* Datum ablesen */ ECHOC(); #ifndef LDEBUG date_get_jmt(&dj,&dm,&dt); #endif #ifdef TERMINAL printf("\n\r"); #endif printf("%02d-%02d-%02d",(unsigned int)dj,(unsigned int)dm,(unsigned int)dt); #ifndef LDEBUG printf("-%s",heute_s()); #endif state=255; break; case 'D': /* Datum einstellen */ ECHOC(); count = 0; /* 6 numerische Stellen erwartet */ state = 1; break; case 't': /* Zeit ablesen */ ECHOC(); #ifndef LDEBUG time_get_hms(&th,&tm,&ts); #endif #ifdef TERMINAL printf("\n\r"); #endif printf("%02d:%02d:%02d",(unsigned int)th,(unsigned int)tm,(unsigned int)ts); state=255; break; case 'T': /* Zeit einstellen */ ECHOC(); count = 0; /* 4 numerische Stellen erwartet */ state = 2; break; case '0': /* ADC 0 ablesen */ case '1': /* ADC 1 ablesen */ case '2': /* ADC 2 ablesen */ case '3': /* ADC 3 ablesen */ case '4': /* ADC 4 ablesen */ case '5': /* ADC 5 ablesen */ case '6': /* ADC 6 ablesen */ case '7': /* ADC 7 ablesen */ ECHOC(); #ifdef TERMINAL printf("\n\r"); #endif #ifndef LDEBUG printf("%03d",(unsigned int)adc8(ASCII2BIN(rxc))); #endif state=255; break; case 'a': /* ADC ablesen */ ECHOC(); #ifndef LDEBUG for (i=0; i