Kleines Wissen um den µC

Status
Für weitere Antworten geschlossen.

oldmax

Mitglied
Premium Benutzer
03. Nov. 2008
595
15
18
Landkreis Göttingen
Sprachen
  1. Assembler
Hi
Ich hab's euch angedroht, noch einmal eine kleine Information über µC's und ihr drumrum zu veröffentlichen.... Ich hoffe, ich langweile euch nicht. Damit auch dieses Wochenende gerettet ist :D

Seit einiger Zeit suche ich nach einer schnellen Datenerfassung per PC. Schließlich bin ich bei den µ-Controllern gelandet. Seitdem lese ich mich durch die einschlägigen Foren und stelle immer wieder fest, das µC zwar kein Thema, aber das Wissen um die Hardware dafür umso mehr ein ordentliches Manko aufweist. Nun ja, Controller programmieren ist eine Seite, Schaltung und elektrische Zusammenhänge eine andere. Da hat man tolle Ideen und dann scheitert es an der Umsetzung, weil das mit den Bits so gar nicht klar ist.
An der Stelle möchte ich ein wenig helfen, die Zusammenhänge besser zu verstehen.
Dies ist jetzt nicht so wahnsinnig umfangreich und eigentlich sind’s alte Kamellen, doch ich denke, es lohnt schon, einmal kurz drüber zu schauen, grad, wenn man in den Physikstunden doch etwas mehr mit den Mädels beschäftigt war….
Ich muß allerdings darauf hinweisen, das hier nicht hoch wissenschaftliche Dokumente abgeliefert werden, sondern ich hoffe ohne zu viel Ballast mit Grundlagen der Wirkungsweise ein Fundament zu legen. Nicht jede Frage kann hier schlüssig beantwortet sein, der Stoff soll nur helfen zu den vielen anderen Informationen Brücken zu bauen.
Fachleute werden hier und da vermutlich ein breites Grinsen nicht unterdrücken können, aber glaubt mir, nicht für euch, sondern für den Anfänger ist diese FAQ angelegt. Wobei, sind sachliche Fehler enthalten, hab ich absolut nix gegen Korrektur. Ich bin ja auch noch nicht sooo lange drin, auch wenn ich schon seit ein paar Jahren in großen Prozessanlagen rumprogge. (hoffentlich liest das nicht mein Chef...)
Na ja, Controller, PC und Steuerungen sind halt auch verschiedene Welten, auch wenn es gemeinsame Schnittstellen gibt.
Der Inhalt dieses Beitrages ist ein kleiner Ausschnitt einer etwas größeren Projektarbeit von mir und ich habe versucht, hier nur die für dieses Thema relevanten Abschnitte mundgerecht aufzubereiten. Ich möchte euch ja nicht mit zuviel trockenem Stoff quälen und das Controllern vermiesen. Im Gegenteil, vielleicht hilft’s ja wirklich und löst die hartnäckigen Blockaden, weil man etwas versucht, was so nicht geht, aber vielleicht anders.

Folgende Themen sollen zur Ansprache kommen
Stromkreise : Betrachtung verschiedener Signallagen – Tristate und Bus
Zahlensysteme -Dual – Oktal - Dezimal und Hexadezimal
Mathematik – Dezimal - Dual
Logische Verknüpfung – Und – Oder – Exklusiv Oder

IO-Ebene
Pegelwandler für Eingänge
Pegelwandler für Ausgänge

Warnhinweis Netzspannung
Fortsetzung folgt....
 
Stromkreise : Betrachtung verschiedener Signallagen

Der Wunsch, Experimente mit dem µC durchzuführen, setzt ein wenig Kenntnis der Elektrik voraus und so werde ich mit der „elektrischen Grundlage“ beginnen.
Und ohne Grundsatz geht auch da gar nix, also bitte merken:
1.Grundsatz: Der Strom fließt immer im Kreis, daher der Name „Stromkreis“.
Dies bedeutet: Wo ein Plus, da muss auch ein Minus her.

2. Grundsatz: Der Strom ist im Stromkreis überall gleich. Ein Strom wird im Stromkreis gemessen, eine Spannung an der Spannungsquelle oder am Verbraucher.

Schauen wir uns einfach mal einen Stromkreis an:
G steht für Generator, S für Schalter und V für Verbraucher. Diese Skizzen verdeutlichen, der Strom fließt nur durch den Verbraucher, wenn der Schalter geschlossen ist.
(Skizze 1 und Skizze 2)
3.Grundsatz: Die Höhe der Spannungsquelle ist immer die Maximalspannung in einer Schaltung. Es geht nicht, durch Verschaltung mehrerer Leitungen eine höhere Spannung zu erzeugen. Ausnahme : LC-Kreise im Wechselstrom, aber das lassen wir mal aus..

4.Grundsatz: Auch wenn es im Moment vielleicht nicht so klar ist, es gibt 3 elektrische Zustände: an Plus gebunden, an Minus gebunden und ! elektrisch neutral.
Bevor mich die Elektriker jetzt eine dumme Nuss nennen, ich habe absichtlich Begriffe wie Plus, Minus und neutral verwendet.
Die Bezeichnung aus Schaltungen wie VCC (Plus) und GND (Minus) sind auch nicht unbedingt besser. Trotzdem werde ich im Verlauf auf diese Begriffe umschwenken, da sie in vielen Schaltungen bereits Standart sind.

Auch wenn es in der Elektronik nicht immer ersichtlich ist, dieses Prinzip ist auch da gültig. Tauschen wir nun das Plus gegen VCC und das Minus gegen GND.
 

