Arkitektur og operativsystem (dArkOS)


Besvarelse af ugeopgave, uge 45

Per Abrahamsen, 20001358, 3,
Søren S Munk, 20001614, 3,
Mads Peter Lindberg, 20001990, 3.

www.daimi.au.dk/~smunk/dArkOS/uge45


Der er udformet et program, som løbende viser den rå 10-bit værdi fra en sensor anbragt på indgang 3:
#include "RCX_RTE.h" #define port7_addr 0xffbe #define port7 *((volatile byte *) port7_addr) #define Prgm ! ( port7 & ( 1 << 7 ) ) #define msCount 100 /* A/D converter */ #define byte unsigned char #define word unsigned short int #define ADCR *((volatile byte *) 0xffe9) /* A/D Control Register*/ #define ADCSR *((volatile byte *) 0xffe8) /* A/D Control Status Register*/ #define ADDRA *((volatile word *) 0xffe0) /* A/D Data Register A */ void delay(int16 ms) { int16 i; while( ms > 0){ for(i=0; i<msCount; i++); ms--; } } void _start(void) { ADCSR &=~(1<<4); /* ADCSR.bit 4 = 0, single shot mode */ while (! Prgm){ ADCSR |=(1<<5); /* ADCSR.bit 5 = 1, start A/D conversion */ delay(1000); lcd_show_int16((int16)( (ADDRA >> 6) & 0x3ff)); } RCX_Reset(); }
Og et program, som løbende viser de rå værdier fra alle tre indgange:
#include "RCX_RTE.h" #define port7_addr 0xffbe #define port7 *((volatile byte *) port7_addr) #define Prgm ! ( port7 & ( 1 << 7 ) ) #define msCount 100 /* A/D converter */ #define byte unsigned char #define word unsigned short int #define ADCR *((volatile byte *) 0xffe9) /* A/D Control Register*/ #define ADCSR *((volatile byte *) 0xffe8) /* A/D Control Status Register*/ #define ADDRA *((volatile word *) 0xffe0) /* A/D Data Register A */ #define ADDRB *((volatile word *) 0xffe2) /* A/D Data Register B */ #define ADDRC *((volatile word *) 0xffe4) /* A/D Data Register C */ void delay(int16 ms) { int16 i; while( ms > 0){ for(i=0; i<msCount; i++); ms--; } } void _start(void) { ADCSR |=(1<<1); /* ADCSR.bit 1 = 1, Scan mode enabled */ ADCSR |=(1<<4); /* ADCSR.bit 4 = 0, Scan mode*/ while (! Prgm){ ADCSR |=(1<<5); /* ADCSR.bit 5 = 1, start A/D conversion */ delay(8000); lcd_show_int16((int16)( (ADDRA >> 6) & 0x3ff)); delay(8000); lcd_show_int16((int16)( (ADDRB >> 6) & 0x3ff)); delay(8000); lcd_show_int16((int16)( (ADDRC >> 6) & 0x3ff)); } RCX_Reset(); }
De rå værdier, som blev fundet for de tre typer sensorer:
sensor min værdi max værdi --------------------------------------------------- trykføler 213 1023 lysføler 391 532 temperaturføler 460 725 ----------------------------------------------------
Sammenhængen imellem rå værdier og grader Celsius:
rå værdi grader Celsius -------------------------------- V 86-(V/9.4) --------------------------------
Dette fører til et simpelt digitalt termometer, hvis RCX kører følgende program:
#include "RCX_RTE.h" #define port7_addr 0xffbe #define port7 *((volatile byte *) port7_addr) #define Prgm ! ( port7 & ( 1 << 7 ) ) #define msCount 100 /* A/D converter */ #define byte unsigned char #define word unsigned short int #define ADCR *((volatile byte *) 0xffe9) /* A/D Control Register*/ #define ADCSR *((volatile byte *) 0xffe8) /* A/D Control Status Register*/ #define ADDRA *((volatile word *) 0xffe0) /* A/D Data Register A */ void delay(int16 ms) { int16 i; while( ms > 0){ for(i=0; i<msCount; i++); ms--; } } void _start(void) { ADCSR &=~(1<<4); /* ADCSR.bit 4 = 0, single shot mode */ while (! Prgm){ ADCSR |=(1<<5); /* ADCSR.bit 5 = 1, start A/D conversion */ delay(1000); lcd_show_int16((int16)(95 - (((int16)(ADDRA >> 6) & 0x3ff))/8)); } RCX_Reset(); }
Vi har lavet et program(Temp3.c) der viser minimums værdien hvis man trykker på View. Planen var at den skulle skifte mellem min og max, men det virker ikke ordentligt.