mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik problem mit ersten geh versuchen


Autor: josch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: ozo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ozo (Gast)
Datum:

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

Autor: josch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: josch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: josch (Gast)
Datum:

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

Autor: ozo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: josch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ozo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wunderbar!
Wie gesagt, ich nix Assembler...

Autor: josch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
    ldi r16, 0b00000001    ;HIER ändern
    ; z.b.
    ldi r16, 0b00000010
    ;oder besser lesbar:
    ldi r16, (1<<PB1)
    ; naechste Frage:
    ldi r16, (1<<PB0)|(1<<PB4)|(1<<7)
    out portb, r16

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

Autor: josch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.