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
...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.
Hier mal mein PIC-Code ;-)
Für DOWN nochmal Dasselbe. Kann man sicher noch verbessern.
Gruß, Guido
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
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
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
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);
}
};
}
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.. ;-)
Powered by vBulletin® Version 4.1.12 Copyright ©2012 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.