www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Tasten abfragen oder so


Autor: PiCus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich hab da mal ein Problem, vielleicht hat jemand einen Ansatz wie ich
aus dem Gedankenloch komme,
also
ich hab einen ATmega8 mit internen Oszi 4MHz, daren einen PCF8574 mit
vier Tasten und vier LED, einen zweilten PCF mit LCD was ohne Probleme
funzt. Ich kann die Tasten einlesen und auch über den m8 steuern, nur
bekomme ich folgendes nicht hin

1. ich möchte mit Taster1 LED! einschalten, gaht auch, soll aber nach
einer Zeit wieder ausgehen bzw bei nochmaligen Tastendruck ausgehen.
2. wenn LED1 leuchtet durch Taste2 gelöcht wird und der die LED aus
sind.
Erst bei Tastendruck 2 LED2 einschalten, auch wieder für eine Zeit.

Hintergrund ich möchte mit der Schaltung einen Sonnenschutz realisieren
der prktisch wie einen Rollladensteuerung oder Torsteuerung
funktioniert. Im Anschluss was ich schon habe, ich bekomme einfach
keine Zeitschleife eingebaut die Tasten verriegeln sich aber eben nur
an und aus.

'------------------------------------------------
'  Tastenabfrage
'------------------------------------------------
Anfang:
Do
  I2cstart
  I2cwbyte Pcf8574read
  I2crbyte Pcf8574port , Nack
  I2cstop
   Taste1 = 0
   Taste2 = 0
   'Taste3 = 0
   'Taste4 = 0
  Select Case Pcf8574port
      'Case 247 : Taste4 = 1   '&B11101111
      'Case 251 : Taste3 = 1   '&B11011111
      Case 253 : Taste2 = 1    '&B01111111
      Case 254 : Taste1 = 1    '&B10111111
      'Case Else : Taste = 0   '&B11111111

   End Select

   Gosub Anzeige

      If Taste1 = 1 Then : Merker1 = 1 : End If
      If Taste2 = 1 Then : Merker2 = 1 : End If

      If Taste2 = 1 Then : Merker1 = 0 : End If
      If Taste1 = 1 Then : Merker2 = 0 : End If

Loop

Anschließend die Anzeige als Kontrolle

'------------------------------------------------
'  Anzeige
'------------------------------------------------
Anzeige:
   I2cstart
   I2cwbyte Pcf8574write
   Locate 1 , 1 : Lcd "Taste1:" ; Taste1 ; "-" ; Merker1
   Locate 2 , 1 : Lcd "Taste2:" ; Taste2 ; "-" ; Merker2
   I2cstop

Return

wer kann mir da mal einen Anstoss geben. ??

mal dank

Autor: PiCus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tschuldigung für's doppelt
:-)

Autor: peter zerl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
würds mal mit nem timer versuchen

kenn mich nur leider nicht mit pics aus haben die aber sicher

Autor: Lothar Sammel (magic33)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
wenns nach einiger zeit wieder ausgehen soll dann weéinen wait rein
und dann 255 an den pcf 8574 senden

wenn wieder taste gedrückt dann einen neuen wert senden dann andert
sich ja auch der zustand des chips


ich hab ganze reihen realisiert max 32 platinen pro i2c das sind 256
sachalter oder taster je nach dem


siehe anhang

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warten ist blöd, da ja dabei nichts anders funktioniert.

Du mußt warten, ohne die CPU zu blockieren und da fällt mir eigentlich
nur ein Scheduler ein, der kann das:

http://www.mikrocontroller.net/forum/read-4-49709.html#new


Peter

Autor: PiCus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das mit Wait hab ich schon durch, hat aber das Problem dass dann der
ganze Prozess hängt und keine anderen Äanderungen mehr erkannt werden
bis der Wert abgelaufen ist.

Es soll ja so sein dass ich die Tasten über I2C einlese, was ja geht,
es soll aber die Funktion Tasten einlesen praktisch Parallel zu Anzeige
der Taste per LED angezeigt werden. Während der Anzeige auch wieder die
Tasten überwacht werden.

Mal ne andere Frage, kann ich eingelesene I2C Tasten auch Toggle'n ??


den Scheduler Vorschlag von Peter muss ich mir erst mal anschauen da
ich mit C usw. keine Erfahrung habe kann ich nur mit BASCOM
programmieren.
Gruss PiCus

Autor: PiCus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo nochmal,
ich hab nun das Programm so wie ich wollte, es fehlt nur noch die
zeitliche Abschaltung, also nach Tastendruck und Einschalten/Anzeigen
von Auf/Ab soll eine Zeit von ca 30 Sek ablaufen und die Funktionen
wieder Auf und Ab auf 0/Aus setzen,

Kann man eigendlich die Abfrageroutine der Tasten noch vereinfachen ??
Dacht an eine XOR Verknüpfung.......


------------------------------------------------
'i2c-pcf8574-switch
'4 Tasten
'4 LED
'------------------------------------------------
$regfile = "m8def.dat"
$crystal = 4000000
$lib "Lcd_i2c.lib"
$lib "i2c.lib"

