Перейти к содержанию

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


Гость химик

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

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

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

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

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

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

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

  • Ответов 72
  • Создана
  • Последний ответ

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

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

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

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

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

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

Однако, чтобы мы вели речь об одном и том же, желательно выложить весть проект целиком, вот в таком виде 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, а там все совсем подругому.

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

Опять могу поспорить, что ошибка не в ,,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
Ссылка на комментарий
Поделиться на другие сайты

Опять могу поспорить, что ошибка не в ,,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
Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

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

 

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

Изменено пользователем oleg___g
Ссылка на комментарий
Поделиться на другие сайты

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

 

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

 

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

 

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

Изменено пользователем borman
Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

 

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

 

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

 

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

 

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

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

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

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

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

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...