Anhänge

  • Stromkreis.JPG
    Stromkreis.JPG
    5,4 KB · Aufrufe: 1
  • Stromkreis messen.JPG
    Stromkreis messen.JPG
    8 KB · Aufrufe: 1
Nun ein wenig Praxis:elektrische Zustände

Nun ein wenig Praxis:
Wir nehmen einen Wechselschalter (Skizze 3 Schalter und Skizze 4 Stromkreis)

Es ist erkennbar, das die Leitung S (Signal) entweder
ein Plus- oder ein Minuspotential hat.
Bei dieser Schalung ist es egal, wie der Schalter steht,
es leuchtet immer eine Lampe, und so ist es, die Leitung S
führt entweder einen H(ight) oder L(ow) Potential.

Nun nehmen wir einen 3 stufigen Schalter(Skizze 5 Schalter und Skizze 6 Stromkreis)

Und schon ist’s Essig mit entweder oder....
es gibt einen Zustand, da ist nix auf der Leitung.

Und So sieht’s dann auch in der Praxis aus, es gibt
Einen Zustand, der ist nicht H(ight) oder L(ow). Der ist
„neutral“. Und diese 3 Schaltzustände nennt man
„tristate“, weil‘s englisch halt besser klingt.

Aber warum ist nun dieser „tristate“ so wichtig ? Nun, ich zeichne die Schaltung mal etwas anders:
Nun korrigieren wir etwas die Bezeichnungen, und schon haben wir ein Tristate-Element. Wie diese Skizze unschwer erkennen lässt, egal wie der Wechselschalter steht, ohne Druck auf CS (Chip Select) tut sich da gar nix.
(Skizze 7 Schaltkreis mit Select-Schalter)
 

Anhänge

  • wechsel.JPG
    wechsel.JPG
    5 KB · Aufrufe: 5
  • wechselschalter.JPG
    wechselschalter.JPG
    2,1 KB · Aufrufe: 2
  • Tristateplan.JPG
    Tristateplan.JPG
    5,2 KB · Aufrufe: 7
  • Tristateschalter.JPG
    Tristateschalter.JPG
    2,2 KB · Aufrufe: 6
  • Tristatesel.JPG
    Tristatesel.JPG
    6,6 KB · Aufrufe: 13
Wofür Tristate

Aber was macht das eigentlich für einen Sinn? Nicht unbedingt beim Einmaleins des kleinen Elektrikers, aber in der Computertechnik.
Ich zeig’s euch:
Sehen wir uns mal Skizze 8 an und denken, das ist eine Speicherzelle. Diese werden zu Gruppen zusammengeschaltet, (Skizze 9) 4 Zellen eine Gruppe.
Die Ausgänge der Speicherzellen schalten wir nun gruppenweise alle wie in Skizze 9 zusammen. Nun wollen wir einmal nur das Muster von Gruppe 1 oder das Muster von Gruppe 2 aufschalten. Dies geschieht mit CS0 oder CS 1.
Die Widerstände R0 -R3 sind sogenannte Pull-Up oder Pull-Down Widerstände. Sie verhindern, das ein nicht definiertes Potential auf den Busleitungen entsteht, und trotzdem die Ausgänge der Speicherzellen keinen Kurzschluss haben. Der Strom durch die Widerstände ist vernachlässigbar gering und belastet die Schaltung kaum. Egal. Wie viele Gruppen auf die Leitungen gelegt sind, es wird nur 1 Satz Widerstände benötigt.

Würde man auf die Widerstände verzichten und auch keine Tristate-Ausgänge haben, so würde ein Kurzschluss aufgrund unterschiedlicher Bitmuster die Zellen zerstören.

Es sind zwar nur zwei Nibble abgebildet, aber mit ein wenig Vorstellungskraft kann man sich bis zu ein paar Millionen solcher Schaltungen 8 Bit breit auf einem gemeinsamen Leitungsbus vorstellen, oder......

Aber wir wollen ja gar nicht Millionen Speicherzellen anschließen, lediglich mal 8 oder 16 Relais steuern und vielleicht ein paar Schalter abfragen und deshalb reicht so eine kleine Einführung auch schon fast aus, um mit der Bastelei zu beginnen.
Wir kennen die Bedeutung von H(ight) und L(ow) Signalen sowie den „dritten“ Signalzustand.
Wir sollten uns noch merken, das eine Anzahl von Leitungen mit gemeinsamer Bedeutung „Bus“ genannt wird.
z.B. Datenbus, Adressbus, Steuerbus um die wichtigsten beim Namen zu nennen. Und damit hat jede Leitung eine Wertigkeit aufgrund ihrer eigenen Position in der Rangordnung.
 

Anhänge

  • Tristateselblock.JPG
    Tristateselblock.JPG
    4,5 KB · Aufrufe: 12
  • Bus.JPG
    Bus.JPG
    29,8 KB · Aufrufe: 10
Ein kleiner Step zur Mathematik.

Machen wir einen kleinen Step zur Mathematik.

