Перейти к содержимому
Форум журнала практической электроники «Датагор»

Оригинал микро-ПК Raspberry Pi 3 Model B+ (Broadcom 1.4GHz quad-core 64 bit processor, Wifi, Bluetooth, USB)

Офигенная миниатюрная рация на литии BaoFeng UV-5R, 5W, 5-15 км! Охота, поход, торговый центр и т.п.

TrueRMS мультиметр UNI-T UT139A с автодиапазонами

Паяльнник 80W с терморегулятором и LCD-дисплеем, популярные жала серии 900M
Гость химик

Помогите пожалуйста в написании исходного текста...

Рекомендованные сообщения

Гость химик

Доброго времени уважаемые датагорцы. Вот закончил книгу ,,CodeVisionAVR - пособие для начинающих,, и теперь пытаюсь создать свой проект. Изучать программирование начал благодаря большому желанию создать именно этот проект. Схему выложу чуть попозже,

пока не успеваю дорисовать в SPlane.

Начал писать программу с функции часов на DS1307, и первый камень: при компиляции две ошибки. Как я понял это ,, недостаточно аргументов при вызове функции чтения времени,,.

Подскажите что я не вписал?

P.S. код вставить не могу, даю архив.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Гость hsl

Если я правильно понял, ошибка в том что нужно читать часы, минуты и секунды, а ты читаешь только часы и минуты, попробуй так

unsigned char hour, minute, sec;
rtc_get_time  ( &hour,&minute,&sec); // читаем время из RTC DS1307

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Гость химик
Если я правильно понял, ошибка в том что нужно читать часы, минуты и секунды, а ты читаешь только часы и минуты, попробуй так

unsigned char hour, minute, sec;
rtc_get_time  ( &hour,&minute,&sec); // читаем время из RTC DS1307

Уже пробовал, ничего не меняется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Гость hsl
Уже пробовал, ничего не меняется.

Меняется, и эта строка ошибки уже не выдает.

Однако, чтобы мы вели речь об одном и том же, желательно выложить весть проект целиком, вот в таком виде time.rar

Потому как, чтобы проверить я создал новый проект и вставил в него ту часть кода, что была в архиве, и да, вылезло 2 ошибки... Если ввести "rtc_get_time (" то выводится подсказка, как раз о том что там присутствует 3 параметра, и после добавления недостающего параметра строка получения времени компилится без ошибок. После этого ошибку выдает уже следующая строка в которой выводится информация на дисплей, но это уже следующий вопрос, сначала нужно разобратся с первым, а разбираться лучше видя весь оригинальный проект, поскольку в чистом виде строка получения времени работает нормально.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Гость химик
Меняется, и эта строка ошибки уже не выдает.

Однако, чтобы мы вели речь об одном и том же, желательно выложить весть проект целиком, вот в таком виде time.rar

Потому как, чтобы проверить я создал новый проект и вставил в него ту часть кода, что была в архиве, и да, вылезло 2 ошибки... Если ввести "rtc_get_time (" то выводится подсказка, как раз о том что там присутствует 3 параметра, и после добавления недостающего параметра строка получения времени компилится без ошибок. После этого ошибку выдает уже следующая строка в которой выводится информация на дисплей, но это уже следующий вопрос, сначала нужно разобратся с первым, а разбираться лучше видя весь оригинальный проект, поскольку в чистом виде строка получения времени работает нормально.

Опять могу поспорить, что ошибка не в ,,char sec,,. Вот внизу все файлы исходника без секунд. Теперь ошибка в функции void main(void) и в wile. Если поставить wile после строки delay_ms(100); то ошибка становится не в wile(1);, a в i2c_init().

По моему я не так вставляю инициализацию. Если у вас есть какие нибудь исходники с функциями i2c и LCD скиньте посмотреть, а то я понаходил только из под winAVR, а там все совсем подругому.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Гость hsl
Опять могу поспорить, что ошибка не в ,,char sec,,. Вот внизу все файлы исходника без секунд. Теперь ошибка в функции void main(void) и в wile. Если поставить wile после строки delay_ms(100); то ошибка становится не в wile(1);, a в i2c_init().

По моему я не так вставляю инициализацию. Если у вас есть какие нибудь исходники с функциями i2c и LCD скиньте посмотреть, а то я понаходил только из под winAVR, а там все совсем подругому.

 

