Atmel/Atmega C-Programm für eine ADC-Clock

OP #5829115
Lesenswert?

Sehr geehrte Gentleman,

Ich bräuchte Hilfe bei einem C-Programm damit ich mir meine Note in 
Digitaltechnik ausbessern kann und wäre für ihre Hilfre dankbar.
Die Angabe von meinen Herr Professor lautet:

Entwirf ein C-Programm für den Atmega328P sodass die Spannung am Eingang 
ADC3 mit 10-bit Auflösung gemessen werden. Das Ergebnis soll immer auf 
die Variable 'Messung' geschrieben werden. Als Referenzspannung soll die 
interne Referenzspannung verwendet werden.
Der ADC-Clock soll 125kHz betragen.

Ich glaube meine ADPS bits sollten auf 111 gesetzt werden damit ich ein 
Verteilungsfaktor von 128 kriege.

Dankeschön
#5829126
Lesenswert?

Epic G. schrieb:
> und wäre für ihre Hilfre dankbar.

Und wobei brauchst du jetzt Hilfe?

Ins Datenblatt gucken, ADC richtig konfigurieren, Interrupts 
konfigurieren und bei ADC-Fertig-Interrupt Daten in Variable schubsen.

Ob deine ADPS-Bits stimmen, können wir ohne Angabe des Systemtaktes 
nicht sagen.

Epic G. schrieb:
> meine Note in
> Digitaltechnik ausbessern

Du sollst deine Note aufbessern. Nicht wir ;)

Hier gibt es (hoffentlich) höchstens Hilfe zur Selbsthilfe.

Also, formuliere ein konkretes Problem und du bekommst eine Antwort.
Niemand wird dir deine Hausaufgaben machen und dir fertigen Code 
liefern, den du dann nicht einmal erklären kannst, wenn dich dein Lehrer 
danach fragt.
#5829179
Lesenswert?

Epic G. schrieb:
> Entwirf ein C-Programm für den Atmega328P sodass die Spannung am Eingang
> ADC3 mit 10-bit Auflösung gemessen werden. Das Ergebnis soll immer auf
> die Variable 'Messung' geschrieben werden. Als Referenzspannung soll die
> interne Referenzspannung verwendet werden.
> Der ADC-Clock soll 125kHz betragen.

Um dir den richtigen Teiler für den ADC-Clock nennen zu können brauchen 
wir zwingend die Taktrate, mit der der Atmega laufen soll.

Auch ist die maximale Mess-Spannung nicht bekannt. Die Beschaltung des 
Atemgas ist ebenso von Interesse.

Der Rest ist Fleißarbeit, kann z.B. so aussehen:
1
#include <avr/io.h>
2

3
uint16_t Messung;
4

5
int main(void){
6
  ADCSRA |= (1 << ADSP0);
7
  ADMUX |= (1 << REFS0)|(1 << REFS1);
8
  ADMUX |= (1 << MUX1)|(1 << MUX0);
9
  ADCSRA |= (1 << ADEN)|(1 << ADSC);
10
  while(ADCSRA & ~(1 << ADSC)){
11
  }
12
  for(;;){
13
    ADCSRA |= (1 << ADSC);
14
    while(ADCSRA & ~(1 << ADSC)){
15
    }
16
    Messung = ADC;
17
  }
18
  return 0;
19
}
Schau dir ruhig mal an was der Code macht, er ist aber nicht die Lösung 
deiner Aufgabe.
OP #5829182
Lesenswert?

Das verstehe ich natürlich, ich habe schon mit meinen Code angefangen 
aber bin mir nicht sicher wie ich weiter arbeiten soll. Hier ist mein 
Code:

/*
 * ADC_Testbsp_seliga.c
 *
 * Created: 03.05.2019 10:35:07
 * Author : seligpat
 */


#include <avr/io.h>


int messung;

int main()
{
  DDRD |= 0xFF;
  ADMUX &= ~((1<<MUX3)|(1<<MUX2)|(1<<MUX1)|(1<<MUX0));  // A0 
pin//Enables ADC
  ADMUX |= ((1<<REFS0)|(1<<REFS1));
  ADCSRA |= 1<<ADPS2 | 1<<ADPS1 | 1<<ADPS0;       //ADC Prescalar auf 
128 setzen, meine ADC Frequenz ist 125KHz
  ADCSRA |= 1<<ADEN;
  //Serial.begin(9600);


  while(1)
  {
    ADCSRA |= (1<<ADSC);

    while(ADCSRA &(1<<ADSC));

    messung = ADC;


    if (messung == 0)
    {
      PORTD |= (1<<4);
    }
    else PORTD &= ~(1<<4);
  }
}
#5829204
Lesenswert?