In der Schule wurden wir mit Ziffern von 0 bis 9 gequält und wir haben ein Zahlensystem verinnerlicht, das wir uns schwer tun, bei der Anwendung mit anderen Darstellungen. Dabei ist’s ganz einfach.
Nehmen wir einmal die Dezimalzahl 346 in Worten dreihundertsechsundvierzig.
Diese Zahl baut auf der Basis 10 und ist zerlegt in
6 * 10 ^0+ 4 * 10 ^1 +3 * 10 ^2.
Eigentlich müsste ich es andersherum schreiben, denn Zahlen werden entgegen einem Text von rechts nach links gelesen. Beachten wir diesen feinen Unterschied einmal nicht weiter, sondern merken wir uns, das wir immer mit der Basis ^0 beginnen. Bei jeder Basis und eine Regel der Mathematik sagt, das x hoch 0 immer 1 ist.
Also mal wieder ein Grundsatz:
2 ^ 0 = 8 ^ 0 = 10 ^ 0 = 16 ^ 0 = 1.
Nun haben wir eine Menge über Mathematik gelernt und zu der Basis 8 und der Basis 16 wird ich später kommen.
Zuerst betrachten wir mal eine Dualzahl, also eine mit der Basis 2. Auch hier ist die niederwertigste Stelle rechts und so wird auch eine Zahl bewertet, von Rechts. Interessant ist nun, das eine Duale Ziffer nur 2 Werte hat. 0 und 1. Das spiegelt sich natürlich in einer dualen Zahl wieder, da ist in keiner Stelle eine Ziffer 1
So ist die Dualzahl 1001101 von rechts nach links gelesen wie folgt zusammengesetzt:
1 *2^0 + 0 *2^1 + 1 *2^2 + 1 *2^3 + 0 *2^4 + 0 *2^5 + 1 *2^6 = 1+0+4+8+0+0+64 =77
Eine 1 und eine 0 lassen sich hervorragend mit einer Spannung abbilden, etwa wie Licht an und Licht aus. Setzt man dann mehrere Leitungen und Lampen parallel, so liefert das Lichtmuster verschiedene Informationen, genauer gesagt, 2^x ( x=Anzahl der Leitungen ) und da wir immer mit 0 beginnen, ist die höchste darstellbare Zahl 2^x-1.

Die Dualzahl kennt nur 2 Ziffern. Die „0“ und die „1“ analog zu den Spannungspotentialen der Leitung L(ow) und H(ight).
Gerechnet wird also mit der Basis 2 entsprechend der Potentialzustände L und H sowie dem Exponenten angegeben in der Nummer der Leitung. Und wir beginnen die Zählung der Leitungen mit „0“.
Also noch ein Grundsatz:
Wir fangen immer mit 0 an zu zählen !

Verallgemeinern wir es etwas: Basis (ist wie wir wissen 2) hoch Leitungsnummer mal Signalzustand.
Nehmen wir an: 4 Leitungen: Leitung 0=1, Leitung 1=0, Leitung 2 = 1 und Leitung 3 = 1 . Da in der Mathematik entgegen der Schrift gelesen wird, kommen wir auf eine binäre
So lautet die Rechnung: 2^ 0*1 + 2 ^ 1*0 + 2^ 2*1 + 2 ^ 3*1
Ist 1*1 + 2*0 + 4*1 + 8*1 =13
Wer Spaß an Mathe hat, der kann ja mal 8 Leitungen (ab jetzt Bit), 16 Bit oder gar 32 Bit berechnen.
So, jetzt wissen wir auch, wie die Zahlen in den Computer kommen. Und nicht nur Zahlen. Die unterschiedlichen Bitmuster sind für einen Controller Anweisungen, irgend einen Befehl auszuführen. Und diese Anweisungen finden wir in den Hex – Files wieder.
Na gut, nun haben wir gelernt, das es Duale Zahlen gibt, aber kann man damit auch rechnen ?
 
Duale Mathematik, so funktioniert’s

Duale Mathematik, so funktioniert’s
Betrachten wir zuerst mal eine bekannte Form der Addition:
8+7 = 5+ 1 Übertrag = 15.
So haben wir es alle mal gelernt. Eine Duale Ziffer kann aber nur 1 werden, danach erfolgt auch hier ein Übertrag.
So ist 0 +1 = 1 und 1+1 = 0 + 1 Übertrag, also 10
Addieren wir nun einmal 2 duale Zahlen
0 0 1 0 1 0 0 1 = 41
+ 1 1 0 0 1 1 0 1 +205
-------------------- --------
Übertrag 0 0 0 1 0 0 1 00
1 1 1 1 0 1 1 0 246

Nun ja, addieren ist ja einfach, aber wie sieht es mit der Subtraktion aus ? Ich erinnere mich da an einen Spruch meines Mathematiklehrers,
eine Subtraktion nix anderes ist, wie eine Addition negativer Zahlen
. Gut, im Dezimalsystem haben wir ein Minuszeichen 6 + (-4) = 2
Im Prinzip funktioniert das auch bei Dualzahlen, nur gibt es da ein kleines Problem. ‚-‚ ist kein elektrisch abbildbares Signal, das geht nur mit ‚1‘ oder ‚0‘, aber es gibt kein Minus. Daher hat man irgendwann festgelegt, eine negative Zahl wird mit dem obersten Bit verheiratet. Daher ist bei einer 8 Bit Dualzahl der Zahlenbereich von 127 bis – 128 definiert. Das oberste Bit ist 0, dann ist die Zahl positiv (2^7-1) . Nun wär es ja zu einfach, nur einer Zahl das oberste Bit zu setzen und dann behaupten, die Zahl sei jetzt eine negative Zahl, denn, die Behauptung, eine Subtraktion ist eine Addition einer negativen Zahl muß laut den Regeln der Mathematik auch für Dualzahlen gelten. Auf unser obiges Beispiel bezogen, hätten wir
41 +( -77) = --36
. Na ja, das oberste Bit ist gesetzt, also ist mein Ergebnis negativ, sehen wir uns mal den Rest der Zahl an und der ist lt. Dem Windowsrechner 118. Also ist etwas in unserer Rechnung falsch und vermutlich ist die Annahme mit dem obersten Bit falsch. Das Zauberwort an dieser Stelle ist das Zweierkomplement. Das Einerkomplement ist erst einmal nur das Drehen der Bitlage also aus 1 mach 0 und umgekehrt. Damit fangen wir auch an.
Um daraus ein Zweierkomplement zu machen, müssen wir nun 1 dazu addieren. Ich machs mal nicht ganz so kompliziert.
Unsere duale Gleichung soll 38 -17 sein, auf 1 Byte bezogen.
Also Dezimal ganz einfach, 38 -17 = 21
Nun Dual 00100110 - 00010001 = 00100110 + 11101111
Schreiben wir es einmal untereinander:
0 0 1 0 0 1 1 0 = 38
+ 1 1 1 0 1 1 1 1 +(-17)
-------------------- --------
Übertrag 1 1 0 1 1 1 0
0 0 0 1 0 1 0 1 21