'------------------------------------------------
'  Declarationen
'------------------------------------------------
Config Sda = Portc.4
Config Scl = Portc.5
Config I2cdelay = 10
Portc.4 = 0
Portc.5 = 0

Ddrb = 00001111

Const Aus = &B11111111                                      'Alle
Ausgänge 0
Const Pcf8574write = &H40                                   'eingabe
Const Pcf8574read = &H41
Const Pcf8574_lcd = &H4E

Config Lcd = 20 * 2
Dim _lcd_e As Byte
_lcd_e = 128

Dim Pcf8574port As Byte
Dim Taste As Byte
Dim T As Integer
Dim Auf As Bit
Dim Ab As Bit

'------------------------------------------------
'  Vorspann - Initialisierung
'------------------------------------------------
   Cls                                                      '
Verzögerung
   Locate 1 , 1 : Lcd "Lade Programm ... "
   For T = 1 To 3
   Locate 2 , 1 : Lcd "Bitte warten .... " ; T
   Wait 1
   Next T
   Cls

'------------------------------------------------
'  Tastenabfrage
'------------------------------------------------
Anfang:
Do
  I2cstart
  I2cwbyte Pcf8574read
  I2crbyte Pcf8574port , Nack
  Taste = Pcf8574port
  I2cstop
      If Taste = 253 And Ab = 0 And Auf = 0 Then : Ab = 1 : Wait 1
         Else
      If Taste = 253 Or Taste = 254 And Ab = 1 And Auf = 0 Then : Ab =
0 : Wait 1
         Else
      If Taste = 254 And Ab = 0 And Auf = 0 Then : Auf = 1 : Wait 1
         Else
      If Taste = 254 Or Taste = 253 And Auf = 1 And Ab = 0 Then : Auf =
0 : Wait 1
         End If
         End If
      End If
      End If

  Gosub Anzeige
Loop

'------------------------------------------------
'  Anzeige
'------------------------------------------------
Anzeige:
   I2cstart
   I2cwbyte Pcf8574write
   Locate 1 , 1 : Lcd "Taste :" ; Taste
   Locate 1 , 13 : Lcd "Auf:" ; Auf
   Locate 2 , 13 : Lcd "Ab :" ; Ab
   I2cstop

Return

End

hat jemand eine Idee wie und wo ich die Laufzeit eifügen kann, so dass
die Funktion wie sie nun ist auch bleibt.

Die LCD-Anzeigen werden Später durch Ausgaben auf dem 2. PCF8574
ersetzt.

Gruss PiCus

Autor: PiCus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

also ich hab nun alles ab gesucht und gelernt dass es 2. Timer gibt
einen 8 und 16Bit nur hab ich nirgends ein kelinen Beispiel gefunden
wie ich den einsetzen kann. Ich weiss dass ich ihn mit Config Timer1
configurieren muss, den Teiler einstellen, aber ich komme einfach nicht
dahinter wie ich den in meinen Programm einbauen kann dass er bei
Tastendruck startet oder stopt.

Kann mir da bitte mal jemand auf die Sprünge helfen. Es soll einfach
nur zwischen 15 und 30sec sein.
(Ich möchte schon vorm Sommer meiner kleinen Maus und dem Sandkasten
einen Sonnemschutz spendieren.)
Wenn nun jemand fragt warum der Timer und kein Endschalter, Endschalter
wäre einfach aber den müsste ich dann über eine Mechanik an den Motor
bauen was nicht so einfach wäre.

Dank im voraus

PiCus

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Kann mir da bitte mal jemand auf die Sprünge helfen.

Egal, dann verbrenne ich mir eben wieder mal den Mund:

Solange du AVRs mit BASCOM programmieren möchtest, wirst du hier kaum
kompetente Hilfe bekommen.

...

Autor: PiCus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Egal, dann verbrenne ich mir eben wieder mal den Mund:

>Solange du AVRs mit BASCOM programmieren möchtest, wirst du hier kaum
>kompetente Hilfe bekommen.

Wenn dem so ist, sollte man im Eingang davor WARNEN sich als BASCOM -
Programmierer hierhin zu Verlaufen.

Nach dem Studium der einzelnen Beiträge war ich der Meinung dass hier
Informationen getauscht, Hilfe wenn möglich erteilt wird, aber wenn
dass nur EINZELNEN zu gute kommt die eben Spass daran haben nicht in
BASIC zu Programmieren dann bin ich hier falsch.

So kann man sich täuschen.

Danke HanneS,
mit der Wahrheit verbrennt man sich nicht den Mund, nur DIE die eine
andere Meinung haben und damit alleine bleiben wollen, dann solle Sie
es bleiben.

Ich hab das Programm soweit geschaft, werd ich den Rest auch noch
alleine schaffen.

So kann man sich Irren...........

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@PiCus,

laß Dich nicht ins Boxhorn jagen, fragen kostet ja nichts.

Und nicht so hilfreiche Antworten läßt man einfach links liegen.


