Не работает как надо If() с DCF77

Обсуждаем контроллеры компании Atmel.
Ответить
Открыл глаза
Сообщения: 49
Зарегистрирован: Вс окт 06, 2013 17:15:02

Сообщение de1m »

Всем привет!
Работаю, на часами на 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
}
Если коротко, то каждые 20мс проверятся сигнал и если он есть то в "dcfL" добаляется +20мс.
Если сигнала нет, то проверяется, сколько натикало в dcfL и вот как-раз этот момент у меня как-то не получается.

Проверка происходит тут:

Код: Выделить всё

      if (dcfL<860)
      {
         PORTB|=(1<<PB2);
      }

      if (dcfL>860 && dcfL<950)
      {
         PORTB|=(1<<PB0);
         
      }
                
      if (dcfL>1800)
      {
         PORTB|=(1<<PB3);
      }  
Но у меня паралельно к PB0 загорается ещё и PB2.
Объесните мне кто-нибудь, где я ошибаюсь?
Вложения
DCF77.zip
Proteus+DCF77Emu
(19.95 КБ) 134 скачивания
Последний раз редактировалось de1m Сб авг 30, 2014 21:16:39, всего редактировалось 1 раз.
Реклама
Электрический кот
Аватара пользователя
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Сообщение Mishany »

Синтаксис неправельный, скобок не хватает
Вот форма правильная:
If ((a>b)&&(c<d))
{}
Реклама
Открыл глаза
Сообщения: 49
Зарегистрирован: Вс окт 06, 2013 17:15:02

Сообщение de1m »

Mishany писал(а):Синтаксис неправельный, скобок не хватает
Вот форма правильная:
If ((a>b)&&(c<d))
{}
Поменял на

Код: Выделить всё

if ((dcfL>860)&&(dcfL<950)) //0
		{
			PORTB|=(1<<PB0);
		}
Но без изменений
Изображение
Открыл глаза
Сообщения: 49
Зарегистрирован: Вс окт 06, 2013 17:15:02

Сообщение de1m »

Вроде как заработало. Поменял везде на

Код: Выделить всё

if ((dcfL>750)&&(dcfL<840))
		{
			PORTB|=(1<<PB2);
		}

		if ((dcfL>840)&&(dcfL<950)) //0
		{
			PORTB|=(1<<PB0);
		}
		
		if ((dcfL>1800)&&(dcfL<2300)) //Min.
		{
			PORTB|=(1<<PB3);
		}
Может кстати кто хорошую книгу по С посоветовать, где такие нюансы написаны? Я до этого искал, как правильно If пишеться, но именно такое не нашел.
Реклама
Эиком - электронные компоненты и радиодетали
Электрический кот
Аватара пользователя
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Сообщение Mishany »

Dcfl +=20; это как понять?
Может dcfl=dcfl+20;
Я синтаксис выдергивал и складывал в тетрадку из найденых в интернете рабочих программ с коментами, плюс есть отличия при использовании разных сред разработки
Последний раз редактировалось Mishany Сб авг 30, 2014 21:46:18, всего редактировалось 1 раз.
Реклама
Открыл глаза
Сообщения: 49
Зарегистрирован: Вс окт 06, 2013 17:15:02

Сообщение de1m »

Mishany писал(а):Dcfl +=20; это как понять?
Может dcfl=dcfl+20;
это то же самое и обозначает.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск

Сообщение Леонид Иванович »

Mishany писал(а):Синтаксис неправельный, скобок не хватает. Вот форма правильная: If ((a>b)&&(c<d)){}
Не нужны тут скобки. Приоритет операции && ниже, чем > и <.

Приоритет операций: http://ru.cppreference.com/w/cpp/langua ... precedence
Контактная информация:
Электрический кот
Аватара пользователя
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Сообщение Mishany »

У меня на аврстудии на такие записи ругался компилятор
Открыл глаза
Сообщения: 49
Зарегистрирован: Вс окт 06, 2013 17:15:02

Сообщение de1m »

