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
würds mal mit nem timer versuchen kenn mich nur leider nicht mit pics aus haben die aber sicher
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
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
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
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
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
> 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. ...
>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...........
@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
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...
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
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.