Nabend, ich sitze hier und komme nicht weiter. Benutze derzeit den 2313 Also Portb wird ja so als Ausgang defeniert: ldi r16, 0xFF out ddrb, r16 und Portd als Eingang ldi r16, 0x00 out ddrb, r16 Nun möchte ich aber das PB0 eingang ist und PB1,PB2 und PB3 ausgänge sind. Irgendwie bekomme ich das nit hin. So weiter, wie kann ich jetzt nur PB0 einlesen ??? und weiter verarbeiten. Danke schon mal. Markus
ldi r16,0xfe ---> alles Ausgänge, nur PB0 ist Eingang out ddrb, r16 ----> alle anderen Pins analog dazu steht aber alles im Datenblatt
Hallo Markus, für PIN0: Also Portb0 wird ja so als Ausgang defeniert: ldi r16, 0x01 out ddrb, r16 und Portb0 als Eingang DDRB = DDRB & ~0x1; (komplement) Also Portb1 wird ja so als Ausgang defeniert: ldi r16, 0x02 out ddrb, r16 und Portb1 als Eingang DDRB = DDRB & ~0x2; Also Portb2 wird ja so als Ausgang defeniert: ldi r16, 0x04 out ddrb, r16 und Portb2 als Eingang DDRB= DDRB & ~0x4; Also Portb3 wird ja so als Ausgang defeniert: ldi r16, 0x08 out ddrb, r16 und Portb3 als Eingang DDRB = DDRB & ~0x8 Also Portb4 wird ja so als Ausgang defeniert: ldi r16, 0x10 out ddrb, r16 und Portb4 als Eingang DDRB = DDRB & ~0x10 Also Portb5 wird ja so als Ausgang defeniert: ldi r16, 0x20 out ddrb, r16 und Portb5 als Eingang DDRB = DDRB & ~0x20 Also Portb6 wird ja so als Ausgang defeniert: ldi r16, 0x40 out ddrb, r16 und Portb6 als Eingang DDRB =DDRB & ~0x40 Also Portb7 wird ja so als Ausgang defeniert: ldi r16, 0x80 out ddrb, r16 und Portb7 als Eingang DDRB = DDRB & ~0x80 Sorry, aber die Komplementbidung unter Assembler ist mir C-Progger nicht geläufig. Ich weiß aber, dass Assembler dafür eine Abürzung kennt - nur deren Syntax weiß ich nicht. Gruß Marcus
oder mit Bild: 0000 0000 = 0x00 ===> alles Eingänge 1111 0000 = 0xf0 ===> pins 7-4 Ausgänge, pins 3-0 Eingänge oder weils so schön ist: 1010 1010 = 0xaa ===> Ausgang, Eingang, Ausgang, Eingang, Ausgang, Eingang, Ausgang, Eingang den Rest kennst du schon
Machen wir das ganze mal Binär, damit es vielleicht etwas anschaulicher ist! Wir befassen uns mal nur mit deinem Portb... Du möchtest gerne: PB0=Eingang PB1=Ausgang PB2=Ausgang PB3=Ausgang also musst du in das Datenrichtungsregister B (DDRB) folgenden Wert Schreiben: 0b11111110 oder 0xFE Daraus folgt der Code: ldi r16, 0b11111110 out ddrb, r16 So nun hast du deine Ein und Ausgänge konfiguriert... Da du wahrscheinlich jetzt nur den PB0 weiter verarbeiten möchtest, kannst du ersteinmal den ganzen pinb einlesen in r16,pinb ;den Zustand von den Eingängen einlesen andi r16, 1<<pb0 ;du läßt nur pb0 auf 1 stehen, der rest wird 0 Nehmen wir an pinb = 0b00101001 Da uns ja nur der Eingang pb0 interessiert erstellen wir eine Maske. In unserem Fall 0b00000001 und verknüpfen diese mit einem logischen UND (andi). In unserem Beispiel würden wir also folgendes Ergebnis erhalten: Beide Binärzahlen werden mit einem logischen UND verknüpft: 0b00101001 (haben wir aus unserem pinb Register gelesen) 0b00000001 (haben wir als Maske definiert) --------------- 0b00000001 (erhalten wir durch die UND (andi) Verknüpfung So nun kannst du z.B. so weiter arbeiten: sbrc r16,pb0 ;Ist pb0 gesetz(wenn nicht, dann überspringe den nächsten Befehl) etc. Diesen Code stammt von Hannes und ist teil einer Blinkersteuerung! Danke! Habe versucht ihn für deine Bedürfnisse "umzustricken"... Hoffe ich habs richtig gemacht... Vielleicht sieht Hannes das und gibt noch etwas Feedback... Kannst ja mal unter folgendem Link schauen, hilft vielleicht weiter! Ist vieles detailiert diskutiert.... http://www.mikrocontroller.net/forum/read-1-113815.html Gruß, Stephan!
@ stephan guten morgen. werde es heute mal ausprobieren und mir mal rein zeihen. Danke schon mal. Markus
so im Simulator läuft das Programm aber aufm Board nicht. Beschreibung: wenn Taster 1 (pb0) an dann led 1,3 an und nach 1 sek led 1 aus wird der taster losgelassen dass led 2 an (warten) und wieder zum anfang wenn taster gedrückt bleibt, warten bis er losgelassen wird. ********************************************************** .include "2313def.inc" ldi r16, 0b11111110 out ddrb, r16 loop: in r16, pinb andi r16, 1<<pb0 sbrc r16,pb0 rjmp gesetzt rjmp loop gesetzt: ldi r16, 0b00000101 out portb, r16 ; ============================= ; Warteschleifen-Generator ; 4000000 Zyklen: ; ----------------------------- ; warte 3999996 Zyklen: ldi R17, $24 WGLOOP0: ldi R18, $BC WGLOOP1: ldi R19, $C4 WGLOOP2: dec R19 brne WGLOOP2 dec R18 brne WGLOOP1 dec R17 brne WGLOOP0 ; ----------------------------- ; warte 3 Zyklen: ldi R17, $01 WGLOOP3: dec R17 brne WGLOOP3 ; ----------------------------- ; warte 1 Zyklus: nop ; ============================= weiter: ldi r16, 0b00000100 out portb, r16 in r16, pinb andi r16, 1<<pb0 sbrc r16, pb0 rjmp weiter rjmp weiter1 weiter1: ldi r16, 0b00000001 out portb, r16 ; ============================= ; Warteschleifen-Generator ; 4000000 Zyklen: ; ----------------------------- ; warte 3999996 Zyklen: ldi R17, $24 WGLOOP10: ldi R18, $BC WGLOOP11: ldi R19, $C4 WGLOOP12: dec R19 brne WGLOOP12 dec R18 brne WGLOOP11 dec R17 brne WGLOOP10 ; ----------------------------- ; warte 3 Zyklen: ldi R17, $01 WGLOOP13: dec R17 brne WGLOOP13 ; ----------------------------- ; warte 1 Zyklus: nop ; ============================= ldi r16, 0b00000000 out portb, r16 rjmp loop ******************************************************** wo ligt da jetzt der fehler ?
Hm, irgendwie verstehe ich die Beschreibung nicht ganz. Wäre nett, wenn du das ganze nochmal beschreiben würdest... Bis zu welchem Punkt läuft es denn auf deinem Board? bzw. was hast du für ein Board? Gruß, Stephan
Also Board STK 500 Taster = pb0 Led 1 = pb1 Led 2 = Pb2 Led 3 = pb3 Taster nicht gedrückt = Alle LED aus Taster gedrückt = Led 1 und 3 an nach wartezeit geht Led 1 aus wird taster gehalten dann nix ändern wird Taster losgelassen = Led 2 an und Led 3 aus, nach zeit geht led 2 aus und dann wieder alles von vorne.
Ok, das Problem ist klar! in r16, pinb ;Du ließt das Pinb register ein andi r16, 1<<pb0 ;lässt nur den Taster (Eingang) stehen sbrc r16,pb0 ;du Fragst ab, ob dein pb0 = 0 rjmp gesetzt ;hier landest du, wenn es log. 1 ist rjmp loop ;hier landest du, wenn es log. 0 ist Deine Taster sind bei dem STK500 wie die LEDs "invertiert" (STK User Guide Teil 3.2) Gruß, Stephan
Danke, habe jetzt noch die Out werte Invertiert und die rjmp getauscht und es geht. suppi, und wieder was dazu gelernt.
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.