Ihr dürft auch gern einmal Zahlen prüfen, die ein negatives Ergebnis liefern. Denkt aber daran, eine Negative Zahl ist eine Zweierkomplement, eine Dualzahl im Einerkomplement mit aufaddierter 1. Also, eine negative 1 addieren und daraus wieder das Einerkomplement bilden. Dann habt ihr die Absolutzahl und könnt das Ergebnis prüfen.

Kommen wir einmal zum Abschitt Reale Zahlen
Auch hier zuerst einmal einen Blick in die uns bekannte Dezimalwelt. Da sind Zahlen nie so schön gerade und ganz, da sind Kommas und viele Stellen dahinter. Je genauer wir werden wollen, umso mehr Stellen werden hinter dem Komma benötigt. Wie werden nun diese Zahlen aufgeschlüsselt? Angesprochen und wieder in Erinnerung gerufen: Dezimalzahlen sind Zahlen mit der Basis 10 und die erste Stelle ist Wert * 10 ^0. Wie sind aber die Zahlen unter dem Komma zu lesen ? Eigentlich ganz einfach: Vor dem Komma sind die Exponenten positiv, hinter dem Komma negativ, getreu dem Wissen aus der Grundschule vom Zahlenstrahl. Und jede Stelle in eine Richtung erhöht oder erniedrigt den Exponenten
2 5 2 3 , 3 4 5 2
2*10^3 5*10^2 2*10^1 3*10^0 3*10^-1 4*10^-2 5*10^-3 2*10^-4
2000 + 500 + 20 + 3 , 3*1/10 + 4*1/100+ 5*1/1000 + 2*1/10000

Mathematik ist eigentlich so simpel….. natürlich gilt das auch für Binär- oder Dualzahlen
1 1 0 1 , 1 0 0 1
1*2^3 1*2^2 0*2^1 1*2^0 1*2^-1 0*2^-2 0*2^-3 1*2^-4
8 + 4 + 0 + 1 , 1* 1/2 + 0*1/4 + 0*1/8 + 1*1/16

Daraus kann man schließen, das auch die Basis ^-x 1/Basis ^ x entspricht. Da aber auch ein Komma nicht als elektrische Einheit zu erfassen ist, muß man ein Zahlenformat festlegen, und da kommen wir schon wieder auf das wie….
Nun, für eine Realzahl ist ein Byte zu klein, hier habe ich mindestens ein Doppelwort, also 32 Bit wenn nicht sogar mehr. Darin ist untergebracht das Vorzeichenbit der Zahl, das Vorzeichenbit des Exponenten, die Zahl und der Exponent als Zahl. Nun stellen wir uns noch einmal eine Zahl wie die obige vor,
Müßte ich diese Zahl mit einem Exponenten angeben, könnte ich ja sagen, sie ist positiv, also kein Vorzeichenbit. Dann ist sie dezimal auch
, denn damit würde ich das Komma um 3 stellen verschieben. Also, mit der Angabe des Exponenten verschiebe ich lediglich die Kommastelle nach vorn oder nach hinten, auch ins negative und bekomme dann auch 0 vor dem Komma hin. Nun lege ich die Mantisse einfach fest, das ist die Zahl als solches, wie viele Stellen ich brauche und den Exponenten
Das Prinzip, um sich einmal die Struktur einer solchen Zahl vorzustellen:
Nehmen wir einmal eine 32 Bit Zahl. Oberstes Bit Vorzeichen der Mantisse. Komma wird nach dem zweithöchsten Bit festgelegt. Also ist meine Zahl 1, oder 0,
Nun folgen etliche Bits. Die letzten acht Bits nehmen wir für den Exponenten, oberstes davon wieder für das Vorzeichen, dann kann der Exponent immer noch zwischen +127 und – 128 bewertet werden.
Von 32 Bit bleiben bei diesem Beispiel für die reine Zahl 22 Bits übrig, dies entspräche einem Wert von 4194303. Auf diesem Wert kann ich nun das Komma mit dem Exponenten 127 Stellen nach hinten oder nach vorn setzen….
Und genau sind meine Zahlen im Bereich von 4194303 - 0, 4194303
Mittlerweile sind die Zahlen wesentlich genauer und die Ablage im Speicher entspricht auch nicht exakt diesem Beispiel, aber ich wollte nur mal verdeutlichen, wie im Prinzip mit gebrochenen Zahlen verfahren wird und wie die Analogie zum Dezimalsystem sich darstellt.
Auf diesem Prinzip beruht die Mathematik aller dualen Systeme. Wie auch in der Dezimalmathematik sind hiervon alle mathematischen Funktionen abgeleitet. Ich werde es hier nicht vertiefen, dafür gibt es ausreichend Lektüre und Informationen im Internet.
 
