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.
Und wenn du diese Hürde genommen hast, ist "Tastenentprellung" dein neues Aufgabengebiet ;)
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
tastenentprellung? ich glaub ich will noch gar nicht wissen was das ist ;-)
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?
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.