Rein persönlich bin ich zwar auch der Meinung, daß C die wesentlich
leistungsfähigere Sprache ist gegenüber Basic, aber das will ich keinem
aufdrängen, das muß jeder für sich entscheiden.


Zu Deinem Programm:

Du wirst wohl nicht umhinkommen, einen Timerinterrupt aufzusetzen, der
eine Variable runterzählt, bis die gewünschte Zeit rum ist.
In der Mainloop wird dann diese Variable getestet und ist sie 0, wird
der Timer gestopt und die gewünschte Aktion ausgeführt.

Bei der Tastenabfrage vergleichst Du immer den kompletten Port, das
kann sehr leicht schiefgehen, wenn die anderen Portbits andere Funktion
haben. Man sollte daher immer nur den gewünschten Pin ausmaskieren (mit
AND).

Man sollte auch eine Funktion schreiben, die nur das gedrückt werden
erkennt, also den Wechsel und nicht den statischen Zustand des gedrückt
seins. So kann man einfacher darauf reagieren und es spielt keine Rolle,
ob jemand kurz oder lang drückt (ältere Menschen drücken länger).

Du hast da haufenweise "WAIT 1" drin, wozu ist das gut ?
Wenn das bedeutet warte 1s, dann wird das Programm mächtig träge und
Dir können kurze Tastendrücke verloren gehen. Nichts hasse ich mehr,
als wenn ich ne Taste drücke und nichts passiert.



Peter

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter, ich wollte niemanden ins Boxhorn jagen.

Mir ist aber aufgefallen, dass kaum eine bisher gestellte BASCOM-Frage
wirklich zufriedenstellend beantwortet wurde. Ich habe schon des
öfteren auf BASCOM-Fragen geantwortet und dabei den Algorithmus
genannt, wie ich es in ASM machen würde, doch man wollte diese
Antworten nicht, sondern fertigen BASCOM-Code. Also habe ich mir
abgewöhnt auf solche Fragen zu antworten. Und so wird es vermutlich
auch Anderen gehen, die sich nicht auf BASCOM eingeschossen haben.

Ich gehöre aber nicht zu denen, die immer und überall BASIC
herabwürdigen, weil es "unter Niveau" sei. Nein, ich benutze selbst
BASIC in einigen Dialekten.

Aber beim AVR muss ich Hardware programmieren. Und das geht in ASM
bedeutend eindeutiger (unmissverständlicher) als in BASCOM. In C geht
das vermutlich genauso effizient wie in ASM, aber dazu muss man C schon
verdammt gut beherrschen. Dazu fehlt mir die Ausdauer und die
Motivation, Arbeit gibt mir auf diesem Gebiet sowiso niemand mehr. Ich
bleibe bei AVRs also bei Assembler.

Eigentlich wollte ich mit meiner Aussage nur ausdrücken, dass wirklich
kompetente BASCOM-Programmierer (vor denen ich Achtung habe) hier recht
dünn gesäht sind.

Gruß...
...HanneS...

Autor: PiCus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

@Peter
ich hatte aber mit meiner Ausführung doch Recht, tritt man einem auf
den Fuss beschwehrt er sich.
Du hattest mir am Anfang schrieben dass ich dazu einen Timer benutzen
soll, gut hab ich eingesehen und nach gefragt wie..... hätte ich es
gewusst, hätte ich nicht fragen müssen. Nun sind deine Fragen bzw
Erläuterungen schon anders. Ich kann von mir sagen dass ich
unkrittische Abläufe schon unter Sinclair/Commodore Zeiten und auch in
ASM programmiert habe wo einige hier noch nicht mal wussten was das ist
und nun hab ich nach langem (25 Jahre) wieder Zeit und dass sich in
dieser Zeit einiges geändert hat ist klar. Ich möchte nicht mehr
unbedingt C lernen sondern mit dem was ich weiss arbeiten und alles
weiss ich nicht. Aber genug davon.
Dein Vergleich mit alten Leuten ist nicht schlecht und auch richtig,
hat aber mit den WAIT's nichts zu tun es ist lediglich eine kleine
Tastenentprellung -ich weiss es geht auch anders- und für das was es
tun soll ausreichend. Das mit dem Ausmaskieren hattest du mir an
anderer Stelle schonmal erklärt, aber ich sage mir aus Fehlern kann man
lernen und dies ist eben nur mal der Versuch ob meine Idee überhaupt
umzusetzten ist.
Mir ging es darum einen Schubs zu bekommen in die richtige Richtung,
durch viel lesen hab ich etwas gefunden und werde es mal ausprobieren.

Ich hoffe du trägst mir die etwas harten Worte nicht nach.
@HanneS
ich hab in meiner Ausbildung auch ASM gelernt und Programmiert und dass
war nie so mein Ding, aber unbestritten ist dass der beste Weg
Controller zu programmieren, aber ein alter Gaul verlässt nun mal nicht
freiwillig den einfachen Weg.

So nun hab ich dass Forum genug belagert ich geh was arbeiten.

PiCus

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.