PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tasterfolgeschaltung ein Taster 3 Ausgänge



Kamayaka
28.06.2011, 22:39
Moin,

bevor ich was layoute und programmiere die Frage ob schon jemand etwas im Petto hat.
Es geht um die Steuerung einer elektrischen Leinwand die leider nur 3 Eingänge für Rauf, Stop und Runter besitz.

Idee: Ein Taster steuert eine kleine Elektronik die die drei Eingänge bedient.

Taster -> Ausgang runter
Taster -> Ausgang stop
Taster -> Ausgang rauf

Ideal wäre wenn die Steuerung, wenn Ausgang rauf oder runter als letzter bedient wurde nach einer Zeit X nicht in den Status stop wechselt sondern gleich zwei weiterschaltet...

Es schreit also nach einer PIC oder ATTiny Lösung... :)

Hat da jemand was?

Kama

Olli
29.06.2011, 00:18
...nicht in den Status stop wechselt sondern gleich zwei weiterschaltet...


Anstatt "zwei weiter" zu schalten, anderer Vorschlag:
"Stop" ist Grundzustand und kommt automatisch nach 30 Sekunden.
"Stop" kann außerdem vor Ablauf der 30 Sekunden durch Taster ausgelöst werden.

Beispiele mit automatischem Stop nach 30 Sek:
Taster wird betätigt -> Leinwand bewegt sich aufwärts .....30sek...... -> STOP
Taster wird betätigt -> Leinwand bewegt sich abwärts .....30sek...... -> STOP
Taster wird betätigt -> Leinwand bewegt sich aufwärts .....30sek...... -> STOP
usw.

Beispiel mit manuellem Stop vor Ablauf der 30 Sekunden:
Taster wird betätigt -> Leinwand bewegt sich aufwärts.....Taster wird nochmal betätigt -> STOP
Taster wird betätigt -> Leinwand bewegt sich abwärts..... Taster wird nochmal betätigt -> STOP


Das Programm lässt bei Tastendruck einen Zähler runterlaufen. Erreicht dieser Null -> STOP. Wird (während der Zähler noch läuft) die Taste erneut gedrückt, wird der Zähler sofort auf Null gesetzt -> STOP.

Habe ich zwar nicht fertig "rumliegen", der Programmieraufwand dürfte aber sehr gering sein.

guidob
29.06.2011, 00:22
Hier mal mein PIC-Code ;-)

Für DOWN nochmal Dasselbe. Kann man sicher noch verbessern.

Gruß, Guido

Winne
29.06.2011, 18:14
Habe ich dich richtig verstanden?
Du willst alle drei Funktionen mit nur einem Taster ausführen.

Folge

rauf, stop, runter, stop, .... wrap arround

So etwas habe ich im Vorjahr für ein Rolltor mit eine Logo programmiert um einen Einkanalfunkempfänger zu adaptieren.
http://www.nisch-aufzuege.at/pdfs/rolltorsteurung_siemens_logo.pdf


Kann ich dir gern auf einen ATtiny umsetzen.

MfG Winne

Kamayaka
29.06.2011, 19:11
Moin Winne,

nachdem ich bisher nur PICs gemacht habe PIC16C5x wäre es mein erstes Tiny Projekt ;) Von daher komme ich da gerne drauf zurück. Ich schau mal was ich noch an Tinys in der Schublade habe...

Jan

Winne
29.06.2011, 20:11
Dann schick mir mal das Anschlussbild für die Originaltasterschaltung
sowie die Spannung an den Tastern wenn diese offen sind


Das Programm steht schon weitestgehend. Lediglich Polarität der Ausgänge
und die Pegelanpassung fehlt um es abzuschließen .
Stromversorung könnten wir eventuell den Tastern selbst entnehmen :cool:

MFG Winne

Kamayaka
30.06.2011, 00:15
Moin Winne,

die Taster schließen gegen Masse. Versorgungsspannung würde ich entweder klauen oder selbst noch was dazuschnitzen. Der Eingangstaster schaltet ebenfalls gegen Masse, hier brauchts dann noch nen Pullup.

Jan

Winne
30.06.2011, 06:59
Püllups hat der ATtiny intern. Seine Ausgänge können Tristate (hochohmig) oder niederohmig nach Gnd oder niederohmig nach Ub schalten.

Ub kann zwischen 3V und 5V liegen.

Ein und Ausgänge vertrage maximal 5V

Ich hätte noch einen Atinni 12 SMD da ein ein Kondensator undein paar Dioden und es sollte funktionieren.