Was sind Hex-Files ?

Was sind Hex-Files ?
Nun, wir haben etwas über die Darstellung von Zahlen geredet und erwähnt, das es Zahlen mit der Basis 2, 4, 8, 10, 16 etc gibt. In der Computertechnik sind Zahlen mit der Basis 2,8 und 16 interessant, wobei die Basis 8 ( Oktalzahlen ) mittlerweile kaum noch eine Rolle spielt. Daher wird hier nur kurz darauf eingegangen:
Oktale Zahl, nur Ziffern von 0 bis 7
Beispiel: 4273 oktal = 3 * 8^0 + 7 * 8^1 + 2 * 8^2 + 4 * 8^3
= 3 * 1 + 7 * 8 + 2 * 64 + 4 * 512
=3 + 56 + 128 + 2048 = 2235
Nun bekommen wir es mit einer Zahl zu tun, deren Basis die 16 ist, das heißt, die Ziffern befinden sich im bereich von 0 bis 15. Nur wie stelle ich diese dar, denn 10 bis 15 sind 2 stellig. Hier bedienen wir uns einem kleinen Trick, indem wir das Alphabet zu Hilfe nehmen und die Ziffern 10 bis 15 einfach mit A bis F angeben.
So kann ich mit einer Alpha-Numerischen Ziffer Werte von 0 bis 15 darstellen. Und nun die Generalfrage : Warum?
Ist unser Dezimalsystem so schlecht ? Denken wir mal kurz zurück…. Ein Bit kann eine Ziffer von 0 und 1 aufnehmen. Anders gesagt für die Elektriker, ich hab keine Spannung und ich habe Spannung. Gut, das sind elektrische Zustände und wer schon mal was verdrahtet hat, weiß, das man Kontakte in Reihe oder Parallel schalten kann. So wurden früher die komplizierte Steuerungen realisiert, noch bevor man Und, Oder und was weiß ich noch für Gatter kannte.
Doch zurück zum Bit. Oben ist es bereits beschrieben, ein Bit ist nicht allein, es taucht fast immer in einer Gruppe auf. Vier sind ein Nibble, 8 ein Byte und 16 ein Wort, 32 ein Doppelwort.
Bleiben wir erst einmal beim Nibble. Damit lassen sich 16 verschiedene Zustände darstellen, also, um es mal im Klartext zu sagen, eine Hexadezimale Ziffer im Bereich von 0 - F. Zwei Nibble sind ein Byte und wie es der Teufel so will, ist ein Wort 4 Nibble. Ein Wort, 16 Bit = Adressbereich = aha.
Gehen wir noch einen kleinen Schritt tiefer: Die Codierung einiger Controller beinhaltet Befehl und Adresse in einem Wort. Dadurch brauchen sie für die meisten Befehle auch nur einen Takt, um einen Befehl auszuführen. So sind sie schnell, sauschnell, um es mal deutlich auszusagen.
Würde nun statt einem Hex-File ein Binärfile stehen, so wäre für jede Anweisung ein 16 Bit –Feld notwendig und wer kann das dann noch lesen ?
10010011 10011010 , 01110110 10111011 , 10111011 10011110
Das muß man sich 8000 mal ansehen, dabei wird man blind….Etwas einfacher ist dann schon diese Darstellung:
939A , 76BB , BB9E
Wie hab ich das gemacht ?
Es ist eigentlich einfach:
Zerlegen wir einmal die erste Bitreihe in Nibble 1001 0011 1001 1010
Dann setzen wir dezimale äh, hexadezimalen Werte
1* 2^3 +1*2^0 =9 , 1*2^1+1*2^0 =3 , 1* 2^3 +1*2^0 =9 und 1* 2^3 +1*2^10 =10

Also
Und genau das ist eine Hex-Datei, die in den µC geladen wird. Im Controller steht
1001 0011 1001 1010
und zu lesen bekommen wir
.
Nun ist aber immer noch nicht klar, was 939A eigentlich im Controller bewirkt. Wenn man nun eine Liste hätte, wo diese Bitfolge aufgedröselt ist in einen Befehl, dann könnte man ja sich die benötigten Befehle heraussuchen und diese Hex-Datei selbst beschreiben. Ja, hab ich schon gemacht….
Aber dafür gibt’s Programmiersprachen, die eine für uns verständliche Befehlsfolge in einen Maschinencode umsetzt. Angefangen von Assembler über C zu BASCOM, und da PC's auf dem gleichen Prinzip arbeiten natürlich auch andere Hochsprachen.
 
Kommen wir nun zu den logischen Verknüpfungen.
Dazu schauen wir einmal auf die beigelegten Skizzen:

Sie zeigen den prinzipiellen Aufbau von logischen Verknüpfungen. In Schaltungen sind die Schaltsymbole aber anders dargestellt und wer sich schon mal mit TTL Logikbausteinen beschäftigt hat, kennt auch die Blockdarstellung.
Zu den logischen Verknüpfungen gehören die Wahrheitstabellen.
Sie geben an, bei welcher Beschaltung der Ausgang aktiv ist.
Die Und-Verknüpfung
! Eing. 1 ! Eing. 2 ! Ausgang !
! 0 ! 0 ! 0 !
! 1 ! 0 ! 0 !
! 0 ! 1 ! 0 !
! 1 ! 1 ! 1 !

Die Oder-Verknüpfung
! Eing.1 ! Eing.2 ! Ausgang !
! 0 ! 0 ! 0 !
! 1 ! 0 ! 1 !
! 0 ! 1 ! 1 !
! 1 ! 1 ! 1 !

