Zdravim vas.
Prosim zkusene o radu s osetrenim zakmitu jazyckoveho rele. Existujici navody na netu se tykaji bouhuzel jen osetreni klasickych tlacitek, aspon tak jsem nasel. Nevim si rady jak se vyrovnat se zakmity jazyckoveho kontaktu, u ktereho je potreba dodrzet rozliseni 30ms mezi dvema sepnutimi.
Dekuji za radu a prip. ukazku v C.
Fórum › Mikrokontroléry
Preruseni - zakmity
zalezi na tom, jak dlouho zakmitava, a jak dlouho je minimalne sepnute.. muzes klidne po 1 ms testovat zda je sepnuto a pokud bude sepnuto (spolehlive) dejme tomu dele jak 5 ms, tak uz vykonat akci
pripadne lze pridat mohostabilni klopny obvod.. opet aby mel delsi cas aktivni hrany nez zakmity
nebo pokud mas prepinaci kontakt je nejlepsi R-S klopny obvod
To KIIV : nekde jsem narazil na prispevek, ze tyto jazyckove kontakty se bezne ustali v case 0.7 - 1ms. Ja mam pripojen snimac od cyklocomputeru Sigma. Asi delam neco blbe, protoze ikdyz udelam delay 100ms (coz je pro mou potrebu neprijatelne), stejne to nekdy chyti 2x na jedno sepnuti. HW reseni by asi bylo idealni...
Zatim diky
morganzd napsal:
To KIIV : nekde jsem narazil na prispevek, ze tyto jazyckove kontakty se bezne ustali v case 0.7 - 1ms. Ja mam pripojen snimac od cyklocomputeru Sigma. Asi delam neco blbe, protoze ikdyz udelam delay 100ms (coz je pro mou potrebu neprijatelne), stejne to nekdy chyti 2x na jedno sepnuti. HW reseni by asi bylo idealni...
Zatim diky
Šoupni sem kód a pokud možno zjednodušené schéma, jak to máš zapojené. Oboje řádně zhodnotíme a poradíme :)
Zde je kod. Na konci metody incStep uz chybi jen zobrazeni cisla na displej, pro zkraceni veci okolo LCD vynechavam.
Jazyckovy kontakt je jednou nohou na INT0, druhou na zemi. Pri priblizeni magnetu se sepne.
Jeste doplnim, ze je to odnekud obslehnute...
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#ifndef F_CPU
#define F_CPU 1000000L
#endif
#include <avr/delay.h>
#define sbi(port, bit) (port) |= (1 << (bit))
#define cbi(port, bit) (port) &= ~(1 << (bit))
static volatile uint8_t xxint0 = 0x00;
void incStep() {
if ( xxint0 >= 0xFF )
xxint0 = 0x00;
else
xxint0++;
}
SIGNAL(SIG_INTERRUPT0) {
if ( !(PIND & (1 << PD2)) ) {
_delay_ms(5);
if ( PIND & (1 << PD2) ) {
_delay_ms(5);
incStep();
}
}
}
int main(void) {
_delay_ms(100);
DDRD &= ~( 1 << PD2 );
PORTD |= ( 1 << PB2 );
_delay_ms(5);
GICR |= 1 << INT0;
cbi(MCUCR, 0);
cbi(MCUCR, 1);
sei();
while ( 1 ) {
}
}
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Zákmity kontaktu po stoprvní :-/ — založil morganzd
Raspberry Pi a hw preruseni — založil svoby1
Přerušení u MCP23S17 — založil Tonda
Preruseni nekonecneho cyklu — založil Gadael
AVR přerušení program — založil Wintel
Moderátoři diskuze