Light to frequency

Hi,

Ich habe gerade ein einfaches Schieberegister implementiert, für einen Taster. Dabei kam ich ein wenig ins grübeln.

Im Prinzip sind es ja 5 Zustände, die man auseinander halten will:

1. undefinierter Zustand (Prellen)
2. Taste gedrückt (0xff), unabhängig vom vorherigen Zustand
3. Taste nicht gedrückt (0x00), unabhängig vom vorherigen Zustand
4. Taste erstmalig gedrückt, letzter definierter Zustand war: 'nicht gedrückt'
5. Taste gerade losgelassen, letzter definierter Zustand war: 'gedrückt'
...
Gibt es da schon Lösungen, die sich bewährt haben? Was habt Ihr dazu für Gedanken?
Das Schieberegister ist lediglich fürs entprellen da.
Für die Erkennung von "wurde gedrückt" oder "wurde losgelassen" benötigst du ein weiteres Bit als Flag in dem du den letzten Zustand der Entprellung lagerst. Ist jetzt etwas schlecht zu erklären :rolleyes:

Du benötigst für jede Taste zwei Bits für die Erkennung ob gedrückt oder losgelassen wurde (also Flankenerkennung)

Also sagen wir mal der Taster schaltet nach GND ...

- Der Inhalt des Schieberegisters ist 01101001 => Taste prellt noch - undefinierter Tastenzustand
- Der Inhalt des Schieberegisters ist 00000000 => Taste wurde gedrückt und prellt nicht mehr => tast=0
- Der Inhalt des Schieberegisters ist 11111111 => Taste wurde losgelassen und prellt nicht mehr => tast=1

- tast ist der aktuelle Zustand der Taste
- last_tast ist der beim letzten Durchlauf als stabiler/definierter Zustand erkannte

nun also ...

tast=0 und last_tast=0 => Taste war gedrückt und ist immer noch gedrückt
tast=1 und last_tast=1 => Taste war losgelassen und ist immer noch losgelassen
tast=0 und last_tast=1 => Taste war gedrückt und ist jetzt losgelassen (Tastenänderung)
tast=1 und last_tast=0 => Taste war losgelassen und ist jetzt gedrückt (Tastenänderung)

Sieh mal hier wie ich die Statusänderungen für einen Incrementalgeber erkannt habe ...
ATmega32-Board für Steueraufgaben und Experimente
- Im Beitrag #2 sind eingescannte Zettel mit Gedanken für den Incrementalgeber
- Im Beitrag #5 müßte (hoffentlich) der Quellcode in einer Zip drin sein.

An dem Incrementalgeber hab ich echt lange gebrütet :p aber es läuft :cool:
Das war ne Menge Bitpopelei mit viel Geschiebe und Bitgewechsel.

Gruß
Dino
 
tast=0 und last_tast=0 => Taste war gedrückt und ist immer noch gedrückt
tast=1 und last_tast=1 => Taste war losgelassen und ist immer noch losgelassen
tast=0 und last_tast=1 => Taste war gedrückt und ist jetzt losgelassen (Tastenänderung)
tast=1 und last_tast=0 => Taste war losgelassen und ist jetzt gedrückt (Tastenänderung)
Welche Werte stehen in tast (last_tast) während die Taste prellt? Warum brauchst Du diesen fünften Zustand nicht zu berücksichtigen?
 
Welche Werte stehen in tast (last_tast) während die Taste prellt? Warum brauchst Du diesen fünften Zustand nicht zu berücksichtigen?

Innerhalb des Schleifendurchlaufs ...

der aktuelle Wert vom Schieberegister packst du in "tast" ..
wenn das Schieberegister 00000000 ist dann machst du da ne 0 rein
wenn das Schieberegister 11111111 ist dann machst du da ne 1 rein
aber NUR dann. Bei allen undefinierten Zuständen (Prellen) im Schieberegister änderst du nichts am "tast"

nun vergleichst du "tast" mit "last_tast" so wie schon geschrieben ...
tast=0 und last_tast=0 => Taste war gedrückt und ist immer noch gedrückt
tast=1 und last_tast=1 => Taste war losgelassen und ist immer noch losgelassen
tast=0 und last_tast=1 => Taste war gedrückt und ist jetzt losgelassen (Tastenänderung)
tast=1 und last_tast=0 => Taste war losgelassen und ist jetzt gedrückt (Tastenänderung)

danach kopierst du für den nächsten Schleifendurchlauf "tast" in "last_tast"

... Schleifendurchlauf Ende ...

... nächster Schleifendurchlauf ........

