hast du dich schon mal mit dem thema "entprellen" beschäftigt?
Hallo,
sry, dass ich nochmal nerve, aber ich probier schon die ganze Zeit, sone Art "Lichtschalter" hinzubekommen.
Vorneweg erstmal: Ich hab das myAvr-Board 1.4
Hab einen Taster mit PortD.2 und einen Taster mit PortD.3 verbunden. Dann hab ich noch eine LED mit PortB.2 verbunden. Wenn ich den Taster1 (PortD.2) drücke, soll die LED ausgehen und wenn ich Taster2 (PortD.3) drücke, soll die LED angehen. Ich bekomms einfach net, vlt. könnt ihr mir weiterhelfen, das ganze möcht ich gern mit Assembler realisieren.
Hier mein Code:
Ich denk mal, Geübte steigen durch den Code durch.Code:.include "m8def.inc" .def temp = r16 ldi temp, LOW(RAMEND) ;LOW-Byte der obersten RAM-Adresse out SPL, temp ldi temp, HIGH(RAMEND) ;HIGH-Byte der obersten RAM-Adresse out SPH, temp ldi temp, 0b00000000 out DDRD, temp ;PortD als Eingang ldi temp, 0b11111111 out DDRB, temp ;PortB als Ausgang out PortD, temp ;Pullups von PortD aktivieren main: sbic PIND, 2 ;Liegt an D.2 low an? Wenn nicht, dann nächsten Befehl überspringen sbi PortB, 2 ;Wenn ja, dann B.2 auf high setzen sbic PIND, 3 ;Liegt an D.3 low an? Wenn nicht, dann nächsten Befehl überspringen cbi PortB, 2 ;Wenn ja, dann B.2 auf low setzen rjmp main ;Endlosschleife
Das was er jetzt macht: Am Anfang leuchtet die LED ganz schwach (soll aber ganz aus sein). Wenn ich auf einen Taster drücke, geht sie aus (wenn ich ihn aber wieder loslasse, ist sie wieder schwach an) und wenn ich auf den anderen Taster drücke, leuchtet sie stark (geht dann aber auch wieder auf schwach, wenn ich den Taster loslasse )
Gruß
Thomas
hast du dich schon mal mit dem thema "entprellen" beschäftigt?
Nee, noch nie gehört
[edit]
Ahh, du meinst, das der Taster nicht gleich zum stehen kommt, sondern noch ein wenig "hüpft", wie ein Ball, den man fallen lässt?
Hmm..aber was das genau mit meinem Problem zu tun hat, versteh ich leider noch nicht so ganz.
ja genau das meine ich... auf den ersten blick müsste das gehen was du da geschrieben hast... kann es aber im moment nicht überprüfen
Naja, das was ich ja am meisten nicht verstehe ist, warum am Anfang die LED schwach leuchtet?
SBIC bedeutet, den nächsten Befehl über springen falls der entsprechende Pin auf 0 ist, d.h. dein Schalter gedrückt ist.
Wenn du keinen Schalter drückst, wird die LED abwechselnd schnell an un d ausgeschaltet : LED leuchtet schwach.
Du solltest es anstatt mit SBIC mal mit SBIS versuchen, dann sollte es klappen.
Gruss Klaus
Ahh, so gehts, danke
Ich mach mir auch grad Gedanken, wie ich das ganze auf nur einen Schalter mache, also drücken, dann LED an, nochmal drücken, LED aus. Am besten wäre es, wenn ich mir ne Variable anlege und dort speicher, ob LED an oder aus ist, aber wie ich Variablen anlege, weiß ich leider nicht.
Aber ich denk, da gibt es auch nen einfacheren Weg, oder?
So wie:
So wäre dann wohl der Pseudecode.Code:if Taste gedrückt if PortB.2 = 1 dann PortB.2 = 0
Bitte noch keinen Code posten, brauch nur nen Denkanstoß
Hallo, als Variablen in Assembler nehme ich einfach einen freien Register darin kannst Du die bits mit sbr und cbr setzen oder löschen.
Mit sbrs springst Du wenn bit gesetzt alternativ sbrc wenn gelöscht.
Achtung sbr bzw. cbr erwarten ein k255 als wert, also setzen mit z.B sbr test,(1<<sperre)
und sbrs , sbrc erwarten nur ein b7 also sbrs test,sperre
Gruß Sebastian
Mit nur einem Schalter bekommst du Probleme wegen des Schalterprellens. Dieses Problem kann softwaremässig nur mit einem Timer gelöst werden, der innerhalb einer vorgegebenen Zeit (ca. 0,5 Sekunden) nach dem Drücken des Schalters eine weitere Abfrage des Schalters verhindert. Da ich eigentlich nicht in Assembler programmiere, kann ich dir hierfür auch keine Hilfe bieten. In C hatte ich das Problem aber schon mal so gelöst.
Gruss Klaus
Axo, hab mich hier im Forum auch schonmal schlau gemacht wegen dem Prellen. Ist ziemlich kompliziert zu lösen mitm Timer. Najo, muss ich mal schaun, trotzdem Danke an euch.
Lesezeichen