Wenn wir in Controllern logische Verknüpfungen anwenden, müssen wir immer daran denken, das die Verknüpfung immer auf das gesamte Byte wirkt. Dies bedeutet, will ich nur ein Bit erfassen und folgende Anweisung ausführen, ist das Ergebnis immer nur auf dieses eine Bit bezogen, alle anderen sind auf 0.
Beispiel:
LDI Reg_1, 0b11010010
LDI Reg_2, 0b00000010
AND Reg_1, Reg_2
Ergebnis in Reg_1
0b00000010
Normalerweise ist in Reg_1 irgendein Wert und nur die Maske wird direkt geladen.
Eine weitere wichtige logische Verknüpfung ist die Exclusiv Oder Verknüpfung.
Hier die Wahrheitstabelle dazu:

! Eing. 1 ! Eing. 2 ! Ausgang !
! 0 ! 0 ! 0 !
! 1 ! 0 ! 1 !
! 0 ! 1 ! 1 !
! 1 ! 1 ! 0 !

Daraus erkennt man, das bei einer EOR, das ist der Assemblerbefehl, nur ein Bit gesetzt sein darf, also ein Unterschied zwischen Eingang 1 und 2 sein muss, um eine 1 zu erhalten. Sind beide gleich, ist der Ausgang 0.

Auch hier ein praktisches Beispiel, eine Blinkfunktion. Ich möchte in einem bestimmten Takt ein Bit toggeln, also einen ständigen Wechsl von 0 und 1 haben. Dazu rufen wir aus einer Zeitgebenden Anwendung ,z.B. Timer-ISR ein Unterprogramm auf:
Bit_Toggle:
LDS Reg_1, WechselByte
LDI Reg_2, 0b00000001
EOR Reg_1,Reg_2
STS WechselByte, Reg_1
RET

Bei jedem Durchlauf wird nun eine Exclusiv-Oder Verknüpfung zwischen Reg_1 und Reg_2 über das gesamte Byte durchgeführt. Die Bits 1- 7 werden nicht verändert und behalten ihren Status. Das Bit 0 allerdings wechselt seinen Zustand entweder von 0 nach 1 oder umgekehrt.

In einem µC werden sehr oft Verknüpfungen durchgeführt und das Ergebnis für Sprünge herangezogen. So wird bei diesen boolschen Operationen ein Statusbit gesetzt, wenn zum Beispiel das Ergebnis 0 ist.

Doch Thema ist nicht: Programmieren, sondern das drumrum und daher wende ich mich jetzt nach soviel Theorie um Bits und Bytes der Beschaltung zu.
 

Anhänge

  • Schalter.JPG
    Schalter.JPG
    3,7 KB · Aufrufe: 0
  • Schalterund.JPG
    Schalterund.JPG
    5,2 KB · Aufrufe: 0
  • Schalteroder.JPG
    Schalteroder.JPG
    5,3 KB · Aufrufe: 0
  • und.JPG
    und.JPG
    2,7 KB · Aufrufe: 0
  • oder.JPG
    oder.JPG
    2,8 KB · Aufrufe: 0
Die IO-Ebene

Die IO-Ebene

So, das war ja nun eine Menge Theorie, und vielleicht fragt sich der ein oder andere, toll, aber wie bastel ich nun die Elemente auf eine Platine und wie löte ich die Verbindungen zusammen.
Also, auch ich ätz nicht gleich ein paar Leiterbahnen aus einem Kupferblech. Für sowas, wo man noch gar nicht so richtig weiß, ob das überhaupt das ist, was man will und ob’s so funzt, übe ich erst einmal auf einem Steckbrett.
Wenn’s dann so wie vorgesehen funktioniert, kann man sich überlegen, ob eine Lochrasterplatine reicht oder ob’s etwas „professionelles“ werden soll mit geätzter Platine und so …
Beginnen wir erst mal mit der Beschaltung von Eingängen. Wenn wir unseren Controller ansehen, hat er jede Menge Anschlüsse und damit ich weiß, wo kann ich überhaupt etwas anschließen, brauch ich den Belegungsplan. Der ist im Datenblatt enthalten. Dort steht auch noch anderes Wichtiges, daher ist ein Download (fast) immer erforderlich. (Skizze Belegungsplan Atmega8)

Wenn wir nun den Belegungsplan vorliegen haben, sehen wir, das es keine direkten Eingänge und Ausgänge gibt. Das ist praktisch, denn dadurch, das ich im Programm bestimmen kann was Ausgang und was Eingang ist, bin ich mit dem Layout und den Anschlüssen doch ziemlich flexibel.

Es macht keinen Sinn, komplexe Beschaltung eines Controllers zu besprechen, sondern die Betrachtung eines Einganges unter verschiedenen Voraussetzungen. Deshalb liefere ich hier nur die Skizzen von ein paar Grundschaltungen.

