//********************************** //* CID * //********************************** /* Konstantdeklarationer: */ #include "IO-reg.h" #include "Vectors.h" #include "intr6811.h" /* Globala variabler */ char nummer[11][11] = { {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF} , {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF} , {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF} , {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF} , {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF} , {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF} , {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF} , {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF} , {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF} , {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF} , {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF} }; int ni = 0; int pos = 0; int inc = 0; char cidon = 0; /* Funktion för att skicka tecken till skärmen */ void sendtext (int Text1) { int txok; PORTB = 1; /*XOff flödesreglering */ /* rxok = SCDR; //Läser senaste inkommna tecken while (rxok == 0x13) { //Väntar om tecken XOFF kommit rxok = SCDR; }; */ /* Buffert kontroll */ txok = SCSR; //Läsar ur ifall bufferten är tom. //Väntar om HC11 ej klar med sändning txok = (txok & 0x80); //Nolla allt utom första och andra biten. while (!(txok == 0x80)) { txok = SCSR; txok = (txok & 0x80); } SCDR = Text1; // Skickar in tecken i buffert PORTB = 2; } /* Huvudprogrammet */ main(void) { /* Starta igång */ //Deklarera variabler int i = 0; PORTB = 1; //Gul diod för att visa vi startar igång // Ställer in Interrupt TCTL2 = 0X10; TMSK1 = 0x04; enable_interrupt(); // Ställer in SCI för datorkom*/ BAUD = 0x30; // 9600 Baud SCCR1 = 0x04; SCCR2 = 0x2C; // TE = 1, RE = 1 : Skicka och ta emot data. Avbrott vid inkommande tecken /* Huvudprogram */ PORTB = 2; //Grön diod, init är klart. sendtext(0x3C); //< sendtext(0x48); //H sendtext(0x65); //e sendtext(0x6C); //l sendtext(0x6C); //l sendtext(0x6F); //o sendtext(0x3E); //> while(1) { if (ni == 0) { PORTB = 2; //Minnet är tomt } else { PORTB = 3; //Nummer finns i minnet, tänd gul Diod } if (inc == 0x3F) { //? - kolla om den finns. inc = 0; sendtext(0x21); // ! } if (inc == 0x54) { //T - tömma minnet inc = 0; if (ni != 0) { for (i=0;i < ni;i++) { pos = 0; sendtext(0x41); //Skriva ut startbit A while(1) { sendtext(nummer [i] [pos]); if (pos == 10) { //allt är ute break; } else if (nummer [i] [pos] == 0x5A) { // kommit till stopbit break; } else { pos++; } } } } ni = 0; //markera att minnet är tömt sendtext(0x44); //skicka D till GUI att allt är klart } if (inc == 0x55) { //U - Senate numret är mottaget - PROGRAMVARAN MÅSTE VÄNTA ~3 SEK MED DETTA!! inc = 0; if (ni!=0) { ni--; } } } } /* Avbrott vid datakommunikation */ interrupt void SCI_interrupt(void) { inc = SCSR; // kvittera avbrottet inc = SCDR; // kvittera avbrottet & läsa in tecken } /* Avbrott då ny siffra kommer */ interrupt void IC1_interrupt(void) { int temp = 0; int i,j = 0; TFLG1 = 0xFF; //Kvittera avbrottet PORTB = 1; //Tända gult temp = PORTC; temp = temp & 0x0F; temp = temp + 48; if (temp == 0x30){ //Startbit temp = 0x41; //A sendtext(temp); pos = 0; //skriva första biten på första positionen. cidon = 1; return; } if (temp == 0x3E){ //skyddat nr temp = 0x53; //S sendtext(temp); pos = 0; //skriva första biten på första positionen. cidon = 1; return; } if (cidon == 0) { return; //startbit måste komma in först. Har den inte kommit så stäng ner } if (temp == 0x3A) { //Justera för 0:a temp = 0x30; } if (temp == 0x3F) { //Stoppbit sendtext(0x5A); //Z nummer [ni] [pos] = 0x5A; //skriva stopbit (Z) till minnet if (ni == 10) { //Lägg in funktion som skiftar ner minnet for (i=1; i<=10; i++) { for(j=0;j<=10; j++) { nummer[i-1] [j] = nummer[i] [j]; } } } else { ni++; } cidon = 0; //ta inte emot fler tecken innan startbit kommer return; } sendtext(temp); nummer [ni] [pos] = temp; //spara nummer i minnet if (pos < 10) { pos++; } }