Miss doch mal die Spannung an de nichtbtätigten Tastern.

MfG

Kamayaka
30.06.2011, 07:50
Moin moin,

gerade das Schätzeisen gezückt. 5V sinds. Auf der Platine sitzt auchn Längsregler mit 5V
und im Repertoir hätte ich noch 5 ATTiny 2313, ebenfalls SMD. :)

Jan

Winne
30.06.2011, 11:50
Ich bin gerade in Muc und weiß noch nicht ob ich heute oder morgen zurückkomme

Willst du selber programmieren und brennen?

ATtiny2313 ist ja schon oversized völlig habe ich aber auch aber nur in DIL

es läuft darauf hinaus
Du brauchs kene weiteren BE (Oszillator ist intern)
Taster an GND und PortB(0)
5 V von Original platine
PortB(3) ab
PortB(4)stop
PortB(5)auf


#include tiny13.h <tiny13.h>// hatte mit 8 pinner (attiny12 oder 13)gedacht
#include delay.h<delay.h>
void init()
{
..... ///hab ich fertig aber nicht im Kopf
};
main
int a
init()
while()
{
while(PINB & 0x1 ==0x1) // warten auf tastendruck
for(a=0;a<4;a++) // zählen von 0-3 um die ring sequence festzilegen
{
if (a==0) // step 0
{DDRB =0x18;}; // auf
if (a==1) // step 1
{DDRB =0x28;}; // stop
if (a==2) // step 2
{DDRB =0x30;}; //ab
if (a==3) // step 3
{DDRB =0x28;}; // stop
};
delay_ms(500) // 1/2 sekunde warten
{DDRB =0x28;}; // alle Ausgänge auf high z
};

Namaste</delay.h></tiny13.h>

Kamayaka
02.07.2011, 21:22
So,

Platine ist fertig, muss ich die Tage dann mal ätzen.... Installiere gerade das naue AVR Studio 5. Hatte bisher 4 auf der Platte.... Zwischenzeitlich hab ich auch die Verkabelung des bisherigen Leinwandkontrollers abgeschlossen und alle nötigen Signale angeklemmt...

Stay tuned. ;)


3306

Kamayaka
02.07.2011, 23:45
So sieht der Code aktuell aus, obs funktioniert sehe ich dann wenn die Platine fertig ist...


/*
* AVRGCC1.c
*
* Created: 02.07.2011 22:05:17
* Author: Render
*/

#define F_CPU 1000000UL

#include <avr/io.h>
#include <util/delay.h>

enum estatstatus
{
eStatus_Up = 1,
eStatus_StopAfterUp = 2,
eStatus_Down = 3,
eStatus_StopAfterDown = 4,
} eStatus;

#define UP ~PINB0
#define STOP ~PINB1
#define DOWN ~PINB2
#define SILENT 0xff

int main(void)
{
eStatus = eStatus_StopAfterUp;

// PortB:
// Port B Ausgänge setzen
PORTB = SILENT;
// PINB0 PINB1 PINB2 as output, rest egal
DDRB = PINB0 | PINB1 | PINB2;

// PortD:
// PIND0 as input, rest egal
DDRD = ~PIND0;
// Pull Up aktivieren
PORTD = PIND0;

while(1)
{
// Warten auf Tastendruck
while(PIND & PIND0)

// Statemaschine
switch(eStatus)
{
case eStatus_StopAfterUp:
eStatus = eStatus_Down;
PORTB = DOWN;
break;
case eStatus_Down:
eStatus = eStatus_StopAfterDown;
PORTB = STOP;
break;
case eStatus_StopAfterDown:
eStatus = eStatus_Up;
PORTB = UP;
break;
case eStatus_Up:
default:
eStatus = eStatus_StopAfterUp;
PORTB = STOP;
break;
}

// Das Signal bleibt 1 Sekunde stehen
_delay_ms(1000);
PORTB = SILENT;

// Warten bis Taste losgelassen wurde
int iEntprell = 10;
while(iEntprell)
{
if(!(PIND & PIND0))
// Wenn Taster nicht gedrückt, runterzählen
iEntprell--;
else
// Wenn Taster prellt, zähler auf 10 setzen
iEntprell = 10;
_delay_ms(210);
}
};
}

Winne
03.07.2011, 14:28
Das Programm sollte soweit gehen, allerdings würde ich den Chip immer vollständig initialisieren das erpart Überraschungen.
Ich würde überlegen wie ich dem Chip noch was sinnvolles machen ließe. Der wirkt etwas unterfordert und könnte sich langweilen.. ;-)