Gå til innhold

Kan noen forklare meg sammenhengen på koden? (ADC)


Anbefalte innlegg

  • 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 av cenenzo
Lenke til kommentar
Videoannonse
Annonse

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

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

 

  • 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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...