/************************************************************************* test.c ------ Detta ar huvudprogrammet som ar skrivet i ANSI C. Exekveringen av hela programpaketet borjar i pmain.68k (lage __main). exp4() anropas fran assemblyprogrammet exp4.68k vid avbrott. _avben() anropar avben.68k vilket tillater avbrott fran PI/T. ****************************************************************************/ unsigned short int *adleft,*adright,*readbutton,*adread,*latch1,*latch2,*sram,*resettid,*switchen,*minne; /* Ett annat satt att */ /* definiera adresser */ unsigned short int left,right,refdiod,run,leftadjust,rightadjust,previous,wait,button,secondWheel,go,lr,first,avb2,ontejp,first,kor,latchen,offtejp,hopp,avb5,onigen,switcha,startminne; main() { startminne = 0; starten: adleft = (unsigned short int *) 0x01c001; adright = (unsigned short int *) 0x01c000; adread = (unsigned short int *) 0x01c000; readbutton = (unsigned short int *) 0x01c002; /*latch1 = (unsigned short int *) 0x008000; */ latch2 = (unsigned short int *) 0x00c000; sram = (unsigned short int *) 0x018000; minne = (unsigned short int *) 0x018100; resettid = (unsigned short int *) 0x00a000; switchen = (unsigned short int *) 0x01c003; *latch2 = 0x00; secondWheel = 0; hopp = 0; latchen = 0x00; run = 1; switcha = 0x00; previous = 0; ontejp = 0; offtejp = 0; onigen = 0; first = 0; go = 0; lr = 0; kor = 0; first = 0; avb2 = 0; avb5 = 0; button = 0xff; refdiod = 0x00; right = 0x00; left = 0x00; _avben(); /* tillat avbrott */ wait = 0; waitforbutton(); initdiods(); waitforbutton(); startad(); tejploop: if (ontejp == 1) { if (left <= refdiod || right <= refdiod) { onigen = 1; if (previous == 0) { hopp = 0x26; /* hoger motor och hoger lysdiod lyser */ } else { hopp = 0x89; /* vanster motor och vanster lysdiod lyser */ } ontejp = 0; } } else if (left > refdiod && right <= refdiod) { previous = 0; latchen = 0x89; /* vanster motor och hoger lysdiod lyser */ } else if (left <= refdiod && right > refdiod) { previous = 1; latchen = 0x26; /* hoger motor och vanster lysdiod lyser */ } else if (left <= refdiod && right <= refdiod) { latchen = 0xaf; /* bada motorerna och bada lysdioderna lyser */ } if (left > refdiod && right > refdiod) { ontejp = 1; if (previous == 0) { latchen = 0x88; /* vanster motor och ingen lysdiod lyser */ } else { latchen = 0x24; /* hoger motor och ingen lysdiod lyser */ } } if (switcha > 90 && startminne == 0) { startminne = 1; goto starten; } goto tejploop; /* evig loop */ } void startad() { go = 5; *switchen = 0x00; return; } void waitforbutton() { first = 0; button = 0xff; go = 1; while (wait == 0) { avb2 = 0; while (avb2 == 0); if (button == 0x00) { wait = 1; go = 0; } } return; } void initdiods() { avb2 = 0; go = 2; while (avb2 == 0); avb2 = 0; go = 3; while (avb2 == 0); avb2 = 0; go = 4; while (avb2 == 0); avb2 = 0; refdiod = ((leftadjust + rightadjust)/2); blink(); go = 0; return; } void blink() { unsigned long int whilei; whilei = 0; while (whilei < 3) { blink1(); whilei++; } return; } void blink1() { unsigned long int whilek,whilel,whilem,whilen; whilek = 0; whilel = 0; whilem = 0; whilen = 0; while (whilek < 3000) { *latch2 = 0x02; whilek++; } while (whilel < 3000) { *latch2 = 0x03; whilel++; } while (whilem < 3000) { *latch2 = 0x01; whilem++; } while (whilen < 5000) { *latch2 = 0x00; whilen++; } return; } void slask3() { return; } void slask2() { return; } void slask() { return; } exp2() /* avbrottsprogram */ { if (go == 10) { avb2 = 1; switcha = *adread; *readbutton = 0x00; } else if (go == 0) { *readbutton = 0x00; return; } else if (go == 1) { avb2 = 1; if (first == 1) { button = *adread; } first = 1; *readbutton = 0x00; return; } else if (go == 2) { avb2 = 1; *adleft = 0x00; return; } else if (go == 3) { avb2 = 1; leftadjust = *adread; *adright = 0x00; return; } else if (go == 4) { avb2 = 1; rightadjust = *adread; *readbutton = 0x00; return; } else { if (lr == 0) { switcha = *adread; lr = 1; *adright = 0x00; } else if (lr == 1) { right = *adread; lr = 2; *adleft = 0x00; } else { left = *adread; lr = 0; *switchen = 0x00; } } return; } exp5() /* avbrottsprogram */ { if (switcha > 0x90) { *latch2 = *minne; minne++; *resettid = 0x00; return; } else if (go == 5) { avb5 = 1; if (onigen > 0) { *latch2 = hopp; *minne = hopp; minne++; onigen++; if (onigen == 20) { onigen = 0; } } else if (run == 3) { *latch2 = 0xaf; /* bada motorerna och bada lysdioderna lyser */ *minne = 0xaf; /* spara undan i minnet */ minne++; } else if (run == 4) { *latch2 = 0x00; /* ingen motor och ingen lysdiod lyser */ *minne = 0x00; /* spara undan i minnet */ minne++; } else { *latch2 = latchen; /* skickar det aktuella värdet till latchen */ *minne = latchen; /* spara undan i minnet */ minne++; } run++; if (run >= 5) { run = 1; } *resettid = 0x00; return; } else { *resettid = 0x00; return; } }