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!
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.
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.
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.
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.
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.
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
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 :-)
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.
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;
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?
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.
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.
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?
> 1. A/D-Wandler initialisieren> - SFR 'ADCF' beschreiben> - SFR 'ADCON' beschreiben
Aus dem Code
1
voidmain(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
unsignedintmw_erf10(unsignedcharkanal)
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
unsignedintmw_erf10(unsignedcharkanal)
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
unsignedintmw_erf10(unsignedcharkanal)
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.
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)
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 :-)
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)
{
}
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)
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;
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
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..
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
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.