#include "IO-reg.h" #include "Vectors.h" #include "intr6811.h" #include "X25128.h" #include "LCD.h" #include "menu.h" /* Initierar seriekommunikationen. */ void init_rs232(void){ BAUD = 0x30; //9600 Baud (8MHz kristall) // SCCR1 = 0x00; //8-bitars ordlängd SCCR2 = 0x2C; //Transmitter enable, receiver enable, recievier interrupt DDRD |= 0x02; //PD1 output } /* Skickar tecknet ch över serieporten. */ void rs232_send(char ch){ while((SCSR & 0x80) == 0x00); SCDR = ch; } /* Väntar tills det finns ett tecken att ta emot på serieporten, och läser sedan detta och returnerar det. */ char rs232_receive(void){ while((SCSR & 0x20) == 0x00); return SCDR; } /* Skickar temperaturen the_value på serieporten. */ void rs232_send_temp(int the_value[]){ int value[2]; char signed_value[4]; char i; char boolsk; //Tar bort inledande nollor char j; value[0] = the_value[0]; value[1] = the_value[1]; for(i=0; i<4; i++) signed_value[i] = '0'; if(value[0] < 0){ signed_value[0] = '-'; value[0] *= -1; rs232_send('-'); } boolsk = 0x00; for(j=0; j<2; j++){ for(i=3; i-j>0; i--){ if(value[j]%10 == 0) signed_value[i]='0'; else if(value[j]%10 == 1) signed_value[i]='1'; else if(value[j]%10 == 2) signed_value[i]='2'; else if(value[j]%10 == 3) signed_value[i]='3'; else if(value[j]%10 == 4) signed_value[i]='4'; else if(value[j]%10 == 5) signed_value[i]='5'; else if(value[j]%10 == 6) signed_value[i]='6'; else if(value[j]%10 == 7) signed_value[i]='7'; else if(value[j]%10 == 8) signed_value[i]='8'; else if(value[j]%10 == 9) signed_value[i]='9'; value[j] /= 10; } for(i=0; i+2*j<4; i++){ //i+2*j korrigerar index för decimaldelen if(signed_value[i + 2*j] != '0') boolsk = 0x01; if(signed_value[i + 2*j] != 0xFF && boolsk) rs232_send(signed_value[i + 2*j]); else if((i+2*j == 3) && (signed_value[i + 2*j] == 0) && ~boolsk){ boolsk = 0x00; rs232_send('0'); } } if(j==0) rs232_send('.'); } rs232_send(0xDF); rs232_send('C'); } /* Skicar strängen string som har längden length över serieporten. */ void rs232_send_string(char string[], char length){ char i; for(i=0x00; i 9) the_char = the_char - 0x07; value = the_char * 16; the_char = rs232_receive() - 0x30; if(the_char > 9) the_char = the_char - 0x07; value += the_char; return value; } /* Tar emot (sänder från datorn) data via serieporten och sparar det på minnet */ void rs232_transfer_send_data(void){ char address[2]; char length; char data[32]; length = rs232_transfer_get_hex_value(); address[0] = rs232_transfer_get_hex_value(); address[1] = rs232_transfer_get_hex_value(); rs232_receive_string(data, length); X25128_write_data(data, address, length); } /* Sänder (tar emot på dadtorn) data via serieporten */ void rs232_transfer_receive_data(void){ char address[2]; char length[1]; char data[32]; length[0] = rs232_transfer_get_hex_value(); address[0] = rs232_transfer_get_hex_value(); address[1] = rs232_transfer_get_hex_value(); X25128_read_data(data, length[0], address); rs232_send_string(data, length[0]); } /* Anropas då det kommer ett SCI-interrupt */ interrupt void SCI_interrupt(void){ char command; LCD_cls(); LCD_write_string(0x00, "Kopplar upp..."); command = rs232_receive(); if(command == 's'){ LCD_write_string(0x40, "Tar emot data"); rs232_transfer_send_data(); } else if(command == 'r'){ LCD_write_string(0x40, "Skickar data"); rs232_transfer_receive_data(); } if(menu_get_current_main_menu() != 0xFF) menu_update_main_menu(); }