Forum: Mikrocontroller und Digitale Elektronik Atmel/Atmega C-Programm für eine ADC-Clock


von Epic G. (epicgamer69)


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

von Michael U. (amiga)


Lesenswert?

Hallo

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

das Datenblatt des Mega328 behauptet das zumindest.

Gruß aus Berlin
Michael

von spess53 (Gast)


Lesenswert?

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

von Sebastian R. (sebastian_r569)


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.

von M. K. (sylaina)


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.

von Epic G. (epicgamer69)


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);
  }
}

von Sebastian R. (sebastian_r569)


Lesenswert?

Epic G. schrieb:
> bin mir nicht sicher wie ich weiter arbeiten soll

Ist denn aus deiner Sicht die Aufgabenstellung damit erfüllt?
Hast du alle Vorgaben erfüllt? Funktioniert der Code, wie er soll?

Wenn ja: Fertig. Ggf. noch etwas besser kommentieren

von Epic G. (epicgamer69)


Lesenswert?

Wie genau müsste ich eben testen dass er funktoniert? Ich habe zwar 
keine Fehler im Programm aber es fehlt mir sicher noch etwas. Muss ich 
nicht noch ein I2C-Bus reinprogrammieren damit ich es zB auf mein BCD 
board ablesen kann?

von S. Landolt (Gast)


Lesenswert?

> Hast du alle Vorgaben erfüllt?
Gute Frage, gar mit Hintergedanke? ... wenn ich mir den Kanal anschaue 
...

von Sebastian R. (sebastian_r569)


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.

von Epic G. (epicgamer69)


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.

von Sebastian R. (sebastian_r569)


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)

von Epic G. (epicgamer69)


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.

von Sebastian R. (sebastian_r569)


Lesenswert?

Okay. Mach es so, wie du es am einfachsten für dich ist. Dann bietet 
sich diese Anzeige vielleicht an.

Hast du ein Potentiometer oder ähnliches an dem Pin, um den Wert ändern 
zu können?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.