A teď k problému řešil jsem to už v sekci mikroprocesory ale každý uživatel programuje v jiném jazyce tak jsem se přesunul sem ke znalcům C.
chtěl bych Atmegou8 snímat jedno dvojité čidlo (vždy je zastíněna jen jedna polovina) a pokud by byla jedna polovina čidla zakrytá déle než 100ms objevil by se na výstupu Atmegy8 300ms pulz.
fungovalo by to tedy tak že pokud by byla kladná úroveň PB1 nebo PB2 splnila by se podmínka a
poté by se porovnal příslušný registr s TCNT1 (ješte musím zjistit jak dopsat aby se podmínka splnila po
jakékoli delší době než 100ms)
Zatím jsem se pokoušel jen o jednu polovinu pogramu, tedy jen jedno čidlo. Ale jak je vidět tak né úspěšně proto bych od vás potřeboval malou úpravičku aby alespoň to jedno pro začátek fungovalo to ostatní bych si už doupravil včetně toho delaye který je tam jen pro začátek na zkoušku.
Kód: Vybrať všetko
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
ISR (TIMER1_COMPA_vect){ // pretečenie pri zhode registrov OCR1A a TCNT1
TCNT1 = 0; // nuluj TCNT0
}
int main(){
DDRB|=(1<<PB3); //PB3 jako výstupní
DDRB&=~(1<<PB1); //PB1 jako vstupní
TCCR1A|=(1<<CS11)|(1<<CS10); //předělička 64 (8us)
OCR1A=12499; //hodnota preteceni 12500
sei(); // povol globalne prerušenia
while(1){ // nekonečná slučka
if((PORTB&(1<<PB1))==1){ // pokud je cidlo na pinu PB1 1urovne
TIMSK|=(1<<OCIE1A); //porovnej registr OCR1A a TCNT1, (tady bude asi ten zadrhel schazi mi tu neco co pri schode nebo vetsi hodnote TCNT1 vytvori podminku)
PORTB|=(1<<PB3); //vystupni uroven 1
_delay_ms(300); //pockej 300ms
PORTB&=~(1<<PB3); //vystupni uroven 0
}
}
return 0;
}