hallo,
ich versuche gerade die aller ersten schritte in sachen programmieren.
also ich versuche gerade mit einem taster eine led zum leuchten zu
bringen. :-) die hardware besteht aus dem myavr lpt board. habe den
quelltext aus dem tutorial, die ports habe ich entsprechen meinen
geändert. nur klappt das net. das problem ist (glaube ich) das die
taster auf 0V gehen. ich habe anstatt dem taster mal das poti
angeschlossen, da funktioniert es wunderbar. es ist doch so das der
controller die spannung die am eingang anliegt auf den ausgang überträgt
oder? kann man das irgendwie umdrehen?
Wenn deine Taster active-low sind, also den (Eingangs-)Pin im gedrückten
Zustand auf Masse ziehen, musst du doch dem Controller nur beibringen,
dass er den Zustand vom Eingabepin einliest und dann umdreht.
Also:
Taster NICHT gedrückt, am Eingangspin liegt folglich Versorgungsspannung
an, also logisch 1. In PINA (falls Port A) steht jetzt an der
entsprechenden Stelle eine 1. Du willst aber eigentlich eine Null da
haben, denn der taster ist ja gerade nicht gedrückt.
Anderer Fall:
Taster ist gedrückt, Eingangspin liegt auf 0 Volt. Im PINA Register
steht jetzt einen 0. Du willst aber eine 1.
Lösung: Wert von PINA vor der Weiterverarbeitung invertieren.
In C sähe das so aus:
uint8_t keys;
keys = ~PINA;
Jetzt hast du in der Variable "keys" an der entsprechenden Stelle eine 1
stehen, wenn der dort angeschlossene Taster gedrückt ist und die
restlichen Stellen stehen auf 0.
Genau sowas wollt ich höhen. :-) dann brauch ich diesen befehl nur noch
in assembler. aber ich weiß schon mal das das relativ einfach
funktioniert. ich danke dir!
habs nun geändert. nun leuchtet die led dauerhaft..... also egal ob ich
den taster drücke oder nicht. ich denke mal das es daran liegt das an
dem pin wenn der taster offen ist auch 0v anliegen. kann das sein? hier
mal meine kleine datei:
.include "m8def.inc"
ldi r16, 0xff
out ddrc, r16
ldi r16, 0x00
out ddrb, r16
loop:
in r16, pinb
com r16 ;das hab ich zum invertieren hinzugefügt
out portc, r16
rjmp loop
Okay, dann brauch ich eher mal deine Schaltung.
Sollte so aussehen:
Versorgungsspannung (5V)
|
Widerstand (zwischen 1000 und 10.000 Ohm)
|
----Eingang von Controller
|
Taster
|
Masse
Ich nix Assembler, aber "com" klingt seltsam.
"not" würde sinnvoller klingen.
Du hast schon das Datenblatt vom Controller? Und du weisst auch, dass
man bei Atmel die komplette Befehlsreferenz von den Dingern runterladen
kann?
Die Suchfunktion im Forum ist auch gut und im Tutorial sind doch auch
Assembler Beispiele? Du kannst auch deinen C Compiler dazu bringen, dir
nicht direkt den fertigen Maschinencode sondern als Zwischenschritt
Assemlerbefehle auszuspucken.
com -> Einerkomplement (jedes Bit im Register wird invertiert)
not gibts nicht, wenn dann
neg -> Zweierkomplement-Bildung
com ist an der Stelle schon sinnvoller als was anderes.
ha, ha. ich habs hinbekommen!!!! wie doll man sich freuen kann wenn eine
kleine led auf tastendruck anfängt zu leuchten.
Hier meine änderung:
.include "m8def.inc"
ldi r16, 0xff
out ddrc, r16
ldi r16, 0x00
out ddrb, r16
ldi r16, 0b00000001 ;damit an portb 5V anliegt
out portb, r16
loop:
in r16, pinb
com r16 ;das hab ich zum invertieren hinzugefügt
out portc, r16
rjmp loop
und ich hab sogar nur den einen benötigten bit mit 5v belegt.
schön, solangsam kommt mir auch nicht mehr alles spanisch vor.
so, nun noch eine sache die ich nicht ganz verstehe. es funktioniert nur
wenn ich den tster an portB bit0 und die led an portc bit0 anschließe.
aber die befehle beziehen sich doch immer nur an den gesamten portb oder
portc. was mach ich den wenn ich das ganze an jeweils bit1 anschließen
möchte?
habs so versucht:
.include "m8def.inc"
ldi r16, 0xff
out ddrc, r16
ldi r16, 0x00
out ddrb, r16
ldi r16, 0b11111111 ;halt alle auf eins
out portb, r16
hat aber ned funktioniert. na ja, werd erst mal die tutorials
durcharbeiten. danke für die unterstützung.