Hallo, ich bin Anfangerin im Mikrocontrollerbereich,Ich habe die Tutorien gelesen und damit viel gelernt, jetzt wollte ich dass 5 Tasten ein Pin(1 LED)anspricht,und es läuft nicht.Kann mir jemand dabei helfen? Danke
wenn du dein Programm einstellst sicher. Sonst wird es eine Rätselstunde, darauf hat hier keiner Lust.
.include "m8def.inc" ldi r16, 0xFF out DDRB, r16 ;Port B durch Ausgabe von 0xFF ins ;Richtungsregister DDRB als Ausgang konfigurieren ldi r16, 0x00 out DDRD, r16 ;Port D durch Ausgabe von 0x00 ins ;Richtungsregister DDRD als Eingang konfigurieren ldi r16, 0xFF out PORTB, r16 ;PORTB auf 0xFF setzen -> alle LEDs aus loop: in r16,PIND cbi PORTB,3 rjmp loop ende: rjmp ende ;Endlosschleife
OK Und was erwartest Du von diesem Code? Was macht er stattdessen. Hinweis: Ich sehe nirgends dass du irgendwas mit dem von PortD gelesenen Werten machst. Alles was Dein Code macht ist: von PortD die Werte einlesen an PortB das Bit 3 loeschen mehr passiert da nicht. Sollte nicht irgendwie der neue Zustand von PortB in irgendeiner Form vom Zustand auf PortD abhaengen?
.include "m8def.inc" ldi r16, 0xFF out DDRB, r16 ;Port B durch Ausgabe von 0xFF ins ;Richtungsregister DDRB als Ausgang konfigurieren ldi r16, 0x00 out DDRD, r16 ;Port D durch Ausgabe von 0x00 ins ;Richtungsregister DDRD als Eingang konfigurieren ldi r16, 0xFF out PORTB, r16 ;PORTB auf 0xFF setzen -> alle LEDs aus loop: in r16,PIND sbic PIND, 0 rjump loop sbic PIND, 1 rjump loop sbic PIND, 2 rjump loop sbic PIND, 3 rjump loop sbic PIND, 4 rjump loop in r16, 0x04 OUT PORTB, r16 rjmp loop ende: rjmp ende ;Endlosschleife das sollte so zumindest klappen, wenn ich dich richtig verstanden habe. wenn eine der tasten gedrueckt wird soll eine led leuchten??
@Jens Dein Code macht aber was anderes :-) Dein Code macht: Wenn alle 5 tasten gedrueckt werden wird PortB auf das gesetzt was am Port 0x04 grade anliegt. Keine Ahnung was Port 0x04 ist.
.include "m8def.inc" ldi r16, 0xFF out DDRB, r16 ;Port B durch Ausgabe von 0xFF ins ;Richtungsregister DDRB als Ausgang konfigurieren ldi r16, 0x00 out DDRD, r16 ;Port D durch Ausgabe von 0x00 ins ;Richtungsregister DDRD als Eingang konfigurieren ldi r16, 0xFF out PORTB, r16 ;PORTB auf 0xFF setzen -> alle LEDs aus loop: in r16,PIND sbic PIND, 0 sbi PORTB, 0 sbic PIND, 1 sbi PORTB, 1 sbic PIND, 2 sbi PORTB, 2 sbic PIND, 3 sbi PORTB, 3 sbic PIND, 4 sbi PORTB, 4 rjmp loop ende: rjmp ende ;Endlosschleife
Karl.. das ist eine sache der definition ueber die taster ;) ob man auf 1 oder 0 zieht =) Mary ok: .include "m8def.inc" ldi r16, 0xFF out DDRB, r16 ;Port B durch Ausgabe von 0xFF ins ;Richtungsregister DDRB als Ausgang konfigurieren ldi r16, 0x00 out DDRD, r16 ;Port D durch Ausgabe von 0x00 ins ;Richtungsregister DDRD als Eingang konfigurieren ldi r16, 0xFF out PORTB, r16 ;PORTB auf 0xFF setzen -> alle LEDs aus loop: in r16,PIND AND R16, 0x1F ;Taste 1 - 5 reagiert, wenn alle ;reagieren sollen Zeile entfernen OUT PORTB, r16 rjmp loop ende: rjmp ende ;Endlosschleife Dann eben so ;)
ein Fehler ist noch drin !! der PortB muss noch gelöscht werden zuerst ! also: loop: out PORTB,0 und dann weiter mit in r16,PIND sbic PIND, 0 sbi PORTB, 0
@HD_ ... wozu in r16,PIND??? und warum so umstaendlich?? man koennte auch noch definieren, wenn zwei tasten gedrueckt sind alle LEDs an ;) Ach was is ASM schoen einfach, wenn es ums Bit schubsen geht ;) Gruss
@HD_ ... Arbeitest du bei Microsoft?? :D Naja so erklärt sich, warum man immer die neuesten und groessten Computer braucht ;)
@HD_ Welchen Sinn soll es haben, an einem Port der sowieso schon auf 0xFF steht, mittels sbi dasselbe Bit nochmal auf 1 zu stellen? Jungs: probiert doch eure Programme aus, bevor ihr sie postet. Damit ist Mary nicht geholfen. Entweder wir versuchen sie dahin zu bringen, dass sie selbst durch Nachdenken ihr Program selbst schreibt, oder wir posten eine fertige Loesung. Dann muss sie aber korrekt sein. @Mary OK. Du moechtest also haben, dass PortB, Pin3 auf 0 geht (denn dann brennt die LED), wenn am PortD irgendein Bit auf 0 gebracht wurde (0 bedeutet ja: Taster gedrueckt). Kann man das so sagen? (Um mal deine etwas 'schwammige' Formulierung zu praezisieren). Hmm. Mal sehen. Wenn kein Bit am PortD auf 0 stehen darf, bedeutet das doch, das dieser Port den Wert 0xFF haben muss. D.h. Wenn du einfach testest ob dort 0xFF vorliegt Wenn ja: PortB, Pin3 auf 1 (Led aus) Wenn nein: PortB, Pin3 auf 0 (Led ein) Zum testen: Du holst dir den Wert in ein Register und vergleichst dann das Register mit 0xFF Kriegst Du das mit diesen Hinweisen hin?
@Jens Mary hat ganz am Anfang gesagt, dass sie das Tutorial durch macht. Ich wette mit Dir um ein Bier, dass ihre Taster gegen GND schalten.
@Jens: Danke für den Tip, schreibe mal schnell ne Bewerbung für Microsoft Stimmt schon umständlicher gehts wirklich kaum noch
Hallo , danke für eure Antworten,leider hat es nicht geklappt.kann jemand mir ein Vorschlag posten?
Bist Du sicher, daß Dein Mega arbeitet? Mach mal nach der Init folgendes Programmi: Loop: clr r16 ;Temporäres Register löschen sbis PinD, 0 ;hier den Taster dranne, der nach Masse geht ldi r16, 1 ;wenn Taster gedrückt, Temp.Reg auf 1 setzen out PortB, r16 ;auf LED-Port ausgeben rjmp Loop ;alles auf Anfang Wenn Du jetzt an PortD, Bit 0 den Taster drückst, müßte an PortB, Bit 0 die LED an bzw. aus gehen. Wenn Du den Taster wieder losläßt, ändert die LED wieder ihren Leuchtzstand. Wenn das Proggi geht, arbeitet zumindest Dein Prozessor und Du kannst Dich größeren Aufgaben widmen. Für den Anfang ist es gut, nach jeder neu geschriebenen Code-Zeile das Programm erneut in den Prozessor zu laden und auszuprobieren. Dann merkt man schnell, wenn man Mist gemacht hat ;-)
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.