/* ********************************************************************** * File S1deb4.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 550 d.s. 200702 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 09.09.03 * ********************************************************************** Rel. 1.1 - 09.09.2003 by Graziano Gaiba Con un flat da 20 vie si collega il CN15 della DEB01 o il CN1 della TIO16 al CN2 (per l'output) o al CN3 (per l'input) della GPC 550. Questo programma permette di gestire le linee digitali TTL per un totale di 24, della periferica PPI 82c55, contemporaneamente avviene una segnalazione acustica durante il pilotaggio delle uscite. */ #include #include #include // Frequenza di clock della CPU usata #define FCLOCK 22118400 #define FALSE 0x00 // Valori booleani #define TRUE 0xFF near unsigned char CKCON @ 0x8E; // SFR del DALLAS // Indirizzi allocazione registri delle periferiche di bordo. static unsigned char PORTA @ 0xFFF4, PORTB @ 0xFFF5, PORTC @ 0xFFF6, CNT @ 0xFFF7, DSW1 @ 0xFFF3; static unsigned char BUZLED @ 0xFFF1; // Variabili usate dal programma unsigned char dallas; /********* 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 } // 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; } // Legge il valore del port A dell'82c55 unsigned char getPortA(void) { return PORTA; } // Legge il valore del port B dell'82c55 unsigned char getPortB(void) { return PORTB; } // Legge il valore del port C dell'82c55 unsigned char getPortC(void) { return PORTC; } // Legge il valore del Dip Switch DSW1 unsigned char getDSW1(void) { return DSW1; } void init_cpu(void) /* Verifica la CPU montata sulla scheda e lo salva in apposita variabile. Effettua inoltre le apposite inizializzazioni: seriale, wait, ecc. */ { unsigned char dr; dr=CKCON; // Legge registro del DALLAS 80C320 if (CKCON==0x01) { CKCON=0x01; // Setta accesso area dati a 3 cicli macchina dallas=TRUE; // E` un DALLAS 80C320 } else dallas=FALSE; // E` un 80C32 //endif } void ritardo(unsigned int rit) /* Effettua un ritardo software di rit millisecondi, calibrato su un Clock di CPU da 22.1184 MHz, a seconda della CPU montata. */ { unsigned int r,rit1ms; if (dallas==TRUE) rit1ms=380; // Valore sperimentale per ritardo di 1 msec. con 80c320 else rit1ms=150; // Valore sperimentale per ritardo di 1 msec. con 80c32 do { for (r=0 ; r0); } // Emette un breve suono tramite il buzzer void bip(void) { BUZLED = 0x01; // Attiva buzzer. ritardo(300); BUZLED = 0x00; // Disattiva buzzer. } // Emette un breve suono ed effettua un ritardo totale di circa un secondo void ritardo_bip(void) { bip(); ritardo(700); } // ************************** Programma principale *************************** void main(void) { unsigned char c; setup(); // Attesa di assestamento dei segnali init_cpu(); // Verifica la CPU montata 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(0x82); // PORT A e C in OUTPUT, PORT B in INPUT. puts("********************* Demo PPI **********************"); puts(""); puts("Il demo pilota l'accensione delle linee dei Port A e C presenti sul connettore"); puts("CN2 e mostra continuamente il valore del Port B, presente su CN3.\n"); for (;;) // Loop infinito. { // Scorrimento da LED rossi a LED verdi e gialli c=1; setPortC(0xff); // Pulisce Port C while(c) { setPortA(~c); c<<=1; // Ritardo per rendere visibile il movimento del LED ritardo_bip(); printf("%X\r", getPortB()); } c=1; setPortA(0xff); // Pulisce Port A while(c) { setPortC(~c); c<<=1; // Ritardo per rendere visibile il movimento del LED ritardo_bip(); printf("%X\r", getPortB()); } // Scorrimento da LED verdi e gialli a LED rossi c=0x80; setPortA(0xff); // Pulisce Port A while(c) { setPortC(~c); c>>=1; // Ritardo per rendere visibile il movimento del LED ritardo_bip(); printf("%X\r", getPortB()); } c=0x80; setPortC(0xff); // Pulisce Port A while(c) { setPortA(~c); c>>=1; // Ritardo per rendere visibile il movimento del LED ritardo_bip(); printf("%X\r", getPortB()); } } }