Единственный момонт не понятный, это что иногда пропуск идёт
Изображение
Открыл глаза
Сообщения: 49
Зарегистрирован: Вс окт 06, 2013 17:15:02

Сообщение de1m »

Леонид Иванович писал(а): Не нужны тут скобки. Приоритет операции && ниже, чем > и <.
Да еслит так сделать, то тоже работает.

Код: Выделить всё

if (dcfL>750&&dcfL<840)
		{
			PORTB|=(1<<PB2);
		}

		if (dcfL>840&&dcfL<1000) //0
		{
			PORTB|=(1<<PB0);
		}
		
		if (dcfL>1800&&dcfL<2300) //Min.
		{
			PORTB|=(1<<PB3);
		}
Электрический кот
Аватара пользователя
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Сообщение Mishany »

Если dcfl в диапозоне 1000 - 1800 это норм?
Открыл глаза
Сообщения: 49
Зарегистрирован: Вс окт 06, 2013 17:15:02

Сообщение de1m »

Mishany писал(а):Если dcfl в диапозоне 1000 - 1800 это норм?
Это бывает, когда новая минута начинается, то есть при с 58-60 сигнал не понижается. Так что это нормально
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Mishany писал(а):Я синтаксис выдергивал и складывал в тетрадку из найденых в интернете рабочих программ с коментами, плюс есть отличия при использовании разных сред разработки
Есть стандарты языка, есть компиляторы, которые эти стандарты поддерживают. При чём тут среды разработки - непонятно.
Синтаксис Си прост как валенок. Может вам всё-таки книжку почитать? И вопросов +=20; это как понять? не будет.

de1m, где-то был косяк. Возможно тупая опечатка, копипаст, что угодно. Учитесь уже пользоваться отладкой. Даже если специальных инструментов нет - думайте логически, отключайте куски кода и методом исключения найдёте косяк. В этом коде на это потребуется пара минут, пост вы писали гораздо дольше.
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

Леонид Иванович писал(а):
Mishany писал(а):Синтаксис неправельный, скобок не хватает. Вот форма правильная: If ((a>b)&&(c<d)){}
Не нужны тут скобки. Приоритет операции && ниже, чем > и <.
Дело ещё и не только в приоритете... а ещё и в наглядности... в лучшем, однозначном, восприятии текста...

if ((a > b) && (c < d)){}
"Я не даю готовых решений, я заставляю думать!"(С)
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

HHIMERA, это уже стиль написания кода. Сложные выражения действительно лучше визуально делить. Но ведь претензии были к логике, а не к стилю.
Открыл глаза
Сообщения: 49
Зарегистрирован: Вс окт 06, 2013 17:15:02

Сообщение de1m »

В этом коде на это потребуется пара минут, пост вы писали гораздо дольше.
Ошибка была не в коде.

Вот такое

Код: Выделить всё

if (dcfL<860)
      {
         PORTB|=(1<<PB2);
      }
не работает, а вот так работает
if (dcfL>750&&dcfL<840)
{
PORTB|=(1<<PB2);
}
то есть я так понимаю, что надо было тупо с обоих сторон ограничеть.
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

de1m писал(а):шибка была не в коде.
... звёзды не так сошлись? :)))
Открыл глаза
Сообщения: 49
Зарегистрирован: Вс окт 06, 2013 17:15:02

Сообщение de1m »

ploop писал(а): ... звёзды не так сошлись? :)))
В первом случае я сказал, что если dcfL не больше 840. А во втором, ещё добавил, что и не меньше 760. Это помогло
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Только поправьте где-нибудь на больше или равно. А то в случае граничного значения ни одно условие не сработает.
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

ploop писал(а):Сложные выражения действительно лучше визуально делить. Но ведь претензии были к логике, а не к стилю.
Я как бы и не спорю... Но понятно написанный код облегчает понимание логики... а каша без пробелов, скобок и отступов просто замыливает глаз...
"Я не даю готовых решений, я заставляю думать!"(С)
Ответить

Вернуться в «AVR»