Не работает как надо If() с DCF77
Добавлено: Сб авг 30, 2014 21:11:53
Всем привет!
Работаю, на часами на DCF77.
Если коротко, DCF77 шлёт каждую секунду 0 или 1. Если 0, то в начале секунды сигнал понижается до 25% на 100мс, а если 1 то понижение длится 200мс. Для определения начала минуты сигнал на 59-й секунде не понижается.
Собственно вот код и я ещё вложил проект в проеусе и текс для имитации сигнала DCF77(DCF77.txt)
Если коротко, то каждые 20мс проверятся сигнал и если он есть то в "dcfL" добаляется +20мс.
Если сигнала нет, то проверяется, сколько натикало в dcfL и вот как-раз этот момент у меня как-то не получается.
Проверка происходит тут:
Но у меня паралельно к PB0 загорается ещё и PB2.
Объесните мне кто-нибудь, где я ошибаюсь?
Работаю, на часами на DCF77.
Если коротко, DCF77 шлёт каждую секунду 0 или 1. Если 0, то в начале секунды сигнал понижается до 25% на 100мс, а если 1 то понижение длится 200мс. Для определения начала минуты сигнал на 59-й секунде не понижается.
Собственно вот код и я ещё вложил проект в проеусе и текс для имитации сигнала DCF77(DCF77.txt)
Код: Выделить всё
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
uint8_t langeDCF;
uint16_t dcfL; //
int main(void)
{
/*lcd_init();
set_cursor(0,1);
lcd_string("------");*/
langeDCF=0;
dcfL = 0;
// Timer 0 konfigurieren
TCCR0B |= (1<<CS02) | (1<<CS00);; // Prescaler 1024
// Overflow Interrupt erlauben
TIMSK |= (1<<TOIE0);
// TIFR |= (1<<TOV0);
// Global Interrupts aktivieren
sei();
DDRB = 0xFF;
DDRA = 0x00;
PORTA = 0x00;
PORTB = 0x00;
while(1)
{
}
}
ISR (TIMER0_OVF_vect)
{
if ((PINA&(1<<PA0)) == 0)
{
if (dcfL<860)
{
PORTB|=(1<<PB2);
}
if (dcfL>860 && dcfL<950)
{
PORTB|=(1<<PB0);
}
if (dcfL>1800)
{
PORTB|=(1<<PB3);
}
PORTB&=~(1<<PB0);
PORTB&=~(1<<PB1);
PORTB&=~(1<<PB2);
PORTB&=~(1<<PB3);
dcfL=0;
}
if ((PINA&(1<<PA0)) == 1)
{
PORTB|=(1<<PB1);
dcfL +=20;
}
TCNT0 = 96; //Timer startet bei 96 (200-96=160 Ticker) 1:(8.000.000:160:1024)=0,02048s~20,4ms
}
Если сигнала нет, то проверяется, сколько натикало в dcfL и вот как-раз этот момент у меня как-то не получается.
Проверка происходит тут:
Код: Выделить всё
if (dcfL<860)
{
PORTB|=(1<<PB2);
}
if (dcfL>860 && dcfL<950)
{
PORTB|=(1<<PB0);
}
if (dcfL>1800)
{
PORTB|=(1<<PB3);
}
Объесните мне кто-нибудь, где я ошибаюсь?