Forum: Mikrocontroller und Digitale Elektronik A/D-Wanlung, Potis, Programmeinbindung


von Markus L. (snerpy22)


Lesenswert?

Hallo!

Also ich hab als Aufgabe eine A/D-Wandlung vorzuführen und den dafür 
vorgesehenen Programmquellcode zu schreiben bekommen. D.h. ich muss 
meine zwei vorhandenen Potis einsetzen und man muss etwas sehen. Die 
ganze Wandlung muss in einem Programm eingebunden sein, es ist recht 
egal, was es macht. Ich habe hier einen Ablaufplan einer Wandlung vor 
mir liegen und weiß auch wie man z.B. Bits liest, setzt oder löscht. 
Jedoch habe ich keine Vorstellung, wie ich es in ein Programm verpacken 
soll bzw. wie ich anfangen soll. Könnt ihr mir da paar Tipps geben? Wäre 
euch sehr dankbar! Hab den Kurs in der Schule freiwillig dazugewählt, 
finde ihn aber nicht gerade leicht, deshalb hoffe ich, dass ihr mir es 
nicht übel nehmt!

von Hubert G. (hubertg)


Lesenswert?

Jetzt wissen alle genau was du möchtest. Kennen den A/D-Wandler, das 
Ausgabemedium usw.
Ab 17.00 sind nämlich alle Glaskugeln schon gereinigt und für morgen 
vorbereitet.

von Markus L. (snerpy22)


Lesenswert?

Ich möcht ja keinen fertigen Code, sondern einfach nur ein 
Programmbeispiel, also wie man die Potis in irgendein Programm einfügen 
kann. Wenn das nicht reicht, such ich gleich alle Daten und schreib sie 
auf.

von Karl H. (kbuchegg)


Lesenswert?

Markus L. schrieb:
> Ich möcht ja keinen fertigen Code, sondern einfach nur ein
> Programmbeispiel, also wie man die Potis in irgendein Programm einfügen
> kann. Wenn das nicht reicht, such ich gleich alle Daten und schreib sie
> auf.

Es reicht schon mal, wenn du verrätst, welche AD Wandler, bzw. welchen 
µC du überhaupt verwendest.
Es gibt da draussen nämlich mehr als nur einen Typ von Prozessor.

von troll (Gast)


Lesenswert?


von Oliver S. (oliverso)


Lesenswert?

Bitte sehr:
1
int main(void)
2
{
3
   while(1)
4
   {
5
      int p1 = liesPoti(1);
6
      int p2 = liesPoti(2);
7
      displayLCD(p1);
8
      displayLCD(p2);
9
   }
10
11
}

Die Funktionen musst du dir halt selber schreiben...

Oliver

von Markus L. (snerpy22)


Lesenswert?


von troll (Gast)


Lesenswert?

Ein 8051er von Atmel, das ist ja schon mal was. Erste Anlaufstelle 
bleibt das Datenblatt von dem Käfer, Sektion ADC-Converter.

von Karl H. (kbuchegg)


Lesenswert?

Markus L. schrieb:
> 
http://www.elektor.de/products/kits-modules/modules/090907-91-first-step-board.1283430.lynkx
>
> Das ist der Microcontroller


Auf diesem Artikel gibt es eine Verlinkung zu einem anderen Artikel über 
dieses Board. Dort ist von Gratis-Demo Software die Rede. Nur will ich 
mich nicht bei Elektor registrieren um die mal durchzusehen :-)

Ist denn bei diesem Demos keine Demo für den ADC dabei?
Da gibts doch sicher auch ein Demo, welches den ADC in Aktion vorführt, 
nachdem sie das in der Board-Beschreibung schon so rausstellen, dass da 
2 Potis für den ADC mit am Board sind.

von Hubert G. (hubertg)


Lesenswert?

Wow, mir ist zwar klar das 8051er speziell im Industriebereich noch 
immer sehr aktuell sind, aber den Preis für das Board!!
Wenn ich mir dagegen den Preis für einen Arduino Mega2560 anschaue.

von Markus L. (snerpy22)


Lesenswert?

Hab mir die oben beschriebene Datei heruntergeladen und sie geöffnet:

Dort gibts einen Ordner namens "Demo-Software" und dann eine Datei mit 
"AD_Wandler"

Das ist dort enthalten: http://pastebin.com/mDqDFJ04

von Karl H. (kbuchegg)


Angehängte Dateien:

Lesenswert?