Du merkst dir also in last_tast den Wert den tast während des letzten Schleifendurchlaufs hatte. Deswegen ja auch last_tast (last = zuletzt) ;) Du mußt ja Änderungen erkennen. Dafür mußt du aber wissen wie es beim letzten Mal war.

Man sollte natürlich geistreicherweise beim Programmstart tast und last_tast auf den selben Wert setzen (Taste nicht gedrückt) um im Programm keine ungewollten Aktionen auszulösen :p

Gruß
Dino
 
das ist kein Problem. Schau mal im FAQ-Bereich (Beitrag über SMD-Winzlinge) oder bei meinen Projekten. Da sind auch welche dabei die mit SOIC20 (tiny2313) sind. Da habe ich nen Lochstreifenraster genommen und mit nem Teppichmesser an den benötigten Stellen auf 1,27mm Raster gebracht.
Ok, den ersten habe ich schon gehimmelt. Ich habe es allerdings nicht so gemacht, wie Du es empfohlen hast! Statt dessen habe ich versucht, an jeden Pin einen Draht zu löten. Meine spannende Hilfkonstruktion beschreibe ich lieber nicht. Auf alle Fälle sind mir zwei Beinchen abgebrochen. :-((

Kennt jemand eine andere Bezugsquelle für den TSL230RD SOIC, außer Mouser?
 
Hmm... RS Components hat ihn, aber ob Dir das was bringt...
Ansonsten kannste ja mal bei AMS wegen samples fragen...
(Hab auf die Art schon diverse LT-OPAMPS und so bekommen, und Buchsenleisten mit 1,00mm RM)
 
Der zweite Versuch hat auch nicht geklappt. Wahrscheinlich hat sich der Kupferbelag durch die Bearbeitung mit dem Teppichmesser teilweise gelöst. Zumindest löste er sich dann beim Löten. Es war ein wenig haarig, den Sensor dann wieder abzulöten, denn eigentlich waren schon all Pins fest. Ich wollte nur noch kurze Drahtstücke zu Stiftleisten dran festlöten. Hoffentlich hat er das alles überlebt? Mittlerweile wünschte ich mir ich könnte eigene Platinen ätzen. Aber wahrscheinlich ist das Quatsch.
 
Hi,

Der zweite Versuch hat auch nicht geklappt. Wahrscheinlich hat sich der Kupferbelag durch die Bearbeitung mit dem Teppichmesser teilweise gelöst. Zumindest löste er sich dann beim Löten.
hast du Hartpapier/Pertinax (FR2) oder Epoxid (FR4) verwendet ?

Ich benutze für sowas nur FR4, also Epoxid-Platinen.

Bei Pertinax kann man zwar billig was mit aufbauen aber beim lange braten oder zu kleiner Kontaktfläche der Leiterbahn mit der Basisplatte löst sich das schnell in Wohlgefallen auf. Da muß man schnell und sauber arbeiten wenn es problemlos ablaufen soll. Pertinax ist ein wenig nachtragend ;)

Gruß
Dino
 
Hmm...
in einigen Katalogen findet man auch diverse Adapterplatinen SOIC->DIL oder so...
sowas zB - zugegebenermaßen nicht grad billig, aber bevor man mehrere teure ICs in den Sand setzt...

GIBTS auch hier im Shop - schau mal selber... (keine Zeit mehr)
 
Hallo,

Ich hatte das da. Bei diesem Material steht 'Typ: Laborkarte, beidseitig'. Ist das richtig?
das ist eine "H25PS050 :: Punkt-Streifenrasterplati. Hartpapier, 50x100mm" - 0,81 €

also das ist eine Karte mit FR2 (Pertinax / Hartpapier) als Basismaterial. Ist nicht schlecht wenn du nichts dran schnitzt.
Für SMD-Schnitzwerk nehme ich immer ...

Lötpunkte:
- RE 200EP :: Europlatine, Epoxyd, verzinnt 160x100 mm - 4,80 €
- UP 832EP :: Lochrasterplatine, Epoxyd, 2-Seitig, 160x100mm - 4,20 €
- RE 435LF :: SMD-Laborkarte, Epoxyd, 53x95mm, 1,27mm-Raster, 2-Seitig - 9,75 €

Streifenraster:
- UP 730EP :: Streifenrasterplatine, Epoxyd, 1-Seitig 160x100mm - 3,95 €
- UP 732EP2 :: Streifenrasterplatine, Epoxyd, 2-Seitig 160x100mm - 5,20 €

Punktstreifenraster:
- UP 946EP :: Punkt-Streifenrasterplatine, Epoxyd, 160x100mm - 4,05 €

Man sieht schon das die FR4-Platinen in einer ganz anderen Preisklasse liegen. Bei den FR2 löst sich, wie schon bemerkt, bei kleinen Lötflächen oder bei langem rumbraten oder mechanischen Belastungen die Leiterbahn vom Basismaterial. Das passiert beim FR4-Basismaterial erst nach ziemlichem Gequäle. Die Platinen halten sehr viel mehr aus. Die Kupferflächen sind sehr gut mit dem Basismaterial verbunden. Die FR2 nehme ich eigentlich nur für Testaufbauten oder Kleinkram der nachher aufs Steckbrett gesetzt wird oder wo es nicht drauf ankommt. Alles andere mache ich mit FR4-Platinen.

Für die Bearbeitung von den FR4-Platinen empfehle ich wirklich scharfes Werkzeug. Also keine abgenudelten Bohrer oder alte Sägeblätter. Das wird nichts. Für die Bohrmaschine am besten Hartmetallbohrer und zum genauen Trennen nehme ich eine kleine Diamantbesetzte Trennscheibe für die Bohrmaschine. Folgendes kann ich für die Bearbeitung von FR4 empfehlen ...
- PROXXON 28840 :: Diamant-Trennscheibe, Ø= 20mm - 7,95 € (gut)
die folgenden Schleifstifte gibt es auch größer (mal im Bastelbedarf oder Baumarkt suchen) ...
- PROXXON 28240 :: Diamantschleifstift, Zylinder 1,8mm, 1 Stück - 1,75 €
- PROXXON 28222 :: Diamantschleifstift, Kugel 1,8mm, 2 Stück - 2,80 €
1,8mm ist mir etwas klein. Ich habe welche mit 3mm Durchmesser. Da lassen sich schön Konturen mit ausschleifen. Vorsicht! Es staubt saumäßig. Man sollte erst mit normalem Werkzeug die groben Maße erledigen und mit dem Diamantwerkzeug dann nur noch den Feinschlif machen. Glasfaserstaub ist auch nicht so gesundheitsfördernd. Das ist aber Staub von Hartpapier auch nicht.

Die Diamantfeilen von Reichelt hab ich mal probeweise bestellt (kosten ja nicht so viel) ...
- FEILE M 56 :: Diamant Nadelfeilen Sortiment, 5-teilig - 3,95 €
... nicht empfehlenswert. Ist meiner Meinung nach für die Arbeiten Kinderspielzeugs.

Also ne kleine Puksäge mit scharfen Metallsägeblättern, nen gutes Sortiment Schlüsselfeilen und gut ist. Der Rest dann mit Hartmetall und Diamant.

Gruß
Dino
 
Gut, ich werde bei der nächsten Bestellung noch einen Schnitzversuch wagen. Muß ja auch ausprobieren, ob der Sensor überlebt hat!

Zu der UP-946EP steht in der Übersicht bei Reichelt: 'Typ:Laborkarte, beidseitig'. Das hat mich irritiert. Ist die wirklich zweiseitig beschichtet?

Ja, und was ich auch immer noch suche ist eine freie Software, die mit Punkt-Streifenrasterplatinen umgehen kann. Kennt da jemand was?
 
Zu der UP-946EP steht in der Übersicht bei Reichelt: 'Typ:Laborkarte, beidseitig'. Das hat mich irritiert. Ist die wirklich zweiseitig beschichtet?
ich hab mal grad in meinem "Sortiment" nachgesehen. Sie ist nicht auf beiden Seiten beschichtet. ... komisch ...
Ich hab nicht zweiseitig geschrieben.
Haben die wohl bei den "Technischen Daten" etwas zu viel Copy-n-Paste gemacht :p :rolleyes:

Ich hab hier bei FR4 folgendes:
RE200EP - einseitig
UP946EP - einseitig
UP730EP - einseitig
UP732EP2 - zweiseitig
UP832EP - zweiseitig
RE435LF - zweiseitig
RE450LF - einseitig ohne Bohrungen
RE460 - beidseitig

und bei FR2:
HPR 160x100 - ohne Kupfer
H25SR160 - einseitig
H25PS160 - einseitig
H25PR160 - einseitig

Gruß
Dino
 
Ich habe hier Dino's Idee zum Entprellen eines Tasters mal an einem Beispiel umgesetzt. Das ganze läuft auf einem STK500. Der dritte Taster wird abgefragt und togglet die dritte LED entsprechend.

Code:
.nolist
.include "m168def.inc"
.list

.def	shift_reg	= r2
.def	led_state	= r3
.def	wr0		= r16



.equ	key_port	= pind
.equ	key_num	= 2
.equ	led_port	= portb
 
.org 0

init:
	ldi	wr0, 0xFF
	mov	led_state, wr0
	out    ddrb, wr0
	sec
	ror	shift_reg		; shift-reg durty
	out	led_port, led_state

main:
	in	wr0, key_port
	sec
	sbrs	wr0, key_num
	clc
	rol	shift_reg
	brne	notreleased

; Taste losgelassen

	set

notreleased:
	ldi	wr0, 255
	cpse	shift_reg, wr0
	rjmp	notpressed

; Taste gedrückt

	brtc	donothing
	ldi	wr0, 1<<key_num
	eor	led_state, wr0
	out	led_port, led_state
	clt
donothing:

notpressed:

	rjmp	main
 
Hallo,
hier...
...
Code:
...
main:
[B]	in	wr0, key_port[/B]
	sec
[B]	sbrs	wr0, key_num[/B]
	clc
...
kannst Du auch direkt auf das Bit im I/O-Register reagieren, und mußt nicht den Umweg über ein Rechenregister gehen. PIND liegt aufAdresse 0x09(remapped), und kann durch SBIC/SBIS etc erreicht werden:
Code:
...
main:
	sec
[B]	sbis	key_port, key_num[/B]
	clc
...
LotadaC

Edit:
Das ist auch ein wenig umständlich:
...
Code:
...
notreleased:
	ldi	wr0, 255
	cpse	shift_reg, wr0
	rjmp	notpressed
...
mein Vorschlag:
...
Code:
...
notreleased:
	CPI shift_reg, 255
	BRCS notpressed
...
 
kannst Du auch direkt auf das Bit im I/O-Register reagieren, und mußt nicht den Umweg über ein Rechenregister gehen. PIND liegt aufAdresse 0x09(remapped), und kann durch SBIC/SBIS etc erreicht werden:
Code:
...
main:
	sec
[B]	sbis	key_port, key_num[/B]
	clc
...
Stimmt!
Das ist auch ein wenig umständlich:
mein Vorschlag:
Code:
...
notreleased:
	CPI shift_reg, 255
	BRCS notpressed
...
Das funktioniert nicht! Schau, wie shift_reg definiert ist. Ich wollte kein oberes Register für diesen Zweck blockieren.
 
Ok, übersehen - bei den unteren 16 Rechenregistern gehen die Konstanten-Operationen natürlich nicht...
 
Puhh,

ich habe noch einmal eine typische Anfängerfrage.
Der tsl230 hat so ne Art Chip-enable Pin (#3) und der ist low aktiv.

Ich möchte den Käfer über einen AVR-Pin einschalten. Ich dachte mir ich hänge den TSL-pin über einen Widerstand an die Versorgungsspannung. Das ist ja dann wohl ein Pull-up Widerstand, oder? Und wenn ich den TSL-pin über den den AVR-pin dann auf low schalte, dann ist der Sensor aktiv.
Was aber ist dann los, wenn der AVR in seinem tri-state Zustand ist? Irgendwie bin ich mir unsicher und habe mal wieder Angst was zu zerstören.
 
Wenn der Pin am AVR tristate ist (also "in der Luft hängt"), und am tsl ebenso (also dort kein interner Pullup vorhanden ist), würde das ganze entsprechende Netz (ohne Pullup) auch "in der Luft hängen" (wenn der TSL einen aktiven internen Pullup hat, wirkt der wie ein externer, klar).
Wenn das Netz in der Luft hängt, ist es strörungsanfällig, auch klar.
Also sollte es definierte, sichere Pegel annehmen. Soll der TSL nicht enabled sein hi (über einen Pullup); soll er (durch den AVR) aktiviert werden, lo.
Wenn der AVR das Netz also auf lo zieht, fließt Strom von Vcc über den Pullup durch den AVR nach Gnd. Der TSL-Pin wird als Eingang hochohmig genug sein, um lasttechnisch nicht beachtenswert zu sein. Der Pullup ist also so zu wählen, daß er das Netz ausreichend schnell auf einen hi-Pegel bringen kann (klein genug), andererseits aber auch den Strom durch den AVR-Pin ausreichend begrenzen kann(groß genug). Abgesehen davon brauchst Du den Pullup sicher auch nicht als Heizung auf der Platine...

Im Tristate-Zustand verhält sich der AVR-Pin, als wäre er elektrisch nicht vorhanden (offen). Definiert wird dieser Zustand über das PORT-Register-Bit des Pins (0) und das DDR-Register-Bit des Pins (auch 0). Beides ist default (Beim reset des Controllers). Um also einen aktiven lo-Pegel auf das Netz zu legen, muß das DDR-Register-Bit auf 1 gesetzt werden.
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)