Forum: Mikrocontroller und Digitale Elektronik problem mit ersten geh versuchen


von josch (Gast)


Lesenswert?

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?

von ozo (Gast)


Lesenswert?

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.

von ozo (Gast)


Lesenswert?

Und wenn du diese Hürde genommen hast, ist "Tastenentprellung" dein 
neues Aufgabengebiet ;)

von josch (Gast)


Lesenswert?

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!

von josch (Gast)


Lesenswert?

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

von josch (Gast)


Lesenswert?

tastenentprellung? ich glaub ich will noch gar nicht wissen was das ist 
;-)

von ozo (Gast)


Lesenswert?

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.

von Johannes M. (johnny-m)


Lesenswert?

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.

von josch (Gast)


Lesenswert?

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.

von ozo (Gast)


Lesenswert?

Wunderbar!
Wie gesagt, ich nix Assembler...

von josch (Gast)


Lesenswert?

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?

von Jörg X. (Gast)


Lesenswert?

1
    ldi r16, 0b00000001    ;HIER ändern
2
    ; z.b.
3
    ldi r16, 0b00000010
4
    ;oder besser lesbar:
5
    ldi r16, (1<<PB1)
6
    ; naechste Frage:
7
    ldi r16, (1<<PB0)|(1<<PB4)|(1<<7)
8
    out portb, r16

hth. Jörg
ps. lies das Tutorial weiter...

von josch (Gast)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.