Die angegebenen 12 V können auch andere Gleichspannung bedeuten, es ist nur darauf zu achten, das der Pull-Up Widerstand nicht zu klein gewählt wird. Es genügt aber als
Faustregel 100 KOhm für alle Spannungsbereiche < 60 V
Bei dem Optokoppler sieht es etwas anders aus. Dort muß der Reihenwiderstand von der LED der Eingangsspannung angepasst werden. Der Strom durch die LED darf nicht die zulässige Höhe überschreiten. Die Eingangsbeschaltung nach dem Fototransistor (hier als LDR dargestellt ) bleibt jedoch gleich.
Wie berechnet man nun den Vorwiderstand einer LED ? Das ist im Prinzip relativ einfach, da nur wichtig ist, den zulässigen Strom nicht zu überschreiten. So kann man erst mal grundsätzlich das Ohmsche Gesetz anwenden.
Hier die Formel : R = U / I
Angenommen, U=12 V und I= 0,01 A dann berechnet sich für den Widerstand ein Wert von 1,2 KOhm. Dieser Wert stimmt nicht ganz, denn an der Diode fällt auch etwas Spannung ab, die in diese Formel einfließen sollte, wenn denn ein Strom von exakt 10 mA gefordert ist. Dies ist in den seltesten Fällen notwendig und beim Experimentieren schon gar nicht. Wenn bei 5 V z.B. 500 Ohm errechnet wird, ist es kein Problem, den nächst höheren Widerstandswert einzusetzen. Auch eine Stufe kleiner 490 Ohm sollte kein Problem sein, die LED wird kaum merklich heller.

Zu beachten ist weiterhin, das der Widerstand nach VCC entfallen kann, da durch Zuschalten der internen Pull-Up-Widerstände diese Beschaltung erreicht wird.
 

Anhänge

  • Atmega8plan.JPG
    Atmega8plan.JPG
    14,4 KB · Aufrufe: 6
  • Eing5v.JPG
    Eing5v.JPG
    6,1 KB · Aufrufe: 3
  • Eing12v.JPG
    Eing12v.JPG
    7,5 KB · Aufrufe: 6
  • LDREing5v.JPG
    LDREing5v.JPG
    8,4 KB · Aufrufe: 6
  • LDREing12v.JPG
    LDREing12v.JPG
    8,5 KB · Aufrufe: 4
Prellen von Schaltkontakten und Signaldauer

Prellen von Schaltkontakten und Signaldauer
Schaltkontakte, gleich welcher Art, haben die Eigenschaft zu prellen. Dies bedeutet, ein Schalter ist nicht sofort geschaltet, sondern wechselt anfangs in schneller Folge zwischen „auf“ und „zu“, und es dauert einige Zeit, bis sich das Signal entsprechend stabilisiert hat. Dies muß über entsprechende Maßnahmen ausgeblendet werden. So ist es möglich, durch eine Parallelschaltung eines Kondensators eine Hardware-Entprellung vorzunehmen. Der Programmierer zieht allerdings die Software-Entprellung vor, d. H. er wartet ein kleines Weilchen, bevor er das Signal für gültig erklärt. Software- Beispiele gibt es im Internet genug, so das ich hier nicht weiter darauf eingehe.
Oft liest man, das Eingänge per Interrupt eingelesen werden sollen. Nun, dies ist bei Schaltern in den seltesten Fällen sinnvoll.
Der Grund liegt in der Verweildauer. Wer kann schon im Millisekundenbereich einen Kontakt betätigen ? Es ist also völlig überflüssig, die IO-Interrupts zu nehmen. Wenn man sich nicht ganz sicher ist, kann in der Timer –ISR die IO’s einlesen, aber in der Regel genügt das Pollen. Das bedeutet, die Eingänge werden einmal in jedem Zyklus eingelesen. Anders sind Eingänge zu bewerten, die einen kurzen Impuls liefern. Inkrementalgeber z.B. deren Impulse durchaus so kurz sein können, das ein Timer-Interrupt oder zyklisches Abfragen der Eingänge den ein- oder anderen Impuls „verpasst“. Darauf bauende Berechnungen würden falsch liegen und Fehler können sich einschleichen.
Im Prinzip merkt man sich als Faustformel:
Mechanische Kontakte einlesen über Zyklus oder Timer Interrupt sowie Maßnahmen zum Entprellen.
Schnelle kurze Signale (Impulse) einlesen über IO-ISR
Signale mit Pulsdauer > 10 ms < 100 einlesen über Timer-ISR,
Signale ab ca. 50 ms Pulsdauer (abhängig vom Programmumfang ) zyklisches abfragen

Eine Funktion der IO-Interrupts will ich nicht verschweigen. Man kann einen Controller „schlafen“ legen. In diesem Zustand benötigt er minimale Energie. Wird nun ein Interrupt durch ein externes Signal ausgelöst, beginnt er mit seiner Arbeit.
 
Ein paar Worte noch zu den Ausgängen.

Ein paar Worte noch zu den Ausgängen.
Oft möchte man nicht nur eine LED an oder ausschalten, sondern auch mal andere Geräte mit mehr Leistung steuern. Da ist es nicht damit getan, einfach an einen Ausgang vom Controller ein Relais anzuschließen, denn beim Betreiben von Induktivitäten in elektronischen Schaltungen muss einiges beachtet werden. Da ist die Relaisspannung und der Strom. Ein Controller kann nicht unbegrenzt Strom an den Ausgängen liefern und obwohl ein 5 V Relais eingesetzt, ist es möglich, das man eher den Port zerstört, als das Relais schaltet. Es wird, um den Controller nicht zu belasten ein Treiber benötigt, ein Baustein oder eine Baugruppe, die mit einem minimalen Ansteuerstrom ein Relais zum Schalten bringt. Am Besten noch mit einer beliebigen Betriebsspannung, da 12/ 24 V Relais wesentlich preiswerter und in größerer Auswahl verfügbar.
Zur Erinnerung
1. Grundsatz: Der Strom fließt immer im Kreis, daher der Name „Stromkreis“.
Dies bedeutet: Wo ein Plus, da muß auch ein Minus her.
Bitte merken.