Markus L. schrieb:
> Hab mir die oben beschriebene Datei heruntergeladen und sie geöffnet:
>
> Dort gibts einen Ordner namens "Demo-Software" und dann eine Datei mit
> "AD_Wandler"
>
> Das ist dort enthalten: http://pastebin.com/mDqDFJ04

Du darfst ruhig Code auch hier posten :-)

von Karl H. (kbuchegg)


Lesenswert?

Na, sieht doch gut aus!
Was brauchst du denn noch!

1
/*     Programm:            Betrieb des ON-Chip A/D-Wandlers und Darstellung    */
2
/*                          der Wandlungsergebnisse auf HyperTerm!              
3
4
5
....
6
7
/*  Die Funktion void seri_init(void) initialisiert die ser. Schnittstelle des  */
8
/*  CC03ers bei einer Taktfrequenz von 11,0592MHz mit nachfolgenden Schnitt-    */
9
/*  stellen Parametern: 9600 Bd, 1 Stopp-Bit, keine Parität, asynchr. Betrieb!  */

Programm in den µC übertragen.
Die serielle Schnittstelle verkabeln (so das nicht längst geschehen 
ist), Hyperterminal am PC starten, auf die Übertragungsparameter 
einstellen und mal schauen was sich tut.

Was willst du denn noch mehr? Ist doch eh alles da, was du brauchst.

von Markus L. (snerpy22)


Lesenswert?

Also ich hab hier wie oben beschrieben noch ein Blatt

Auf jeden Fall hab ich vor mir einen Ablauf:

1. A/D-Wandler initialisieren
 - SFR 'ADCF' beschreiben
 - SFR 'ADCON' beschreiben

2. A/D-Wandlung starten
 - SFR 'ADCON' beschreiben
3. Warten bis Wandlung fertig
 - Abfragen des Fertig-Bits
4. Löschen des Fertig-Bits
5. Wandlungwerts auslesen
 - SFR 'ADDH' und ggf. 'ADDL'.

Was das jetzt genau mit dem Code ein Post über mit zu tun hat, weiß ich 
nicht so recht.

Zu 1. z.B.: ADCF=ADCF|8;

Oder allgemein Bit setzen: wert=wert|b;

von troll (Gast)


Lesenswert?

Markus L. schrieb:
> Was das jetzt genau mit dem Code ein Post über mit zu tun hat, weiß ich
> nicht so recht.
Das dürfte so ziemlich das sein was du suchst...

Kannst du überhaupt C? Hast du den geposteten Code mal angeguckt und 
verstanden?

von Karl H. (kbuchegg)


Lesenswert?

Markus L. schrieb:


> Was das jetzt genau mit dem Code ein Post über mit zu tun hat, weiß ich
> nicht so recht.


Nicht?

Also wenn ich mir den Code da oben so ansehe, dann finde ich dort alle 
von dir aufgezählten Teile wieder. Und das ganz in einem fertigen 
Programm, welches nur darauf wartet mal ausgetestet zu werden, ehe man 
dann beginnt es so umzuarbeiten, wie du dir das vorstellst.

von Markus L. (snerpy22)


Lesenswert?

troll schrieb:
> Markus L. schrieb:
>> Was das jetzt genau mit dem Code ein Post über mit zu tun hat, weiß ich
>> nicht so recht.
> Das dürfte so ziemlich das sein was du suchst...
>
> Kannst du überhaupt C? Hast du den geposteten Code mal angeguckt und
> verstanden?

Wenn du so fragst: Nein. Ich verstehe schon einiges, aber ich sehe 
ehrlichgesagt nicht das, was ich sehen sollte. Und wenn ich den Code 
kopiere und testen möchte, wird mir ein Error angezeigt.

von troll (Gast)


Lesenswert?

Markus L. schrieb:
> Wenn du so fragst: Nein.
Das ist nicht gut...

> Und wenn ich den Code
> kopiere und testen möchte, wird mir ein Error angezeigt.
Der da wäre?

von Karl H. (kbuchegg)


Lesenswert?

> 1. A/D-Wandler initialisieren
>  - SFR 'ADCF' beschreiben
>  - SFR 'ADCON' beschreiben

