ik ben een spindel motor aan het programeren en loop tegen het volgende probleem:
atmega 16 geprogrameerd met BASCOM.
wat heb ik:
een DC motor doet een schroefdraad draaien waarop een moer zit die vervolgens naar voor en achter kan bewegen (H-brug)voor & achteraan zit een microswitch als eindschakelaar.
2 x een drukknop die gedurende de beweging bediend dienen te blijven (voor/achteruit, moer gaat over volle lengte (stopt dus niet ergens halfweg)
ben zover dat de moer naar voor & achter beweegt en keurig stopt bij de desbetrefende microswitch, so far so good
.
wat wil ik:
ik wil dit extra beveiligen d.m.v. een tijdje. dus als normaal gesproken de tijd om te bewegen over de volle lengte 4 sec. is wil ik een tijdje mee laten lopen die na 4,5 sec een alarm geeft en de motor stopt, dit om te voorkomen dat de motor mechanisch helemaal vastloopt wanneer de microswitch om een of andere reden niet word gezien.
wat is mijn vraag:
wanneer je een drukknop bediend houd en de tijd van 4,5 sec. is verstreken dan stopt de motor en brand het alarm (LED) maar de cyclus start weer omdat ik de drukknop nog gedrukt houd, met als gevolg dat de motor nog verder draait.
ik wil dus iets hebben dat wanneer de tijd verstreken is ik de drukknop los moet laten (afgaande flank) alvorens weer opnieuw te kunnen bedienen.
hoop dat het duidelijk is anders hoor ik het wel.
alvast mijn dank
Ik weet niet of ik het goed begrijp maar ik zou het volgende doen :
a. Als je 4.5 seconde tijd verstreken is en de knop nog steeds ingedrukt een "vlaggetje" zetten. Vlaggetje gezet = motor uit.
b. Knop loslaten = vlaggetje resetten.
c. Indien de knop ingedrukt is EN de vlag = 0 -> Motor aan. Knop ingedrukt EN vlag = 1 -> motor niet aan want knop is niet losgelaten.
Misschien een beetje (te) cryptisch maar misschien helpt t.
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
Werk met een variabele die je als vlag gebruikt. In pseudo-code krijg je dan zoiets:
Vlag = 0
Wacht tot toets is ingedrukt
Vlag = 1
Start motor
Start timer voor 4 sec
Test tussendoor toets, en maak Vlag 0 als deze gelost is.
Herstart enkel, als Vlag 0 is
Afin, ja, zoiets. Tenzij ik je niet goed begrepen heb, uiteraard.
Dedju, met enkele seconden "afgevlagd"... 
klein is fijn
Moderator
Op 29 december 2007 18:27:02 schreef trix:
2 x een drukknop die gedurende de beweging bediend dienen te blijven (voor/achteruit, moer gaat over volle lengte (stopt dus niet ergens halfweg)
Hier raak ik even het spoor kwijt, die twee dingen spreken elkaar enorm tegen.
OF je maakt iets dat stop als je de knop loslaat, OF het draait door als je de knop loslaat. Het ene EN het andere gaat niet.
Gokje..... Ik denk dat de TS een loopje maakt waarin ie de knop afvraagt en eindigt na 4,5 seconde. Na die 4,5 seconde zal t programma wel weer meteen die loop inspringen als de knop nog steeds ingedrukt is. Nogmaal, is een gok, ik weet niet of t zo is.
met 2 x een drukknop bedoel ik 1 voor vooruit en 1 voor achteruit zolang je de knop bediend houd loopt de motor tot eindscahakelaar is berijkt is, laat ik ergens halfweg de drukknop los dan stopt de motor meteen ( met als gevolg dat in dit geval de 4,5 sec. veiligheid niet meer correct functioneerd
hetgeen ik beschreef is een deel van een groter geheel bestaande uit 3 motoren die een autom. cyclus afleggen waarbij de drukknoppen niet bediend worden deze zijn er alleen voor service doeleinden.
in de autom. cyclus wil ik trouwens ook die 4,5 sec. veiligheidsregel inbouwen.
ik dacht inderdaad ook aan een vlag/merker of zo maar geloof niet dat die in bascom voorhanden zijn
kijk een foto om beter te kunne laten zien waarover het gaat: namelijk een autom. deuropener
http://www.uploadarchief.net/files/download/kopie%20van%20dsc02340.jpg
kijk het gaat om de kleine motor rechtsonder (inderdaad een deel van een electrische schroevendraaier)net niet te zien maar hier zit een spindel aan M4 die de as laat draaien waaraan 2 oogbouten zitten die uiteindelijk de 2 tandwielen links in mekaar doen grijpen waarna de grote zwarte motor de deur opent. dat met die blauwe en zwarte ader is een van de micro switches (hangt nu los i.v.m. het testen, links zie je de 6 service drukknoppen plus staus/alarm led's.
Gelieve niet van die enorme foto te posten: http://www.circuitsonline.net/forum/faq#afbeeldingen
[Bericht gewijzigd door klein is fijn op (9%)]
maar geloof niet dat die in bascom voorhanden zijn
Bascom heeft inderdaad geen "Bit" variabelen zoals KEIL (.C) die heeft maar je kunt toch gewoon een "Byte" variabele de waarde 0 of 1 of whatever geven ?
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
Laat in dit geval de timer z'n status (het aantal mSec dat hij nog moet lopen) opslaan, zodat hij vanuit dat punt kan hervatten als de knop terug ingedrukt wordt.
Als die timer softwarematig loopt, laat je hem "iets" aftellen, en vandaar herstarten.
Vraag me niet hoe je dat naar BASCOM vertaalt... 
@pros dat vroeg ik nu juist wel
. ik weet het principe wel maar juist het uitvoeren in bascom is voor mij nog een raadsel (dit is pas mijn tweede project hiermee)
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
Al eens aan C gedacht? Lijkt me een mooie middenweg tussen "hogere" programmeertalen (waarbij je niet weet wat er werkelijk gebeurt) en assembly (waarbij je meteen terugvalt op iets dat weinig meer is dan machinecode, verpakt in mnemonics).
klein is fijn
Moderator
Op 29 december 2007 21:08:19 schreef bprosman:
Bascom heeft inderdaad geen "Bit" variabelen zoals KEIL (.C) die heeft maar je kunt toch gewoon een "Byte" variabele de waarde 0 of 1 of whatever geven ?
Ik kan hier anders gewoon "Dim Var as Bit" zeggen hoor. En dan kan je er alleen maar 1 of 0 in stoppen.
Voor de rest zijn er commando's zoals Start Timer en Stop Timer. In de main routine kan je constant een een paar knopjes pollen, als een knop van hoog naar laag gaat of andersom kan spring je naar een sub toe. In die sub kan je dan de timer aanzetten en motor aanzetten. Dan kan je ook meteen de timerstatus en motorstatus pollen in de main, als de motor te lang draait dan schakel je hem uit.
[Bericht gewijzigd door klein is fijn op (36%)]
sorry voor de te grote foto 
heb op dit moment mijn handen vol aan bascom, welicht in de nabije toekomst.
ben nu een beetje aan het stoeien met het idee van bprosman om gewoon een bit weg te schrijven en dit gebruiken als vlag/merker
edit: klein is fijn was me voor
realiseer me net dat ik nog veel te veel in plc's programeren denk, AVR is allemaal toch net iets anders.
v.b. als je in een PLC een drukknop op een input zet en een lampje aan een uitgang hangt en ik knoop deze in het programma aan melkaar dan is het normaal gesproken zo: drukknop 1 = lamp 1 & drukknop 0 = lamp 0.
in een AVR moet je heel bewust een uitgang "setten" en vooral ook weer "resetten".
als je het weet niks aan de hand.... maar ja als je het weet hé 
Nu de nog de edit functie gebruiken om dubbelposts te voorkomen.

[Bericht gewijzigd door klein is fijn op (53%)]
Ik heb wel eens (geprobeerd) uit te leggen in DEZE post hoe een timer werkt en uit te rekenen is in bascom.
Lees het eens door en je maakt zo je 4,5 seconden timeout.
Ik zou in jou geval trouwens via een shunt weerstand en de a/d convertor van de M16 de stroom naar de motor meten. Dan weet je het direct als hij een eindschakelaar mist of om een andere reden vastloopt.
ik ken die topic je zal het denk ik wel leuk vinden om te horen, deze heb ik een tijd terug al uitgeprint en bewaart in een special daarvoor bestemde map.
vandaag had ik die uitdraai er weer bijgepakt om die 4,5 sec. uit te rekenen.
een heldere & duidelijk uitleg
dat van die shunt had ik nog niet aan gedacht, heb print al geetst en wil het toch via de tijd methode proberen. wanneer dit eenmaal werkt ga ik die 4,5 sec. fine tune om zo min mogelijk schade te krijgen
[Bericht gewijzigd door trix op (28%)]
klein is fijn
Moderator
Op 29 december 2007 22:29:20 schreef 2N3055:
Ik heb wel eens (geprobeerd) uit te leggen in DEZE post hoe een timer werkt en uit te rekenen is in bascom.
Lees het eens door en je maakt zo je 4,5 seconden timeout.
Je hoeft daar helemaal geen word voor te declareren, je kan een timer preload zo rechtstreeds in het register schuiven aan het begin van de timer interrupt.
Voorbeeldje voor Timer0 van een ATtiny2313:
$regfile = "attiny2313.dat"
$crystal = 11059200
Dim b as byte
Config Timer0 = Timer , prescale = 1024
On Timer0 Tim0_isr
Enable Interrupts
Enable Timer0
Do
'main loop
Loop
Tim0_isr:
Tcnt0 = 40 <- Timer0 preset
If b = 50 Then
'Doe hier wat leuks
End If
Incr b
ReturnIn dit geval telt de timer standaard tot 256. Echter, de timer interrupt preset z'n eigen timer op 40 waardoor ie nog maar 216 stappen hoeft te tellen. Hiermee kom je precies uit op 50 interrupts per seconde. Iedere interrupt wordt b verhoogt, na 1 seconde wordt de opdracht uitgevoert. Dat valt makkelijk te veranderen naar 4.5 seconde.
Wat die registernamen zijn voor een ATmega16 zou ik zo even niet weten, maar het princiepe lijkt me zo wel duidelijk.