Ich will euch nicht schon wieder mit viel Theorie zuquatschen, aber schaut euch mal folgende die Skizze mit dem Transistor an:
Gut, nix besonderes, aber sie funktioniert. Die Stromkreise mit dem 5 V Controller-Pegel und der 12 V Lastspannung sind verbunden mit einer gemeinsamen Masse. Der Transistor kann leitend werden, wenn in seinem Emitter ein Strom fließt und das Relais zum Anziehen bringen. Oder so ähnlich. Auch hier sind bestimmt nicht alle meiner Meinung, aber so komplizierte Dinge wie Arbeitspunkt und Emitter- Basisstrom und was so ein Transistor sonst noch so alles hat, ich laß es hier weg. Wer will, der kann da gern ein paar Zeilen zu schreiben. Mir geht’s nur darum: Das Relais muß anziehen, wenn ein High-Pegel anliegt und bei Low -Pegel V abfallen oder evtl. umgekehrt. Wichtig ist, mein Relais reagiert auf meine Ausgabe per Programm auf die Signale am Port ohne den Controller zu belasten.

Erinnern wir uns mal kurz an die Physikstunde mit dem Thema Elektromagnetismus.
Da wurde uns erklärt, das ein Draht in einem Magnetfeld bewegt, eine Spannung induziert bekommt. Und je schneller bewegt, um so größer die Spannung und da noch nicht genug von, auch die Anzahl der Leiter im Magnetfeld beeinflussten die Höhe der Spannung.
Da ein Relais eine Spule hat, in der ein Magnetfeld erzeugt wird, wird auch vom Relais eine Spannung erzeugt, wenn der Magnet sich abschaltet. Klar, abschalten, Magnetfeld bricht zusammen, also Änderung. Und das ganz schnell…. Und dann ganz viele Windungen .. das ist nicht zu ignorieren. Die so erzeugte Spannung kann ein vielfaches von dem haben, was die Elektronik dieser Schaltung ab kann. (Kein Mensch käme auf die Idee, diese Schaltung an 50, 80 oder gar 120 V zu hängen....)
Tja, die arme Diode, sie ist nun dazu da, diese Spannung kurzzuschließen und unwirksam zu machen. Gut, sie kann es ab, da es gar nicht erst zu einer hohen Spannung kommen kann. Der Spulenwiderstand begrenzt obendrein auch noch den Strom und der Rest der Schaltung erfreut sich eines ungestörten Elektroniklebens....

Treiber
Natürlich haben sich die Experten der Halbleiterindustrie auch da etwas einfallen lassen
Der ULN 2803 beherbergt 8 Schaltkreise, die mit den Controllerausgängen beschaltet werden können und im Ausgang Relais bis 30V schalten können. Freilaufdioden sind schon drin.
Nun noch Klemmen für die Relaiskontakte und ab geht er der Peter......

Ach ja.. und hier einen ganz wichtigen Hinweis:
Netzspannung schalten bedeutet mit gefährlichen Spannungen zu arbeiten. Hier ist unbedingt Fachwissen angesagt. Es ist nämlich gar nicht spaßig, wenn ein Familienmitglied oder gar man selbst diese berührt und einen elektrischen Schlag bekommt.
Er kann tödlich sein!
Das ist bitte ernst zu nehmen. Schaltet eure Eisenbahn, oder einen kleinen Roboter oder alles, was über eine Batterie versorgt werden kann, aber bitte nicht Netzspannung ohne das nötige Fachwissen.
Zu Batterien ist auch noch etwas zu sagen.
Hütet euch vor Autoakkus. Nicht die Spannung ist gefährlich, sondern die Energie, die gespeichert ist und im Kurzschlussfall unbegrenzt freigesetzt wird. Da löst sich schon mal ein Schraubenzieher mit einer 8mm Klinge in Metalldampf auf….
Wer da noch die Finger im Weg hat, wird auch ewtas länger davon zu erzählen haben.
Also, im Umgang mit Elektrizität immer daran denken, da ist Energie drin .
 

Anhänge

  • Transistor.JPG
    Transistor.JPG
    6,4 KB · Aufrufe: 5
  • ULN2803.JPG
    ULN2803.JPG
    11,9 KB · Aufrufe: 7
-- Abschluß ---

Dies möchte ich euch nicht vorenthalten

Wen es interessiert, hier mal ein paar Keinstplatinchen, die als Module gefertigt, schnell in beliebige Schaltungen eingesetzt werden können.
Man muß nicht unbedingt eine Platine ätzen, dieser kleine Aufbau geht auch problemlos auf Lochrasterplatinen. Die Lötseite ist schnell dargestellt, einfach das Bild spiegeln. Von diesen Platinchen kann ich mir ein paar anfertigen, sie entsprechend verbinden und so für jeden Bedarf eine Baugruppe schnell zusammenschustern. Die IO habe ich nicht dargestellt, lediglich für den Atmega8 und eine serielle Baugruppe liegen Skizzen bei. Ich denke aber, wer das Prinzip versteht, findet bestimmt die nötige Info zu weiteren Modulen.
Und nun viel Spaß und Erfolg.

PS: grad bei der Kontrolle noch entdekt:Es macht Sinn, den RESET-Pin (1) gleich mit einem kleinen Kondensator nach GND und einem Widerstand ca. 10 KOhm nach VCC zu versehen. Dann ist auch ein Einschalt-Reset gewährleistet.

Gruß oldmax
 

Anhänge

  • AtmegaLayOut.JPG
    AtmegaLayOut.JPG
    41,1 KB · Aufrufe: 11
  • Max232LayOut.JPG
    Max232LayOut.JPG
    20,5 KB · Aufrufe: 11
Status
Für weitere Antworten geschlossen.

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)