И так по порядку, немного поправил код и почти все заработало, поправленный проект в архиве Home_Sinema.rar

 

А теперь пройдемся по тексту и посмотрим ошибки, комментарии буду выделять вот так <--------------

 

/*****************************************************
This program was produced by the
CodeWizardAVR V2.04.4a Advanced
Automatic Program Generator
© Copyright 1998-2009 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : Home Sinema
Version : 0.1
Date	: 05.09.2010
Author  : Sergey Romanov (Biyon_DeGreyv)
Company : Home
Comments: 
Проект управляющей части 6 канального
регулятора громкости.
( Функции часов, термометра и управление
блоками звуковоспроизводящего
тракта )


Chip type			   : ATmega16
Program type			: Application
AVR Core Clock frequency: 8,000000 MHz
Memory model			: Small
External RAM size	   : 0
Data Stack size		 : 256
*****************************************************/

#include <mega16.h>
#include <stdio.h>
#include <delay.h> // <---------- это нужно чтобы работала строка delay_ms(100);
#asm
//   .equ __i2c_port=0x15 жЗЩКЕС  <-------------------- Так было
  .equ __i2c_port=0x15;PORTC // <-------------------- Так должно быть
  .equ __sda_bit=1
  .equ __scl_bit=0
#endasm
#include <i2c.h>
#include <ds1307.h>   
// Alphanumeric LCD Module functions
#asm
  .equ __lcd_port=0x1B;PORTA
#endasm
#include <lcd.h>

// Declare your global variables here
unsigned char lcd_buffer [33]; //буфер LCD
unsigned char hour,min,sec; //<--------- здесь в конце строки не было точки с запятой --->;

void main (void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
// State7=T State6=T State5=T State4=1 State3=1 State2=1 State1=0 State0=0 
PORTB=0x1C;
DDRB=0x1F;

// Port C initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=In Func0=In 
// State7=1 State6=1 State5=1 State4=1 State3=0 State2=0 State1=T State0=T 
PORTC=0xF0;
DDRC=0xFC;

// Port D initialization
// Func7=In Func6=Out Func5=Out Func4=Out Func3=In Func2=In Func1=Out Func0=In 
// State7=T State6=1 State5=0 State4=0 State3=T State2=T State1=1 State0=T 
PORTD=0x42;
DDRD=0x72;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

//}  <------------------------- закрывается функция main, слишком рано, это должно быть в самом конце

i2c_init();
rtc_init(0,0,0);
lcd_init(16); // LCD module initialization

//rtc_get_time (unsigned char*hour,unsigned char*min,unsigned char*sec);//<--------------------тут //соответственно нужно ввести переменные
//все что до этого места выполняется один раз при старте, поэтому все дальнейшие команды 
//я полагаю нужно поместить в бесконечный цикл while, что и сделано ниже
//

while (1)
  {	  
	rtc_get_time (&hour,&min,&sec);	  
	sprintf( lcd_buffer,"%i",hour); 
	lcd_clear();
	lcd_puts(lcd_buffer);
	delay_ms(100);
  };
}

 

Еще пару слов про

sprintf( lcd_buffer,"%i",hour);

тут моих знаний маловато, с одним параметром работает, как добавить еще один пока затрудняюсь сказать, но как вариант складывать hour и min в отдельную переменную и уже ее как один параметр отправлять в буфер.

Примеров сейчас под рукой нету, вечером дома посмотрю что нибудь.

Изменено пользователем hsl

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Гость borman
Опять могу поспорить, что ошибка не в ,,char sec,,. Вот внизу все файлы исходника без секунд. Теперь ошибка в функции void main(void) и в wile. Если поставить wile после строки delay_ms(100); то ошибка становится не в wile(1);, a в i2c_init().

По моему я не так вставляю инициализацию. Если у вас есть какие нибудь исходники с функциями i2c и LCD скиньте посмотреть, а то я понаходил только из под winAVR, а там все совсем подругому.

 

Ошибка в синтаксисе: не wile, а правильно while.

 

Также проверь парность открывающихся/закрывающихся операторных скобок { } и их правильность их вложенности, а также наличия символа "точка с запятой" ; в концах операторов и после скобок. Например, запутавшись в скобках, мог слишком рано закончить функцию main.

 

