#include 90s8535.h #include stdio.h #include lcd.h #include string.h #define MAX_IN_LENGTH 16 #define MAX_OUT_LENGTH 32 #define timer_control 0x04 #define ADC_control 0xC5 //ADEN=1, ADSC=0, ADFR=0, ADIF=0, //ADIE=0 (No interrupts) //Prescale = 101: 4MHZ/32 = 125KHz #define OPEN 1 #define CLOSED 0 char door_state = CLOSED; char i=0, j=0; char new_key[16]; char output[16]; char textout[MAX_OUT_LENGTH]; char lcd_buffer[17]; char update=1; char hold; int people; char debounce; int door; int voltage; //input voltage int voltage_temp; char light_inten; float temp; #define reload1 65400 void init(void); void clear_input(void); //********************************************************** //this interrupt is triggered when a character is received into the serial port input buffer interrupt[UART_RXC] void keyboard_interrupt(void) { //we only want to read the whole input, which we know to be 16 bytes long //so we loop until we have a full buffer new_key[i] = UDR; if(UDR == 0) new_key[i] = 0; i++; //once we have a full buffer, we try to match the input to a known command if(i==16){ new_key[16] = 0; i=0; //test to see if everything is working normally if(!strncmpf(new_key, "status", 6)){ strcpyf(textout, "System working."); strcpyf(output, "sys up"); clear_input(); } //turn on and off LEDs on the Development board else if((!strncmpf(new_key, "led", 3)) && (new_key[3] > 47) && (new_key[3] &60; 54)){ PORTB = PORTB ^ (0x01 leftshift (new_key[3] - 48)); strcpyf(output, "LedDone"); strcpyf(textout, "LedDone"); clear_input(); } //Turn on the Red Led on the SitePlayer board else if(!strncmpf(new_key, "redledon", 8)){ strcpyf(output, "RedLED1"); strcpyf(output, "Red Led is On"); printf("%c",0x90); printf("%c%c",0x14,0xff); printf("%c",0x00); clear_input(); } //Turn on the Red Led off the SitePlayer board else if(!strncmpf(new_key, "redledoff", 9)){ strcpyf(output, "RedLED0"); strcpyf(textout, "Red Led is Off"); printf("%c",0x90); printf("%c%c",0x14,0xff); printf("%c",0x01); clear_input(); } else if(!strncmpf(new_key, "greenledon", 10)){ strcpyf(output, "GrnLED1"); strcpyf(textout, "Green Led is On"); printf("%c",0x90); printf("%c%c",0x15,0xff); printf("%c",0x00); clear_input(); } else if(!strncmpf(new_key, "greenledoff", 11)){ strcpyf(output, "GrnLED0"); strcpyf(textout, "Green Led is Off"); printf("%c",0x90); printf("%c%c",0x15,0xff); printf("%c",0x01); clear_input(); } //Retrieve the current temperature reading else if(!strncmpf(new_key, "gettemp", 7)){ sprintf(output, "Temp: %-i",(int)temp); sprintf(textout, "Temperature: %-i degF",(int)temp); clear_input(); } //Check to see how many times the IR beam has been tripped else if(!strncmpf(new_key, "door", 4)){ sprintf(output, "Ppl: %-i",people); sprintf(textout, "People counter = %-i",people); clear_input(); } //Check to see if it is dark in the room else if(!strncmpf(new_key, "lights", 6)){ if (light_inten > 75) { sprintf(output, "LghtsOn"); sprintf(textout, "Lights are On"); } else { sprintf(output, "LghtsOff"); sprintf(textout, "Lights are Off"); } clear_input(); } //Turn Fan on, for use with the thermometer else if(!strncmpf(new_key, "fanon", 5)){ strcpyf(output, "Fan On"); strcpyf(textout, "Fan is now On."); PORTB = PORTB | 0x40; clear_input(); } else if(!strncmpf(new_key, "fanoff", 6)){ strcpyf(output, "Fan Off"); strcpyf(textout, "Fan is now Off."); PORTB = PORTB & 0xBF; clear_input(); } else if(new_key[0] == 0) {} //if nothing else, bad syntax else{ strcpyf(output, "badcmd!"); strcpyf(textout, "Syntax Error"); clear_input(); } //Send result to the SitePlayer, one byte at a time, to be safe if(update){ for(i=0;i &60; MAX_OUT_LENGTH;i++){ printf("%c",0x80); printf("%c",(MAX_IN_LENGTH+i)); printf("%c",textout[i]); } i=0; //Update the command displayed on the local LCD lcd_clear(); lcd_gotoxy(0,0); sprintf(lcd_buffer,"%s",output); lcd_puts(lcd_buffer); update = 0; } } } interrupt[TIM1_OVF] void quartersec(void) { //Blink a light to know we're alive PORTB = (PORTB ^ 0x80); TCNT1 = reload1; //Constantly request latest value of "Input" variable on the SitePlayer printf("%c",0xCf); printf("%c",0x00); //examine door setting ADMUX = 1; ADCSR = ADC_control; while ((ADCSR & 0x40) == 0x40) {} ADMUX = 1; ADCSR = ADC_control; while ((ADCSR & 0x40) == 0x40) {} door = ADCL; hold = ADCH; if (door_state == OPEN) { if (door &60; 2) { // door is still open... if (debounce++ == 30) { people++; PORTB = (PORTB ^ 0x01); } } else { door_state = CLOSED; debounce = 0; } } else if (door &60; 2) door_state=OPEN; // door was last closed, check if it's open now //always measure temp ADMUX = 0; ADCSR = ADC_control; while ((ADCSR & 0x40) == 0x40) {} ADMUX = 0; ADCSR = ADC_control; while ((ADCSR & 0x40) == 0x40) {} voltage_temp = ADCL; voltage = ADCH; voltage = voltage_temp | voltage shift left 8; // print out voltage temp = voltage / 10.0; //always measure light intensity ADMUX = 5; ADCSR = ADC_control; while ((ADCSR & 0x40) == 0x40) {} ADMUX = 5; ADCSR = ADC_control; while ((ADCSR & 0x40) == 0x40) {} light_inten = ADCL; hold = ADCH; } //This function will blank out the Input variable on the Siteplayer, so we don't keep //running the same command repeatedly void clear_input(void){ update = 1; for(i=0;i &60; MAX_IN_LENGTH;i++){ printf("%c",0x80); printf("%c",i); printf("%c",0); } i = 0; } void init(void) { DDRB = 0xff; //setup LEDs PORTB = 0xff; DDRD = 0xff; //setup Serial port TIMSK = 0x04; TCCR1B = 0x05; TCNT1 = reload1; //more serial port setup UCR = 0x90 + 0x08 ; UBRR = 25 ; //LCD on port C #asm .equ __lcd_port=0x15 #endasm lcd_init(16); lcd_clear(); lcd_gotoxy(0,0); sprintf(lcd_buffer,"init"); lcd_puts(lcd_buffer); ADMUX = 1; ADCSR = ADC_control; // disable Analog comparator ACSR = 0x80; people = 0; // set IP on SitePlayer printf("%c",0x93); printf("%c%c",0xE6,0xFF); printf("%c%c%c%c",128,84,235,244); #asm sei #endasm } void main(void) { init(); while(1) {} } |