cenenzo Skrevet 13. mai 2014 Del Skrevet 13. mai 2014 (endret) Lag et C-program som leser lufttrykket, fra en lufttrykk-sensor, som er koblet til ADC inngang 3, og som skriver ut lufttrykk på PC-skjerm, i hPa.Det brukes en analog lufttrykk-sensor, og elektronikken er laget slik at den dekker et området fra 900 til 1100 hPa. Elektronikken er laget slik at 900 hPa gir 0,0 Volt inn på ADC, og 1100 hPa gir 5,0 Volt inn på ADC. Programmet skal gå i evig løkke. Det er greit at det brukes 8 bit ADC. Det er ønskelig at konverteringstiden er lengst mulig. De som ønsker det, kan sende ut desimalverdien, og bruke 10 bit ADC. DATABLAD µC: AtMega128: http://www.atmel.com/Images/doc2467.pdf Dette løsningsforslag bruker 8 bit ADC: #include <dev/board.h> #include <stdio.h> #include <sys/timer.h> int main(void) { unsigned long baud = 9600; unsigned char les; float trykk; char fortegn; NutRegisterDevice(&DEV_UART, 0, 0); freopen(DEV_UART_NAME, "w", stdout); freopen(DEV_UART_NAME, "r", stdin); _ioctl(_fileno(stdout), UART_SETSPEED, &baud); ADMUX = (1 << REFS0) | (1 << ADLAR) | (1 << MUX0) ) | (1 << MUX1); /* Hvorfor har vi v å bruke ADMUX REFS0 , ADLAR , MUX0 , MUX1?*/ while(1) { ADCSRA = (1 << ADEN) | (1 << ADSC) | (1 << ADIF) | (1 << ADPS2) ) | (1 << ADPS1) ) | (1 << ADPS0); /* HVORFOR ADCSRA, ADEN , ADSC , ADIF , ADPS2 , ADPS1 , ADPS0*/ while (!(ADCSRA & 0x10)); /* Hva er det inne i parantesen til While løkken? */ les = ADCH; trykk = (((les * 200.0)/255 ) + 900.0); printf("\nLufttrykket er = %2.1f hPa \n", trykk ); NutSleep(800); } return 0; } Jeg har markert skriften på koden med rødfarge der hvor det er spørsmål! Håper noen kan svare meg på dette! For jeg kan ikke skjønner hvorfor det er blitt brukt MUX ADEN osv som er i koden. Og jeg ser heller ingen sammenheng med oppgave teksten og databladet. Så hadde vært fint med en forklaring, hvorfor dette blir brukt osv, og hvordan jeg kan se sammenhengen og løse det med databladet. Endret 13. mai 2014 av cenenzo Lenke til kommentar
Giddion Skrevet 13. mai 2014 Del Skrevet 13. mai 2014 koden skal kjøre på en mikrokontroller (tenk liten pc) ADMUX og ADCSRA er registre (tenk globale varibler) som som styrer og gir status om adc på kontrolleren. Generelt tips er søk registrene i databladet. Hvis du fortsatt lurer på noe så start på toppen av adc i manualen. Hvis ikke det hjelper så spør her. Håper det hjelper og lykke til Lenke til kommentar
cenenzo Skrevet 13. mai 2014 Forfatter Del Skrevet 13. mai 2014 koden skal kjøre på en mikrokontroller (tenk liten pc) ADMUX og ADCSRA er registre (tenk globale varibler) som som styrer og gir status om adc på kontrolleren. Generelt tips er søk registrene i databladet. Hvis du fortsatt lurer på noe så start på toppen av adc i manualen. Hvis ikke det hjelper så spør her. Håper det hjelper og lykke til hvilken side bør jeg starte å lese på? Lenke til kommentar
Giddion Skrevet 14. mai 2014 Del Skrevet 14. mai 2014 sidene der det står om registrene du lurte på. Hvis ting fortsatt er uklart så Start å les i kapittelet om adc (side 230) Lenke til kommentar
Yoho! Skrevet 15. mai 2014 Del Skrevet 15. mai 2014 Lag et C-program som leser lufttrykket, fra en lufttrykk-sensor, som er koblet til ADC inngang 3, og som skriver ut lufttrykk på PC-skjerm, i hPa.Det brukes en analog lufttrykk-sensor, og elektronikken er laget slik at den dekker et området fra 900 til 1100 hPa. Elektronikken er laget slik at 900 hPa gir 0,0 Volt inn på ADC, og 1100 hPa gir 5,0 Volt inn på ADC. Programmet skal gå i evig løkke. Det er greit at det brukes 8 bit ADC. Det er ønskelig at konverteringstiden er lengst mulig. De som ønsker det, kan sende ut desimalverdien, og bruke 10 bit ADC. DATABLAD µC: AtMega128: http://www.atmel.com/Images/doc2467.pdf Dette løsningsforslag bruker 8 bit ADC: #include <dev/board.h> #include <stdio.h> #include <sys/timer.h> int main(void) { unsigned long baud = 9600; unsigned char les; float trykk; char fortegn; NutRegisterDevice(&DEV_UART, 0, 0); freopen(DEV_UART_NAME, "w", stdout); freopen(DEV_UART_NAME, "r", stdin); _ioctl(_fileno(stdout), UART_SETSPEED, &baud); ADMUX = (1 << REFS0) | (1 << ADLAR) | (1 << MUX0) ) | (1 << MUX1); /* Hvorfor har vi v å bruke ADMUX REFS0 , ADLAR , MUX0 , MUX1?*/ while(1) { ADCSRA = (1 << ADEN) | (1 << ADSC) | (1 << ADIF) | (1 << ADPS2) ) | (1 << ADPS1) ) | (1 << ADPS0); /* HVORFOR ADCSRA, ADEN , ADSC , ADIF , ADPS2 , ADPS1 , ADPS0*/ while (!(ADCSRA & 0x10)); /* Hva er det inne i parantesen til While løkken? */ les = ADCH; trykk = (((les * 200.0)/255 ) + 900.0); printf("\nLufttrykket er = %2.1f hPa \n", trykk ); NutSleep(800); } return 0; } Jeg har markert skriften på koden med rødfarge der hvor det er spørsmål! Håper noen kan svare meg på dette! For jeg kan ikke skjønner hvorfor det er blitt brukt MUX ADEN osv som er i koden. Og jeg ser heller ingen sammenheng med oppgave teksten og databladet. Så hadde vært fint med en forklaring, hvorfor dette blir brukt osv, og hvordan jeg kan se sammenhengen og løse det med databladet. Eksamen til mandag? Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå