PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ausgänge des Controllers negieren?



x8r
28.05.2006, 14:48
Hi,
ich mache grade für Informatik ein Referat über Microcontroller.
Um meinen Mitschülern das ganze etwas näher zu bringen, habe ich ne kleine Platiene mit nem Mega8 und 8 LEDs an Portb gemacht.
Dazu nen kleines Prog das nen Lauflicht macht.
Hier verwende ich z.B portb = &B01111110
um die erste und die letzte LED leuchten zu lassen.(hab die LEDs gegen + gelegt).
Dies ist für jemanden der vor 5minuten das erste mal von Microcontrollern gehört hat etwas schwerverständlich, warum da ne 0 ist um die LED anzumachen.
Ich habe mal von einem Befehl gehört der einfach in den Programmkopf kommt und alle Ausgänge negiert.
Wie heißt dieser befehl?
Schonmal danke für eure Antworten!
MfG
Jan

RHS
28.05.2006, 15:10
Hallo Jan,

ich glaube nicht, dass das so einfach (per Befehl) geht ...

Du hättest die LED's gegen GND legen sollen. Aber das ist
Dir sicherlich auch klar.

darwin.nuernberg
28.05.2006, 15:17
Warum legst Du die LED's nicht gegen Masse?
Für eine normale LED reicht der Portstrom aus.


Hier die Umkehrung:

$regfile = "m8def.dat"
$crystal = 8000000
$baud = 9600 ' Serrielle Schnittstelle definieren

Config Portb = Output
Config Portc = Output


Dim X As Byte
Dim Y As Byte
Dim Z As Byte

Do
For X = 0 To 7
Y = 2 ^ X ' Y = 1 aus 8 - Lauflicht
Z = Not Y ' <- Invertiert Y

Portb = Y
Portc = Z
Waitms 200
Next X
Loop

x8r
28.05.2006, 15:44
Hi,
keine Ahnung warum ich die LEDs immer gegen + mache, hat sich wohl so eingebürgert... ;-)
An die bolean negierung hab ich auch schon gedacht, aber das wird ja noch komplizierter...
Ich bin mir aber sehr sicher, dass es dafür einen Befehl gibt... werd nochmal die ganze Hilfe von Bascom durchgehn (hab ich schonmal gemacht...).
Wäre für weiter Tipps dankbar!
MfG
Jan

Hanni
28.05.2006, 19:43
In Assembler würde z.B. ein com mit der Angabe eines Registers ausreichen ...

E-Fan
28.05.2006, 22:13
Das geht noch einfacher!
Schließ die LED's "ganz normal" von Vcc über den üblichen Vorwiederstand gegen an den Controller an. (die meisten Ports können mehr Strom gegen Masse "sinken" als das sie ihn "sourcen" können. (find die Begriffe na ja - komisch ;) )
Das Programm kann folgende Zeilen enthalten:

Config Portb = Output
Dim A as Byte
A= &b11111110

Do
Portb = A
Rotate A, Left, 1
Waitms 200
Loop

End

"Rotate" schiebt sämtliche Bits von A in dieser Konfiguration um jeweils eine Position nach links. Das MSB wird bei jedem rotieren zum LSB.

x8r
29.05.2006, 13:18
Hi,
danke für die Antworten!
Mir ist schon klar, dass ich das Problem wesentlich eleganter lösen könnte. Es geht mir aber dadrum, das totale Basic noobs das Programm verstehen...
Ich werde es auf eine wirklich billige Methode machen, die viel speicher braucht aber leicht verständlich ist:

...
do
a = getadc(1) * 2
portb = &B11111110
waitms a
portb = &B11111101
waitms a
portb = &B11111011
waitms a
portb = &B11110111
waitms a
portb = &B11101111
waitms a
portb = &B11011111
waitms a
portb = &B10111111
waitms a
portb = &B01111111
waitms a
loop

Mir stellen sich zwar dabei die Nackenhaare auf, aber ich denke, dass es ut verständlich ist.
Dazu kommt dann noch nen Interrupt, der mit dem man über einen Taster den Modus auswählen kann(andere Form des Lauflichts...).
Ich weiß, das ganze ist verdammt billig und speicherfressend, aber meine Mitschüler haben grad erst die Programmiersprache(wenn man sie so nennen will) ""Logo"" gelernt.
MfG
Jan

sebastian.heyn
30.05.2006, 08:39
du kannst zb

portausgabe=&B10000001
portausgabe=255-portausgabe 'negieren
portx=portausgabe

E-Fan
30.05.2006, 10:20
@x8r:
Du hast bis auf die Übernahme des Wertes aus dem AD-Wandler genau das gemacht was ich oben in meinen Codeschnippsel reingetippt hab.
Egal ob jemand mit NULL-Basic-Ahnung oder nicht - so lange man etwas Englisch beherrscht sind die Basic-Befehle eigentlich selbsterklärend. Zur Not könntest Du auch die einzelnen Erklärungen aus der Hilfedatei nehmen und Deinen Studis unter die Nase halten. ;)

dennisstrehl
30.05.2006, 12:48
[...] die meisten Ports können mehr Strom gegen Masse "sinken" als das sie ihn "sourcen" können. [...]

Das stimmt nicht, zumindest nicht bei neueren AVRs.
Alle neueren Controller haben symmetrische Ausgänge, d.h. der Strom den sie sourcen können ist genauso hoch wie der Strom den sie sinken können.

E-Fan
30.05.2006, 21:54
Ich sollt' wohl doch mal wieder nen Blick in die Datenblätter werfen... ;)