Aus dem Code
1
void main(void)
2
  {
3
    ....
4
5
    ADCF = 0xc0;                                        // Port P1.6 und P1.7 als Analogeingang!
6
    ADCON = 0x20;                                       // ON-Chip A/D-Wandler eingeschaltet!
7
    ....
8
    while

Jep, abhgehakt. Punkt 1 ist da

> 2. A/D-Wandlung starten
>  - SFR 'ADCON' beschreiben
1
unsigned int mw_erf10(unsigned char kanal)
2
  {      
3
...
4
    ADCON = (ADCON & 0xe8);                 // Kanalauswahl und Wandlungsende-Bit rücksetzen!
5
    ADCON = (ADCON | (0x08+kanal));         // Kanalauswahl und Start der einmaligen Wandlung!
6
...
Jep, abgehakt. Punkt 2 ist da

> 3. Warten bis Wandlung fertig
>  - Abfragen des Fertig-Bits
1
unsigned int mw_erf10(unsigned char kanal)
2
  {      
3
 ...
4
5
    while((ADCON & 0x10) == 0);             // Warte bis A/D-Wandlung beendet ist!
6
....


Noch ein Jep. Punkt 3 ist vorhanden

> 4. Löschen des Fertig-Bits
Ist laut Kommentar im Punkt 2 schon mitgemacht worden.

> 5. Wandlungwerts auslesen
>  - SFR 'ADDH' und ggf. 'ADDL'.
1
unsigned int mw_erf10(unsigned char kanal)
2
  {
3
...
4
5
    erg = ((ADDH << 2) + (ADDL & 0x03));    // Ergebnisregister auslesen u. zusammenbauen!
6
    return(erg);
7
  }
8
...


Auch vorhanden.

Alles da, was auf deiner Liste steht.

von Karl H. (kbuchegg)


Lesenswert?

> aber ich sehe ehrlichgesagt nicht das, was ich sehen sollte.

Das ist aber schlecht. Denn noch deutlicher kann man es kaum mehr 
präsentieren.

von Markus L. (snerpy22)


Lesenswert?

Okay, bloß stimmen Sachen wie "(unsigned char kanal)" oder "
    erg = ((ADDH << 2) + (ADDL & 0x03));" gar nicht mit meinen 
Unterlagen überein und sowas verstehe ich auch z.B. gar nicht.

Sonst ist mir klar, was da passiert (ist ja auch nicht schwer bei den 
Kommentaren daneben 8o)

von troll (Gast)


Lesenswert?

Markus L. schrieb:
> sowas verstehe ich auch z.B. gar nicht.
Dann zurück zum Start ähh C-Buch... Wenn du die Grundlagen nicht 
beherrscht bringt es nichts weiter zu machen.

Guck dir die Sachen in Ruhe an:

>     erg = ((ADDH << 2) + (ADDL & 0x03));

1. Es ist eine Zuweisung.
2. Das Ziel ist erg
3. Es wird eine Summe zugewiesen.
4. Der erste Summand ist ADDH um 2 Stellen nach links geschoben 
(entspricht Multiplikation mit 4)
5. Der zweite Summand ist ADDL UND 0x03, das bedeutet es werden nur die 
zwei untersten Bits betrachetet.

Ganz einfach :-)

von Markus L. (snerpy22)


Lesenswert?

Ich lache gerade etwas, sowas hatte ich nie!

Ich dachte an sowas:

1. A/D-Wandler initialisieren
 - SFR 'ADCF' beschreiben
 - SFR 'ADCON' beschreiben

=> ADCF=ADCF|8

Oder zu 3

=> while (ADCON&16=0)
{

}

von Karl H. (kbuchegg)


Lesenswert?

Markus L. schrieb:
> Ich lache gerade etwas, sowas hatte ich nie!

Tja. Viele Wege führen nach Rom.


> while (ADCON&16=0)

Das ist eine Zuweisung und kein Vergleich!
Und was könnte wohl der Vorteil sein, wenn man anstelle von 16 die 
gleichwertige Hexadezimalzahl 0x10 schreibt?

(denn im Original steht GENAU das gleiche, was auch du erwartet hast. 
Nur ist die Zahl in einem anderen Zahlensystem. Nicht Dezimal sondern 
Hexadezimal. Aber 0x10 IST 16. Oder Binär 0b00010000)

von Markus L. (snerpy22)


Lesenswert?

Sorry, das wusst ich nicht. Es ist einfach so, dass wir unser Program 
vorstellen müssen und der Lehrer uns bestimmte Vorlagen gab in Sachen 
Bits lesen, setzen und löschen. Den Ablauf verstehe ich schon, ich bin 
halt unfähig den Code zu schreiben, geschweige denn es in ein Programm 
einzubinden.

1. Wenn Sie mit dem ON-Chip-A/D-Wandler des CC03ers arbeiten, müssen Sie 
IMMER als Erstes festlegen, welche Pings vom Port P1 als analoge 
Eingänge dienen sollen, d.h. Sie müssen IMMER als Erstes das SFR 'ADCF' 
beschreiben. Beachten Sie, dass ADCF ist nur als Ganzes beschreibar und 
nicht bitadressiert ist.

=> ADCF=ADCF|8;

Als nächstes kommt das Steuer-SFR 'ADCON' an die Reihe: hier wird der 
gewünsche zu wandelnde Kanal ausgewählt und der A/D-Wandler 
eingeschaltet. Des PSIDLE-Mode benutzen wir hier nicht und nicht benutze 
Bits (im SFR mit 'X' gekennzeichnet) werden auf logisch 0 gesetzt. Die 
Wandlung soll noch NICHT gestartet werden

=> ADCON=ADCON|8;

von Markus L. (snerpy22)


Lesenswert?

Also ich hab mal was versucht und das hier hergezaubert..

Ist da überhaupt irgendwas richtig?

http://pastebin.com/u0KETSRM

von Jobst M. (jobstens-de)


Lesenswert?

Markus L. schrieb:
> Also ich hab mal was versucht und das hier hergezaubert..

Dann füge es doch auch bitte hier an! ;-)

Welche Sprache programmiert Ihr denn? Wenn Ihr Euch nur mit Assembler 
befasst, dann ist es klar, daß Du nichts von dem Beispielprogramm 
verstehst.


Gruß

Jobst

von Markus L. (snerpy22)


Lesenswert?

1
#include <stdio.h>                      // Standard Ein-/Ausgabefunktionen
2
#include <at89C51cc03.h>                // CC03er-Grundregister
3
4
5
void initSerial(void)   
6
{
7
    SCON = 0x52;    //  9600 Baud, 8 Datenbit, 1 Stopp-Bit, asynchroner Betrieb,
8
    TMOD |=0x20;    //  keine Parit?tspr?fung.
9
    TH1  = 0xfd;    //  
10
    TR1  = 1;       //  Datenuebertragungs-Parameter ?bernehmen
11
    TI   = 1;       //  nichts uebertragen
12
}
13
14
void main(void)
15
16
{
17
18
  initSerial();
19
20
  ADCF = 0xc0;                                       
21
  ADCON = 0x20;  
22
23
  while(1)
24
25
    {
26
       ADCON = (ADCON | 8);   
27
       while((ADCON & 16) == 0);
28
         {
29
         } 
30
       ADCON=ADCON&(255-16);
31
       if(16&b>0)
32
        {
33
        }
34
}

Hab mich an den obigen Posts gehalten und an meine Unterlagen 
(versucht).

Achja: Wir hatten die Grundlage von C, mehr nicht. So richtig einfache 
Befehle. Das von oben sieht nach längerem Hinsehen auch nicht mega 
schwer aus, aber sowas hatten wir halt einfach nicht..

von Markus L. (snerpy22)


Lesenswert?

Falls man nicht puschen darf bitte löschen! Ich wollt nur ne kleine 
Rückmeldung haben vom obigen Post, ob da überhaupt irgendwas richtig ist 
und ob ich da aufm richtigen Weg bin

von Karl H. (kbuchegg)


Lesenswert?

Markus L. schrieb:
> Falls man nicht puschen darf bitte löschen!

Ist schon ok.

> Ich wollt nur ne kleine
> Rückmeldung haben vom obigen Post, ob da überhaupt irgendwas richtig ist
> und ob ich da aufm richtigen Weg bin

Na ja. Du hast ja da im Grunde noch gar nichts geschrieben, was jetzt 
irgendwie groß problematisch wäre.


Aus
1
int main()
2
{
3
4
  Wandler initialisieren
5
6
7
  while( 1 ) {
8
9
    Starte den Wandler
10
11
    Warte bis der Wandler fertig ist
12
13
    Hole das Ergebnis
14
15
    Mach was mit dem Ergebnis
16
17
  }
18
}

folgt ja dein Code mehr oder weniger unmittelbar.
Was das
 if(16&b>0)
da drinn zu suchen hat, weiß ich zwar nicht und die Teile "Hole das 
Ergbnis" und "Mach was mit dem Ergebnis" hast du noch nicht mal 
angefangen. Womit nur die Teile "Wandler initialisieren", "Starte den 
Wandler" und "Warte bis er fertig ist" übrig bleiben. Das sind im Grunde 
gerade mal 4 Zeilen Code. Und das auch nur, weil die Initialisierung 
sich über 2 Zeilen erstreckt.
Und ob deine Hex-Konstanten, die du da benutzt hast, richtig sind oder 
nicht, steht in deinen Unterlagen bzw. im Datenblatt des Prozessors. Die 
wird dir hier keiner zusammensuchen.

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.