A/D-Wanlung, Potis, Programmeinbindung

OP #2867325
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!
#2867376
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.
#2867402
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.
#2867446
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.
OP #2867464
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;
#2867485
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.
OP #2867492
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.
#2867496
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.
Gast #2867526
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 :-)
#2867581
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)
OP #2867598
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;
OP #2867815
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..
#2868768
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.

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