Uspávání KM driveru vs. dynamika
Já se projdu asi po o: http://www.ges.cz/cz/74hc123-GES05000311.html" onclick="window.open(this.href);return false; (už jsem ukecal kolegy vyrazit do vietnamské restaurace poblíž, ani to nedalo moc práce ) Případně raději http://www.ges.cz/cz/74hct123-GES05000396.html" onclick="window.open(this.href);return false; ?
mimooborová naplavenina • kolowratský zázrak™ • NPS • GCU • HirthCalc • ncDP.ino
Touché!ledvinap píše:Jeste jednou pripomenu, ze kondenzator se vybiji jen v prubehu STEP pulzu a v EMC je delka pulzu konstantni nezavisle na frekvenci. Takze pokud je cas potrebny na vybiti kondenzatoru delsi nez delka step pulzu, tak se proud zvysi az v kroku, ktery dostatecne vybije kondenzator. Nezavisle na rychlosti.
Jasně, máš pravdu.
Chlapi já se vám divím... vy asi fakt nevíte co s časemThomeeque píše: .....
PS: Mikrokontroler mi tu přijde trochu overkill, navíc klopák by měl být rychlejší (čímž neřikám, že by 20MHz uC byl na tento účel pomalej), přesto díky za tip.
Použít elegantně jedinej šváb za pár kaček bez jakýhokoliv bastlení místo kondíků a diod a klopáků a buhvíjakýho smetí kolem aby to možná udělalo aspoň přibližně na desátý pokus to co ten uC naprosto spolehlivě a jednoduše nezávisle na délce řídícího pulzu s možností SW odfiltrování případných zákmitů na vstupu atd...
No jak říkám.... chtěl bych mít opět čas si hrát s blbostma
Tak 74HC123 už mi na nepájivym poli hezky klopí, jak je třeba, teď to ještě nějak vbastlit místo původního řešení, jde se na to..
@CZ_Pascal: Njn, jsme tu děsný zabedněnci.
@CZ_Pascal: Njn, jsme tu děsný zabedněnci.
mimooborová naplavenina • kolowratský zázrak™ • NPS • GCU • HirthCalc • ncDP.ino
To CZ_Pascal:
No, praxe říká, že je dobré použít programovatelný chip jen tehdy, když to skutečně přinese nějakou značnou výhodu, aby to kompenzovalo nevýhody.
Hlavní nevýhoda je v tom, že je to obtížněji opravitelné a udržovatelné (většinou to dokáže opravit jen autor, nebo někdo, kdo má k dispozici dobrou dokumentaci).
Výhodou samozřejmě je, pokud to přinese nějakou lepší funkčnost a zjednoduší konstrukci.
Ale zrovna zde by se nahradil jeden triviální chip jiným jedním (programovatelným) chipem. Funkčnost by byla stejná, obvodová složitost taky, cena vyšší, pracnost návrhu vyšší a opravitelnost horší. Teda aspoň podle mě. A to jednochipy miluju.
Pokud někdo dostane do ruky na opravu nějaké neznámé zařízení, a je na něm evidentně vadný nějaký běžný chip 74xx, tak to človek při odpolední kávě hladce opraví a ještě se u toho může šťourat v nose. Když je tam ale oddělaný nějaký procesor, tak to většinou ani nestojí zato dál zkoumat, většinou je to předem zabité.
No, praxe říká, že je dobré použít programovatelný chip jen tehdy, když to skutečně přinese nějakou značnou výhodu, aby to kompenzovalo nevýhody.
Hlavní nevýhoda je v tom, že je to obtížněji opravitelné a udržovatelné (většinou to dokáže opravit jen autor, nebo někdo, kdo má k dispozici dobrou dokumentaci).
Výhodou samozřejmě je, pokud to přinese nějakou lepší funkčnost a zjednoduší konstrukci.
Ale zrovna zde by se nahradil jeden triviální chip jiným jedním (programovatelným) chipem. Funkčnost by byla stejná, obvodová složitost taky, cena vyšší, pracnost návrhu vyšší a opravitelnost horší. Teda aspoň podle mě. A to jednochipy miluju.
Pokud někdo dostane do ruky na opravu nějaké neznámé zařízení, a je na něm evidentně vadný nějaký běžný chip 74xx, tak to človek při odpolední kávě hladce opraví a ještě se u toho může šťourat v nose. Když je tam ale oddělaný nějaký procesor, tak to většinou ani nestojí zato dál zkoumat, většinou je to předem zabité.
Tak jsem zbastlil takový divoký adaptér (fotky zde), který jsem zatím pokusně nastrkal do patice původní 7414 a zdá se, že problém je vyřešen, akceleruje to stejně ze spánku jako z plného proudu. Zkusil jsem v linuxCNC nastavit všechny Driver Timming hodnoty na 200ns (což je oproti nabízeným presetům hodně málo) a bez problémů. Testoval jsem to zatím jen krátce, další testy udělám, až to tam zapojím pořádně.
T.
T.
mimooborová naplavenina • kolowratský zázrak™ • NPS • GCU • HirthCalc • ncDP.ino
Ano Přesně tak. Naprosto brutálně se zjednoduší zapojení na jeden jediný osminožičkový šváb !Mex píše:To CZ_Pascal:
No, praxe říká, že je dobré použít programovatelný chip jen tehdy, když to skutečně přinese nějakou značnou výhodu, aby to kompenzovalo nevýhody.
Ano přesně tak. Ten šváb je naprogramovaný během chviličky a pokud náhodou nevyhovuje timing tak se jen jednoduče upraví nějaká konstanta v programu.Mex píše: Hlavní nevýhoda je v tom, že je to obtížněji opravitelné a udržovatelné (většinou to dokáže opravit jen autor, nebo někdo, kdo má k dispozici dobrou dokumentaci).
Autorem je Thomeque takže přesně ví jak so to opravit. Určitě to půjde snáze jak klubko zapájených drátů s diskrétními součástkami kde s žádným časováním pokud to nevyjde už nehne a všechno zahazuje a bastlí další hnízdi.
Ano přesně tak... viz výše.Mex píše: Výhodou samozřejmě je, pokud to přinese nějakou lepší funkčnost a zjednoduší konstrukci.
Ano přesně tak. Použil by se pouze jeden triviální mikročip místo klubka smetí nalepeného nabastleného kolem klopáku.Mex píše: Ale zrovna zde by se nahradil jeden triviální chip jiným jedním (programovatelným) chipem. Funkčnost by byla stejná, obvodová složitost taky, cena vyšší, pracnost návrhu vyšší a opravitelnost horší. Teda aspoň podle mě. A to jednochipy miluju.
Předpokládal jsem že Thomeque nezahájil seriovou výrobu s prodejem zařízení kterému by musel nabízet záruku a servis a stejně tak kde by opravdu zvítězila minimální cena nad elegancí jednočipuMex píše: Pokud někdo dostane do ruky na opravu nějaké neznámé zařízení, a je na něm evidentně vadný nějaký běžný chip 74xx, tak to človek při odpolední kávě hladce opraví a ještě se u toho může šťourat v nose. Když je tam ale oddělaný nějaký procesor, tak to většinou ani nestojí zato dál zkoumat, většinou je to předem zabité.
Takže jsem rád že jsme se tak pěkně ve všech bodech shodli
A jinak samozřejmě přeji ať to Thomeeque funguje ať už zvolil jakékoliv řešení.
Tak už chvíli jezdím a řešení se zdá se osvědčilo, mohu doporučit, přesné zapojení pro jednu osu vypadá takto:
S daným RC (použil jsem původní) to usíná za cca 0.5s. Okrajové stavy (zapnutí, vypnutí) jsem neošetřoval, IMHO je to zbytečné.
T.
@CZ_Pascal: dík za přání. Jestli máš chviličku, napiš nám sem prográmek pro ATtiny13 - dva nezávislé kanály (osy), garantovaná rychlost probouzení řádově v µs (na přesnosti usínacího intervalu nezáleží), stačí základní funkce alá klopák, ale včetně všech konfiguračních záležitostí (konfigurace vstupů, výstupů atp.).
S daným RC (použil jsem původní) to usíná za cca 0.5s. Okrajové stavy (zapnutí, vypnutí) jsem neošetřoval, IMHO je to zbytečné.
T.
@CZ_Pascal: dík za přání. Jestli máš chviličku, napiš nám sem prográmek pro ATtiny13 - dva nezávislé kanály (osy), garantovaná rychlost probouzení řádově v µs (na přesnosti usínacího intervalu nezáleží), stačí základní funkce alá klopák, ale včetně všech konfiguračních záležitostí (konfigurace vstupů, výstupů atp.).
mimooborová naplavenina • kolowratský zázrak™ • NPS • GCU • HirthCalc • ncDP.ino
Predesilam pro rypaly ze neovladam Ccko a neovladam jednocipy. Ale rychly nacrt vyzkouseny v simulatoru:Thomeeque píše: @CZ_Pascal: dík za přání. Jestli máš chviličku, napiš nám sem prográmek pro ATtiny13 - dva nezávislé kanály (osy), garantovaná rychlost probouzení řádově v µs (na přesnosti usínacího intervalu nezáleží), stačí základní funkce alá klopák, ale včetně všech konfiguračních záležitostí (konfigurace vstupů, výstupů atp.).
Kód: Vybrat vše
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/atomic.h>
#include <util/delay.h>
char firstCounter = 0;
char secondCounter = 0;
char oldState = 0;
char setState = 0;
ISR(PCINT0_vect) // interrupt service routine
{ // called when PCINT0 changes state
setState = oldState ^ (PINB & 0x06); // change detection
PORTB = (PORTB & ~(setState << 2));
oldState = PINB & 0x06;
if (setState == 0x02)
firstCounter = 0;
if (setState == 0x04)
secondCounter = 0;
return;
}
void SystemInit(void)
{
DDRB = 0b00011001; // portb bits 0,3,4 output; 1,2 in
PCMSK |= (1<<PCINT1); // pin change mask: listen to portb bit 1
PCMSK |= (1<<PCINT2); // pin change mask: listen to portb bit 2
GIMSK |= (1<<PCIE); // enable PCINT interrupt
sei(); // enable all interrupts
}
int main(void)
{
oldState = PORTB & 0x06;
SystemInit();
while(1)
{
if (firstCounter == 5)
{
PORTB = (PORTB | 0x08); //sleep PB3
firstCounter++;
}
else
if (firstCounter < 5)
firstCounter++;
if (secondCounter == 5)
{
PORTB = (PORTB | 0x10); //sleep PB4
secondCounter++;
}
else
if (secondCounter < 5)
secondCounter++;
_delay_ms(10);
}
}
ta kriticka cast vypada prelozena takto:
Kód: Vybrat vše
ISR(PCINT0_vect) // interrupt service routine
{ // called when PCINT0 changes state
32: 1f 92 push r1
34: 0f 92 push r0
36: 0f b6 in r0, 0x3f ; 63
38: 0f 92 push r0
3a: 11 24 eor r1, r1
3c: 2f 93 push r18
3e: 8f 93 push r24
40: 9f 93 push r25
setState = oldState ^ (PINB & 0x06); // change detection
42: 86 b3 in r24, 0x16 ; 22
44: 86 70 andi r24, 0x06 ; 6
46: 90 91 62 00 lds r25, 0x0062
4a: 89 27 eor r24, r25
4c: 80 93 63 00 sts 0x0063, r24
PORTB = (PORTB & ~(setState << 2));
50: 28 b3 in r18, 0x18 ; 24
52: 98 2f mov r25, r24
54: 99 0f add r25, r25
56: 99 0f add r25, r25
58: 90 95 com r25
5a: 92 23 and r25, r18
5c: 98 bb out 0x18, r25 ; 24
... Mno v assembleru pokud nemusim nedelam, ale baj voko by to mohlo vypadat takhle :
Ča pro spánek nastavitelnej pro oba porty nezávisle v setinách sekundy (maximálne 2.5 sekundy)
Zhruba třetí a pátá instrukce od začátku přerušení je nastavení pinu pro SLEEP režim. Přerušení obvykle naběhne do 4 cyklů
sakumprásk by mohla bát reakce těsně pod 1uS
Program jsem netestoval - zas tolik času na něco co nepotřebuji nemám
Kód: Vybrat vše
.include "tn13def.inc"
; definice registrovych promnenych
#define INT_Sreg r1
#define WReg r16
#define Timer_Reg r17
#define TMR_Flag r18
#define CNT1 r19
#define CNT2 r20
//Vystup SLEEP 1
#define SL1_ON cbi PORTB, 0
#define SL1_OF sbi PORTB, 0
//Vystup SLEEP 2
#define SL2_ON cbi PORTB, 1
#define SL2_OF sbi PORTB, 1
.CSEG
.ORG 0x0000
rjmp RESET_H ; Reset Handler
rjmp BAD_INT ; IRQ0 Handler
rjmp PCINT0_H ; PCINT0 Handler
rjmp TIM0_OVF_H ; Timer0 Overflow Handler
rjmp BAD_INT ; EEPROM Ready Handler
rjmp BAD_INT ; Analog Comparator Handler
rjmp BAD_INT ; Timer0 CompareA Handler
rjmp BAD_INT ; Timer0 CompareB Handler
rjmp BAD_INT ; Watchdog Interrupt Handler
rjmp BAD_INT ; ADC Conversion Handler
;
.ORG 0x000A
RESET_H:
ldi r16, low(RAMEND); Main program start
out SPL,r16 ; Set Stack Pointer to top of RAM
sei ; Enable interrupts
rjmp FirstInit
PCINT0_H: ; PCINT0 Handlerr // preruseni pro STEP (zmnena na pinu)
in INT_Sreg, SREG ; uschovat status registr
sbic PINB, PB2 ; Vstup pro SLEEP 1
SL1_OF ; pokud je PB2 = 1 tak vypnu rezim spanku
sbic PINB, PB3 ; Vstup pro SLEEP 1
SL2_OF ; pokud je PB3 = 1 tak vypnu rezim spanku
sbic PINB, PB2
clr CNT1 ; pokud je PB2 = 1 tak vynuluji odpocet 1
sbic PINB, PB3
clr CNT2 ; pokud je PB2 = 1 tak vynuluji odpocet 2
out SREG, INT_Sreg ; obnovim status registr
reti
TIM0_OVF_H: ; Timer0 Overflow Handler
in INT_Sreg, SREG ; uschovat status registr
sts TCNT0, Timer_Reg ; nastavim casovac pro 100Hz
ldi TMR_Flag, 0b00000001 ; nastavim priznak 100Hz ticku
out SREG, INT_Sreg ; obnovim status registr
reti
BAD_INT: // osetreni neocekavanych preruseni
reti
FirstInit:
clr r0
ldi WReg, 0b00000011 ; PB3 a PB2 vstup PB1 a PB0 vystup
out DDRB, WReg
out PORTB, r0
ldi Timer_Reg, 0xA3 ; 100Hz Timer pro Prescaller 1/1024 a 9.6 MHz
ldi WReg, 0b00000101 ; Prescaler 1/1024
sts TCCR0B, WReg
ldi WReg, 0b00000010 ; preruseni pro preteceni casovace
sts TIMSK0
ldi WReg, 0b00001100 ; preruseni PCINT0 pri zmnene pinu PB2 nebo PB3
sts PCMSK, WReg
ldi WReg, 0b00100000 ; povoleni preruseni od PCINT5..0
sts GIMSK, WReg
sei ; povoleni preruseni
Main:
cpi TMR_Flag, 0b00000001 ; nastal 100Hz Tick ?
brne Main ; pokud ne tak cekam dal:
clr TMR_Flag ; zrusim priznak 100Hz Ticku
cpi CNT1, 50 ; je counter na 50 ? (tedy napocital 0.5 sekundy)
brne A ; pokud neni tak A:
SL1_ON ; counter odpocital 0.5 sekundy tak nahodim rezim spanku
rjmp Next ; jdu skontrolovat dalsi counter
A:
inc CNT1 ; pricitam dalsi setinu sekundy pro CNT1
Next:
cpi CNT2, 50 ; je counter na 50 ? (tedy napocital 0.5 sekundy)
brne B ; pokud neni tak B:
SL2_ON ; counter odpocital 0.5 sekundy tak nahodim rezim spanku
rjmp Main ; Hotovo
B:
inc CNT2 ; pricitam dalsi setinu sekundy pro CNT2
rjmp Main
Zhruba třetí a pátá instrukce od začátku přerušení je nastavení pinu pro SLEEP režim. Přerušení obvykle naběhne do 4 cyklů
sakumprásk by mohla bát reakce těsně pod 1uS
Program jsem netestoval - zas tolik času na něco co nepotřebuji nemám
Jojo, to je fakt mnohem výhodnější, než použít chip za 5 Kč v katalogovém zapojení ...CZ_Pascal píše:... Mno v assembleru pokud nemusim nedelam, ale baj voko by to mohlo vypadat takhle :
A když už tam přece jen nacpat ten jednochip, tak by to chtělo využít i to druhé přerušení (INT0), po IRQ nedělat žádné schovávání statusu a testy, ale okamžitě vysypat na výstupní pin aktivní úroveň. Pak by se ta reakce na vstup mohla dát udělat docela rychlá (i když stále řádově pomalejší, než u obyčejného MKO).
Skutečně ne vždy je vyžití jednochipu výhoda.
Ty asi stále nechápeš rozdíl mezi vývojem nového zařízení, kde samozřejmě mohu zapojovat jak chci a samozřejmě se rozhodnu pro 5-ti korunove reseni, nebo situaci kdy uz mam neco hotove a potrebuji do toho elegantne bez klubka dratu a smetí kolem švába za 5 kc zapojit nejakou funkcionalitu a jeste si vybrat na kterem pinu budu mit vstupy a na kterem vystupy.Mex píše: Jojo, to je fakt mnohem výhodnější, než použít chip za 5 Kč v katalogovém zapojení ...
A když už tam přece jen nacpat ten jednochip, tak by to chtělo využít i to druhé přerušení (INT0), po IRQ nedělat žádné schovávání statusu a testy, ale okamžitě vysypat na výstupní pin aktivní úroveň. Pak by se ta reakce na vstup mohla dát udělat docela rychlá (i když stále řádově pomalejší, než u obyčejného MKO).
Skutečně ne vždy je vyžití jednochipu výhoda.
Podle tebe ten jeho driver má asi nejaky brutalni akcelerace ze mu je 1us na probuzení málo
Priklad (neodladeny) jsem daval pouze proto ze o to Thomeque pozadal, jinak mi to muze byt sumafuk jak si co kdo zapojuje...
- robokop
- Site Admin
- Příspěvky: 22409
- Registrován: 10. 7. 2006, 12:12
- Bydliště: Praha
- Kontaktovat uživatele:
taky bych sel do neceho programovatelnyho paklize to zrovna nemaji byt serie
onehda jsem delal neco z klopaku a jen jedna mala drobnost a cele to bylo naprd a neslo to moc resit a cpu to resil zcela elegantne
ono staci mizerna dokumentace nebo jeji mizerne cteni a pak jsi rad ze jsi schopny ledasco resit softwarove
jo a jen tak bokem by se jeste dalo tim procakem resit i nejaky ty sekvence napajeni a podobny veci co tam byvaji jak se tu onehda resilo
onehda jsem delal neco z klopaku a jen jedna mala drobnost a cele to bylo naprd a neslo to moc resit a cpu to resil zcela elegantne
ono staci mizerna dokumentace nebo jeji mizerne cteni a pak jsi rad ze jsi schopny ledasco resit softwarove
jo a jen tak bokem by se jeste dalo tim procakem resit i nejaky ty sekvence napajeni a podobny veci co tam byvaji jak se tu onehda resilo
Vsechna prava na chyby vyhrazena (E)
Este by ma celkom zaujimalo ako to v reale bude fungovat - teda je fajn, ze ten monostabil, ci procak zareaguje superrychlo, ale ako rychlo sa to prejavi v silovej casti?
Nejaka ta milisekunda by sa mohla ziskat tym, ze dajme tomu ten monostabil by mohol reagovat na nastupnu hranu step ale vlastny krok by sa spravil az na zostupnej hrane.
Toz len uvaha...
Nejaka ta milisekunda by sa mohla ziskat tym, ze dajme tomu ten monostabil by mohol reagovat na nastupnu hranu step ale vlastny krok by sa spravil az na zostupnej hrane.
Toz len uvaha...