/* ********************************************************************** * File S1deb1.C - Rel. 1.1 con uC/51 V. 1.10.7 * * GRIFO(R) via Dell'Artigiano 8/6 40016 S. Giorgio di Piano (BO) * * Schede:GPC 324/D d.s. 140201 + ETI 324 d.s. 101297 e DEB01 o TIO16 * * Tel. +39 051 892052 Fax. +39 051 893661 * * http://www.grifo.com http://www.grifo.it * * sales@grifo.it tech@grifo.it grifo@grifo.it * * by Graziano Gaiba del 16.07.03 * ********************************************************************** Rel. 1.1 - 16.07.2003 by Graziano Gaiba Con un flat 26+26 I/O si devono collegare il CN1 della GPC(r) 324/D con il CN1 della ETI 324. Con un flat da 20 vie si collega il CN3 della ETI 324 al CN15 della DEB01 o al CN1 della TIO16. Inoltre bisogna impostare tutti i Dip del Dip Switch DSW1 della ETI 324 ad ON, per selezionare l'indirizzo di base 0. Per ulteriori informazioni si consulti il manuale della ETI 324. Tale programma visualizza sul PORT A del PPI 8255, il codice esadecimale del tasto premuto sulla tastiera del terminale ed effettua echo sul monitor. */ #include #include #include // Frequenza di clock della CPU usata #define FCLOCK 22118400 // Indirizzi allocazione registri delle periferiche di bordo. // L'indirizzo dei vari dispositivi e' dato da: 0xFF00 + indbase + offset // Il valore di indbase viene impostato tramite il DSW1 della ETI 324, i // vari offset sono riportati sul manuale della ETI 324. static unsigned char PORTA @ 0xFF00, PORTB @ 0xFF01, PORTC @ 0xFF02, CNT @ 0xFF03; /********* Funzioni di utility generale e di gestione sezioni hw ***********/ void iniser(unsigned long baud) /* Inizializza la linea seriale con: Bit x chr = 8 Stop bit = 1 Parity = None Baud rate = baud usando come baud rate generator il timer 1. */ { SCON=0x052; // Modo 1, abilita ricevitore TMOD&=0x00F; // Timer 1 in modo auto-reload TMOD|=0x020; TR1=0; // Stop al TIMER 1 TH1=256-((2*FCLOCK)/(384*baud)); // baud a 14.7456 MHz PCON=PCON|0x080; // Setta SMOD=1 per baud rate alti TR1=1; // Start al TIMER 1 } // ************************ Procedura HexAdjust **************************** // Questa procedure riceve in ingresso un unsigned char e verifica che sia // una cifra esadecimale (numero da 0 a 9 oppure lettera da 'a' ad 'f' oppure // da 'A' ad 'F'. Se la verifica e' positiva viene restituito il valore di // tale cifra (da 0 a 15) altrimenti viene restituito 16. // Parametri in ingresso: // c di tipo unsigned char: contiene il codice del carattere da esaminare // Restituisce il valore della cifra esadecimale ricevuta in ingresso oppure // restituisce 16. unsigned char HexAdjust(unsigned char c) { c-=48; // Si da per scontato che il parametro sia una // cifra esadecimale tra 0 e 9, quindi la // aggiustiamo da ASCII a valore numerico togliendo // il valore del codice ASCII di '0' cioe' 48 if(c>15) // Se il parametro vale ancore piu' di 15 non era // una cifra da 0 9, ora supponiamo che fosse una // cifra da 'A' ad 'F' e aggiustiamo analogamente // a prima { c-=7; // 48 prima 7 ora, si e' tolto ASCII di 'A' (65)+10 if(c<10 || c>15) // Se non era neppure da 'A' ad 'F' forse era da { // Da 'a' ad 'f' c-=32; // Aggiustamento togliendo in totale ASCII di 'a' if(c<10 || c>15) // Se ancora non ha un valore tra 0 e 15 non era { // una cifra esadecimale c=16; // Imposta per restituire 16 } } } return c; // Restituisce il valore della cifra esadecimale // Oppure 16 } // Attesa di assestamento dei segnali void setup(void) { unsigned int i; for(i=10000; i!=0; i--) ; } // Inizializza l'82c55 con il valore passato nel parametro void init8255(unsigned char c) { CNT=c; } // Imposta il valore del port A dell'82c55 void setPortA(unsigned char v) { PORTA=v; } // Imposta il valore del port B dell'82c55 void setPortB(unsigned char v) { PORTB=v; } // Imposta il valore del port C dell'82c55 void setPortC(unsigned char v) { PORTC=v; } // ************************** Programma principale *************************** void main(void) { unsigned char tasto; setup(); // Attesa di assestamento dei segnali iniser(19200); TI=0; RI=0; // Commentare se si usa la seriale in polling (SIOTYPE=p oppure k) ES=1; // Abilita interrupt porta seriale EA=1; // Abilitazione interrupt // Inizializzazione del PPI 8255. init8255(0x80); // PORT A, B, C in OUTPUT. setPortA(0xff); // Clear PORT A. setPortC(0xff); // Clear PORT C. puts("\n********************* Demo S1DEB1 **********************"); puts(""); puts("Impostare tutti i Dip di DSW1 della ETI 324 ad ON."); for (;;) // Loop infinito. { puts("\nPremere un tasto che corrisponda ad una cifra esadecimale."); putc(tasto = getc()); // Attesa tasto ed echo. tasto = HexAdjust(tasto); if(tasto<=15) // E` un codice esadecimale o un numero ? { setPortA(~tasto); // Visualizzazione sul PORT A del codice. } else { puts("\nError !"); // Errore non e` un codice esadecimale. setPortA(0xff); // Clear PORT A. } } }