Epic G. schrieb:
> Muss ich
> nicht noch ein I2C-Bus reinprogrammieren damit ich es zB auf mein BCD
> board ablesen kann?

Ist das in der Aufgabe gefordert?

Was ist denn ein "BCD Board"? Bzw. auf welche Hardware nutzt du für den 
AtMega328P?

Die paar Indizien weisen auf einen Arduino hin. Korrekt?

Dann ist das einfachste, was du machen kannst, die Serielle 
Schnittstelle dafür zu nutzen und einfach den Inhalt der Variable 
'messung' in der Schleife seriell auszugeben. Dann kannst du am 
Computer, ohne zusätzliche Hardware, sehen, was passiert.

Und an dem Analogen Eingang brauchst du natürlich etwas, um den Messwert 
zu verändern.

Hängt ein bisschen von den Möglichkeiten, die du hast, ab.
OP #5829213
Lesenswert?

Sebastian R. schrieb:
> Ist das in der Aufgabe gefordert?
>
> Was ist denn ein "BCD Board"? Bzw. auf welche Hardware nutzt du für den
> AtMega328P?
>
> Die paar Indizien weisen auf einen Arduino hin. Korrekt?
>
> Dann ist das einfachste, was du machen kannst, die Serielle
> Schnittstelle dafür zu nutzen und einfach den Inhalt der Variable
> 'messung' in der Schleife seriell auszugeben. Dann kannst du am
> Computer, ohne zusätzliche Hardware, sehen, was passiert.
>
> Hängt ein bisschen von den Möglichkeiten, die du hast, ab.

Ich hab einfach ein BCD Board mit einer 7-Segment Anzeige.

Ja ich benutze einen Arduino.

Ich arbeite normalerweise mit Oszilloskopen wo ich dank Messungen alles 
ablesen kann, oder ich lese meine Werte aus einer 7-Segment anzeige. Am 
Computer hab ich nie wirklich geschaut ob mein Code ohne zusätzliche 
Hardware funktioniert also kenne ich mich da nicht aus.
#5829217
Lesenswert?

Epic G. schrieb:
> lese meine Werte aus einer 7-Segment anzeige

Wenn es dir gelingt, die Zahlen 0...1023 mit einer Ziffer 
darzustellen...

Du könntest den Messwert mit der Funktion map() auf 0...9 
herunterbrechen und auf der 7-Segment-Anzeige anzeigen.


Du hast in deinem Quelltext ja schon das "Serial.begin(9600);", aber 
auskommentiert, wo kommt das denn her?

Dein Code muss ohne zusätzliche Hardware funktionieren, denn alles, was 
du tun sollst, ist in dem Controller enthalten.

Wenn du das Serial.begin einbaust, kannst du in der Hauptschleife mit 
"Serial.println(messung);" den Messwert ausgeben. In der Arduino IDE 
hast du oben Rechts die Lupe, mit der du den Seriellen Monitor aufrufen 
kannst, da kommen dann die Zahlen an und werden ausgegeben. 
(Kurzfassung)
OP #5829225
Lesenswert?

Sebastian R. schrieb:
>
> Wenn es dir gelingt, die Zahlen 0...1023 mit einer Ziffer
> darzustellen...
>
> Du hast in deinem Quelltext ja schon das "Serial.begin(9600);", aber
> auskommentiert, wo kommt das denn her?
>
> Dein Code muss ohne zusätzliche Hardware funktionieren, denn alles, was
> du tun sollst, ist in dem Controller enthalten.
>
> Wenn du das Serial.begin einbaust, kannst du in der Hauptschleife mit
> "Serial.println(messung);" den Messwert ausgeben. In der Arduino IDE
> hast du oben Rechts die Lupe, mit der du den Seriellen Monitor aufrufen
> kannst, da kommen dann die Zahlen an und werden ausgegeben.
> (Kurzfassung)

Nein ich hab eine Anzeige mit 4 Ziffern natürlich.

Der Code scheint schon daweil zu funktionieren, ist aber noch nicht 
fertig.

Ich versuch es mal.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren