

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.
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.
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).
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é.
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);
}
}
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
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
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 :
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.