Hallo,
ich möchte am Port B3 und B4 (ATTINY13 gelegene Tasten abfragen und am
selben Port B0, B1, B2 an Leds ausgeben.Mit dem kleinen Programm komme
ich nicht weiter.
Ich kann zwar "Pullup- Spannung" messen, aber die "Auswertung" klappt
nicht.
Wo mache ich etwas falsch?
Vieln Dank Minimaxus
Erst mal poste deinen Quelltext nicht als Datei mit der Endung txt.
Nimm die Endung, die dein Programmtext auch wirklich hat. Das Forum
erkennt diese und aktiviert dann dafür das Syntax-Highlighting.
Zweitens darfst du so kleine Text-Fuzzelchen gerne auch direkt
einbetten. Die richtigen Tags benutzen (welche es gibt, steht direkt
über der Eingabebox des Forums unter "Formatierung") und auch dann gibts
ein Syntax-Highlighting.
1
Start:
2
ldi r16,&B00111 'PB4, PB3 als Eingang; PB2, PB1, PB0 als Ausgang festgelegt
3
Out Ddrb , R16
4
5
ldi r16,&B11000 'Pullup für PB3 und PB4 einschalten
6
Out Portb , R16
7
8
9
10
Loop:
11
in r16,Pinb 'Taste an PB4 und PB3
12
Out Portb , R16 'Ausgabe
13
rjmp loop 'Schleife
So, und jetzt schaun wir uns mal an, was du da geschrieben hast :-)
Ja, schon.
Aber was erwartest du dir davon?
die Bits von den Bitstellen 3 bzw. 4 wandern ja nicht irgendwie magisch
an die Bitpositionen 0 und 1, so dass du sie dann an der Ausgabe siehts.
Da ist weit und breit von einer 'Auswertung' nichts zu sehen!
Schieb mal das, was du vom Pin Register bekommst um 3 Stellen nach
rechts, denk drann, dass du für die Ausgabe auf das PortRegister die
Bitpositionen 3 und 4 auf 1 belassen musst (damit die Pullup auch
weiterhin aktiv bleiben) und erst dann gibst du am Port aus.
1
vom Pin Register +---+---+---+---+---+---+---+---+
2
| . | . | . | x | y | . | . | . |
3
+---+---+---+---+---+---+---+---+
4
5
Verschieben o o
6
| |
7
| +-----------+
8
+-----------+ |
9
| |
10
v v
11
12
+---+---+---+---+---+---+---+---+
13
| . | . | . | . | . | . | x | y |
14
+---+---+---+---+---+---+---+---+
15
16
+---+---+---+---+---+---+---+---+
17
die 1 Bits für | . | . | . | 1 | 1 | . | x | y |
18
die Pullups noch +---+---+---+---+---+---+---+---+
19
ergänzen
20
21
||
22
||
23
\ /
24
vv
25
26
am Port ausgeben
oder benutze, wie die meisten, die für Bitoperationen vorgesehenen
Befehle zum Bit-setzen, Bit-löschen, Bit-abfragen
AVR-Tutorial
Das funktioniert deshalb, weil dort die Taster am Port D hängen und die
LED am Port B UND weil die Taster an genau denselben Bitnummern der
jeweiligen Ports hängen. D.h. am Bit 0 vom Port D hängt ein Taster und
am korrespondieren Bit 0 vom Port B hängt die zugehörige LED.
Deshalb kann man das von PIND gelesene an PORTB ausgeben und so den
Zustand des Tasters an die LED spiegeln.
Aber den Fall hast du nicht. Du hast ganz andere
Hardware-Voraussetzungen. Insbesondere hast die diese
Bit-'Übereinstimmung' an 2 verschiedenen Ports nicht.
Hallo Karl Heinz Buchegger,
ich habe mir über diesen Code so meine Gedanken gemacht.
Gehen wir mal davon aus, ich hätte nur einen Tiny13...es muß doch
einen Weg geben das mit den kleinen zu realisieren.
Die beiden Tasten hängen an PB3 + PB4, 2 LEDs an PB0 + PB1
Die Pegel an PB3/PB4 einlesen.
Jetzt mit einem Trick nach PB1/PB0 verschieben.
Zum Schluss ausgeben.
Das interessiert mich mal. Werde meine Hardware mit den Tiny13
aktivieren.
Grüße
Rolf
Hallo Spess,
danke für Deine Nachricht!
Werde das mal durcharbeiten..swap ist mir ja ganz was Neues.
(aah, hier steht "vertausche die beiden Hälften des Zielreg. also r16)
Bin die Zeit nicht untätig gewesen.
Beschäftige mich mit den erweiterten Betriebsarten von Timer1
Es ist ja ein Wahnsinn was sich mit den WGM13 bis 10 alles anstellen
läßt.
Werde den Code für Interessierte einsetzen.
Grüße
Rolf
Rolf H. schrieb:> Und ich dachte, Peter Dannegger wäre garnicht so auf Assembler>> zu sprechen!! C ist seine Stärke
Irrtum, er kann so verdammt gut C, weil er Assembler virtuos beherrscht.
...
nun sitze ich seit früh 6 Uhr und hier das Ergebnis!
so richtig haut es noch nicht hin, glaube das liegt an den
links verschieben. Ich müßte doch nach rechts verschieben.
Denn PB4+PB3 sollen an PB1+PB0 ausgegeben werden.
Rolf H. schrieb:> lsl akku ; ein Bit nach links (warum links)??> swap akku ; Nibble tauschen
Damit die Bits nach dem Nibbeltausch an der Stelle sitzen wo du sie
brauchst.
Mal dir das auf einen Zettel und arbeite das Programm mit dem Bleistift
ab. Dann wird das klar.
Also 1110_0111 sieht nach swap so aus:
-----0111_1110 ->doof
daher, lsl, einmal nach links und das Carry rechts rein .
---> 1100_1110.... Dann nach
Swap-1110_1100
------------^^ um diese Nullen geht es, sie sitzen jetzt an der
richtigen Stelle und lassen nach "Out" die beiden LED in vollem Glanze
erstrahlen.
Wenn dich die rechts rein geschobene Null stört, setzte das Carrybit mit
"sec" vor dem lsl.
mh....die beiden Tasten reagieren schon einzeln richtig
nur die Leds nicht!
Ich müßte doch 3x lsr verwenden, um PB4+PB3 ganz nach rechts zu schieben
oder???
garnicht so einfach wie ich dachte....morgen geht es weiter
könnte es ja auch mal debuggen, dann sieht man es vielleicht besser.
Schönes Wetter bei Hamburg..muß ich ausnützen mit den Hubis!
Grüße
Rolf
Rolf H. schrieb:> mh....die beiden Tasten reagieren schon einzeln richtig> nur die Leds nicht!
Dein Code dreht sich an allen Ecken und Enden den gerade vorher an PB0
bzw PB1 eingestellten Zustand wieder um.
Entweder du betrachtest das ganze als Byteoperation, so dass beide Bits
in einem Aufwasch behandelt werden. Oder du betrachtest es als
Bitoperation, in denen du dich um jedes Bit einzeln persönlich kümmerst.
Aber nicht einmal so und einmal so. Denn das geht mit Sicherheit schief,
weil du dir mit den Byteoperationen alles wieder zerstörst, was du
vorher mit den Bitoperationen eingestellt hast.
> Ich müßte doch 3x lsr verwenden, um PB4+PB3 ganz nach rechts zu schieben> oder???
kannst du auch machen.
Aber lsl + swap ist halt um 1 Befehl kürzer :-)
Rolf H. schrieb:> könnte es ja auch mal debuggen, dann sieht man es vielleicht besser.
Nicht nur vielleicht.
Im AVR-Studio den Simulator anzuwerfen, tut doch nicht weh.
es hat mir keine Ruhe gelassen!
Dabei spielte auch das "ORI" verrückt.
Wurde verwendet für Pull Up
Dabei sagt es: Verknüpfe RD mit der 8 Bit-Konstanten mit logisch ODER!!
Wie gesagt, es läuft erst mal umständlich, werde mir die andere
Variante mit "swap" nochmal vorknöpfen.
veränderst du durch den OUT alle 8(!) Bits des PORTB. Es ist daher
völlig sinnlos in deinem Programm zwischen LED01 und LED02 zu
unterscheiden. Denn dein Programmabschnitt LED02 verändert eben nicht
NUR den Zustand von LED02 sondern auch den von LED01!
Und hier
1
loop: ; Vorschlag von Spess
2
cbi PORTB,PB0
3
cbi PORTB,PB1
4
5
warte:
6
....
7
8
rjmp loop
erfolgt dann ein Rücksprung zu loop, der dann erst recht wieder PB0 und
PB1 verändert.
Dein Programm ist zu kompliziert! Du verlierst dich in der selbst
geschaffenen Komplexität und überblickst nicht mehr, wer welchen Pin
wann und warum verändert.
mit dem sbic sowieso festgestellt hast, dass der Pin mit dem Taster 1
auf 1 ist, dann brauchst du doch den ganzen Verschiebeklimbim gar nicht
mehr. Du WEISST doch, dass der Pin auf 1 ist, also muss auch der
zugehörige LED-Pin auf 1 geschaltet werden (und vice versa, wenn der Pin
auf 0 ist). Dazu musst du nichts schieben, das Wissen darüber wie der
Ausgangspin zu sein hat, liegt ja schon vor!
damit wir uns richtig verstehen!
die LEDs sollen nur solange leuchten, wie ich die Taste drücke.
Und das tun sie jetzt sauber ohne zu flackern.
Das ORI verhinderte ein sauberes leuchten.
Ein Dreher ist noch drin, d.h.
drücke sw1 leuchtet LEDgn (PB1)
drücke sw2 Leuchtet LEDrt (PB0)
Ich wollte es aber umgekehrt.
Durch Korrektur in den beiden rcalls war es behoben.
Grüße
Rolf
>> mit dem sbic sowieso festgestellt hast, dass der Pin mit dem Taster 1> auf 1 ist, dann brauchst du doch den ganzen Verschiebeklimbim gar nicht> mehr. Du WEISST doch, dass der Pin auf 1 ist, also muss auch der> zugehörige LED-Pin auf 1 geschaltet werden (und vice versa, wenn der Pin> auf 0 ist). Dazu musst du nichts schieben, das Wissen darüber wie der> Ausgangspin zu sein hat, liegt ja schon vor!
hast Recht....wieder was dazu gelernt!
Danke nochmal an alle die mir geholfen haben.
Aha.
Wieder jemand der sich eine Aufgabenstellung wählt
> ich möchte am Port B3 und B4 (ATTINY13 gelegene Tasten abfragen> und am selben Port B0, B1, B2 an Leds ausgeben
dann etwas programmiert und hinterher die Aufgabenstellung an das
vorhandene Programm anpasst.
Na, dann drück mal beide Tasten gleichzeitig.
Mist.
Hast natürlich recht.
Rolf ist ja erst am 23. eingestiegen.
> ich habe mir über diesen Code so meine Gedanken> gemacht.> Gehen wir mal davon aus, ich hätte nur einen Tiny13...es> muß doch einen Weg geben das mit den kleinen zu realisieren.> Die beiden Tasten hängen an PB3 + PB4, 2 LEDs an PB0 + PB1> Die Pegel an PB3/PB4 einlesen.> Jetzt mit einem Trick nach PB1/PB0 verschieben.> Zum Schluss ausgeben.
Aber egal.
Wenn diese Selbsthaltung und gegenseitige Auslösung gewollt ist, dann
ist es ok.
minimaxus schrieb:> Hallo,>> ich möchte am Port B3 und B4 (ATTINY13 gelegene Tasten abfragen und am> selben Port B0, B1, B2 an Leds ausgeben.Mit dem kleinen Programm komme> ich nicht weiter.> Ich kann zwar "Pullup- Spannung" messen, aber die "Auswertung" klappt> nicht.> Wo mache ich etwas falsch?> Vieln Dank Minimaxus
Sorry, zum Schluss möchte ich nochmal zu meinen Mist Stellung nehmen:
Ich sehe innerlich ein, dass ich Mist gebaut habe.
Lese ich die Frage von minimaxus nochmals durch, so muss ich
feststellen,
dass darauf ja gar nicht gezielt eingegangen wurde.
Es ging ihm nicht darum, mit welchen Chip seine Aufgabe zu realisieren
wäre (hier mit den Mega8) sondern mit den Tiny13.
Das ich es gewagt habe, seine Idee in ein Mist umzuwandeln, bereue ich
und werde so was nicht wieder tun..das verspreche ich den Moderator.
Ich kenne nun seit einigen Jahre Spess und Hannes Lux..beide sind
immer sachlich geblieben.
Oldmax verzeihe ich das, er gab vor Jahren selbst zu, dass er manchmal
etwas hart im Ton ist.
Aber für ein Moderator ist es nicht die feine Art, es einfach als "Mist"
abzutun.
Ihr könnt doch nicht erwarten, dass ich mit meinen 78 Jahren so
vollkommen bin wie Ihr. (da bekommen Andere schon Essen auf Rädern)
Dazu habe ich noch viel zu viel andere Hobbys, als mich nur mit Bit
und Byte zu beschäftigen.
Nichts für Ungut, aber das musste mal raus.
So schnell gebe ich nicht auf, d.h. die ganze loop-Routine
werde ich nach Karl Heinz Anregungen umkrempeln.
Ich hoffe, ich darf in diesem Forum nochmal ne Frage stellen.
Grüsse
Rolf
Setz deine Brille auf, lies noch mal die letzten paar Postings und stell
den Sinnzusammenhang her.
Mit 'Mist' hab ich mein Verhalten gemeint.
Ich hab mich vertan, indem ich dich mit dem TO verwechselt habe.
Denn genau das ist auch das Problem. Um Details nachzuschlagen, die ein
Frager von sich gegeben hat, scroll ich zumindest ganz nach oben und
lies noch mal nach, was im Eröffnungsposting steht. Das ist meine
allererste Quelle von problemspezifischen Informationen.
Wenn du daher einen Thread kaperst, dann läufst du immer Gefahr, dass du
(oder das Problem) verwechselt wird. Daher ist sowas meistens eine
schlechte Idee. Mach deinen eigenen Thread auf, erzähle im
Eröffnungsposting alles was wichtig ist, mach von mir aus einen Verweis
auf den anderen Thread rein. Dann passiert sowas nicht.
Aber: Das soll jetzt keine Entschuldigung für mich sein, warum ich
Personen bzw. Postings verwechselt habe. Das war einfach nur Mist, das
hätte mir auffallen müssen.
Und nein. Wenn ich Blödsinn mache, bin ich (meistens) Manns genug das
auch zuzugeben.
Hi
Na ja, mit 78 Jahren kann man schon ein wenig wirr reagieren. Ich nehm's
gelassen und wenn ich mal 78 bin, wer weiß....
Aber eines muss ich noch loswerden, ich glaub einfach nicht alles, was
hier steht und bei Altersangaben, hmm, da bin ich besonders skeptisch.
Also, ein schönes WE
Gruß vom "harten" oldmax
aber Martin Vogel...warum zweifelst Du das an!
hab den Ps. Ausweis hier vor mir liegen und siehe da
"Geburtsdatum der 06.01.1935" Erinnere ich mich an 1969 - 1971
zurück, da habe ich in Hamburg eine Umschulung zum Elektroniker
gemacht. Die Berufsbezeichnungen wie heute gab es dazumal noch nicht.
Meine Arbeit begann danach in der Nobelfirma "Hauni" in HH.
Die Fa. stellte uns Lernpackete (Hard und Software) sowie einen
Dozenten frei zur Verfügung. Das lernen begann mit einem Chip von
Intersiel und die nackte Maschienensprache.
Die Worte des Dozenten werde ich nie vergessen. Er war der Meinung:
ihr müsst von der Materie nachts träumen...auf der Autobahn schon
programmieren...es darf euch nicht mehr loslassen.
Wenn er zu spät kam, wussten wir er hat die Abfahrt wegen HIGH und LOW
verpasst. Die Materie hat mich eigentlich nie losgelassen!
Betrachte ich jetzt mein Code, so muss ich schon feststellen, dass
ich mich ziemlich blöd mit lsl und swap angestellt habe.
Auch die ganze Schieberei ist vom Tisch.
Eine Frage bleibt noch offen, aber ich wage sie nicht zu stellen,
zumal es ja nicht mein Thread ist.
Grüße
Rolf
Hi Rolf
Ok, Rolf, auch ich kenne Ingenieure, die bis ins hohe Alter mit neuer
Materie keine Probleme hatten und wenn du dich mit Controllern
beschäftigst, ist es doch ok. Hier geht es doch nicht darum, jemanden
persönlich anzugreifen. Es ist oft die Art und Weise der Textform, warum
wir die Augen verdrehen. Und das Gegenüber ist leider nicht real,
sondern halt irgendwo an einer Tastatur.
Zurück zum Thema:
Warum machst du nicht einen eigenen Thread auf. Ist dich ganz einfach:
Neuer Beitrag anklicken Thema benennen und dann frag drauflos.
Gruß oldmax
Karl Heinz schrieb:> Na, dann drück mal beide Tasten gleichzeitig.
Beide Tasten gleichzeitig drücken wird schwierig.
Auftreten kann, dass sie gleichzeitig gedrückt sind - und dass kann für
die Programmlogik ein riesen Unterschied sein. ;-)