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

OP #5829115
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
Gast
Hi

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

Aber nur, wenn der Takt des ATMega328 16 MHz beträgt.

MfG Spess
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.
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
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);
  }
}
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
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.
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
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

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.