Си очень чувствителен к ; - как к отсутствию где надо, так и к наличию где не надо, хотя в CodeVision он относится к "лишним" точка-с-запятой лояльно, но к недостающим строг.

 

Неправильно расставленные скобки блоков { } могут привести к неправильно работающему алгоритму, даже если с точки зрения формального синтаксиса все хорошо. Учись сразу писать исходник с отступами, когда каждый вложенный блок сдвигается вправо на 2-4 символа относительно окружения. Помогает как не допустить ошибок, так и сразу видеть допущенные со вложенностью блоков/скобками { }.

 

Пользуйся тем, что когда подводишь курсор под фигурную скобку, среда CodeVision подсвечивает ее и парную ей - помогает разобраться с косяками скобок.

Изменено пользователем borman

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Гость oleg___g
Еще пару слов про

sprintf( lcd_buffer,"%i",hour);

с одним параметром работает, как добавить еще один пока затрудняюсь сказать

sprintf ( lcd_buffer, "%i %i %i", hour, min, sec );

Естественно в качестве разделителя можно использовать не только пробел, но и другие символы

 

PS: Полный синтаксис в справке к codevision в разделе "Standard C Input/Output Functions"

Изменено пользователем oleg___g

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Гость borman

Еще... у тебя идет непрерывный опрос датчика и непрерывный вывод на дисплей. При тактовой 8 Мгц оно будет происходить более 10000 тыс раз в секунду. Дисплей имеет свою внутреннюю "кадровую" и "строчную" частоты, которые заведомо меньше килогерца. И смысл обновлять буфер дисплея с частотой в десятки и сотни раз большими? Тем более у тебя информация на дисплее меняется вообще раз в секунду.

 

Совет. Все инициализации выполнить ДО бесконечного цикла while(1), там же инициализировать wathdog timer, в сам цикл поместить сброс сторожевого таймера и парочку nop. Команды опроса часов и вывода на дисплей из цикла убрать.

 

Активизировать один из таймеров, установить прерывание по переполнению. Делитель и число, загружаемое в счетчик таймера подобрать такими, чтобы прерывание срабатывало 1-20 раз в секунду. Делается до цикла while. Перед самым циклом разрешить прерывания.

 

Команды опроса часов и вывода на дисплей поместить в обработчик прерывания.

Изменено пользователем borman

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Гость hsl
Еще... у тебя идет непрерывный опрос датчика и непрерывный вывод на дисплей. При тактовой 8 Мгц оно будет происходить более 10000 тыс раз в секунду...

Не совсем понятно к кому этот пост, в исходном коде в цикле нет ничего, значит это в мой адрес, посему прокоментирую. Датчик, стоп какой датчик? У нас часы реального времени, но тем не менее опрос должен быть в цикле, вывод на дисплей должен быть в цикле, то что слишком часто в данном случае, это уже другой вопрос, задача была для начала исправить код, чтоб компилился без ошибок, но тем не менее в цикле для этого все таки стоит задержка, так что для проверки все правильно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Гость borman
Не совсем понятно к кому этот пост, в исходном коде в цикле нет ничего, значит это в мой адрес, посему прокоментирую. Датчик, стоп какой датчик? У нас часы реального времени, но тем не менее опрос должен быть в цикле, вывод на дисплей должен быть в цикле, то что слишком часто в данном случае, это уже другой вопрос, задача была для начала исправить код, чтоб компилился без ошибок, но тем не менее в цикле для этого все таки стоит задержка, так что для проверки все правильно.

 

Вообще-то пост к Химику... как совет по более оптимальному построению программы.

 

Ну чем RTC отличается от датчика температуры? Только характером пересылаемых данных. Собственно сам RTC и является датчиком времени :smile:

 

Вызов прерываний позволяет периодически выполняемые действия проводить в как раз строго периодически, позволив процессору в остальное время заниматься другими полезными делами, а не зависать, обжевывая delay.

 

Хотя как попытка написать фрагмент кода, чтобы обкатать обмен с RTC и вывод на LCD можно и так. А вот в релизе ПМСМ при обработке опроса и вывода лучше озаботиться прерываниями, тем или другим способом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Гость hsl
Вообще-то пост к Химику... как совет по более оптимальному построению программы...

Ну тогда помогайте, не буду сбивать с толку своим дилетантским подходом)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

︽ Наверх страницы ︽
×
×
  • Создать...