Гость химик Опубликовано 3 Сентября, 2010 в 19:43 Жалоба Поделиться Опубликовано 3 Сентября, 2010 в 19:43 Доброго времени уважаемые датагорцы. Вот закончил книгу ,,CodeVisionAVR - пособие для начинающих,, и теперь пытаюсь создать свой проект. Изучать программирование начал благодаря большому желанию создать именно этот проект. Схему выложу чуть попозже, пока не успеваю дорисовать в SPlane. Начал писать программу с функции часов на DS1307, и первый камень: при компиляции две ошибки. Как я понял это ,, недостаточно аргументов при вызове функции чтения времени,,. Подскажите что я не вписал? P.S. код вставить не могу, даю архив. Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость hsl Опубликовано 3 Сентября, 2010 в 20:23 Жалоба Поделиться Опубликовано 3 Сентября, 2010 в 20:23 Если я правильно понял, ошибка в том что нужно читать часы, минуты и секунды, а ты читаешь только часы и минуты, попробуй так unsigned char hour, minute, sec; rtc_get_time ( &hour,&minute,&sec); // читаем время из RTC DS1307 Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость химик Опубликовано 3 Сентября, 2010 в 20:37 Жалоба Поделиться Опубликовано 3 Сентября, 2010 в 20:37 Если я правильно понял, ошибка в том что нужно читать часы, минуты и секунды, а ты читаешь только часы и минуты, попробуй так unsigned char hour, minute, sec; rtc_get_time ( &hour,&minute,&sec); // читаем время из RTC DS1307 Уже пробовал, ничего не меняется. Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость hsl Опубликовано 3 Сентября, 2010 в 23:19 Жалоба Поделиться Опубликовано 3 Сентября, 2010 в 23:19 Уже пробовал, ничего не меняется. Меняется, и эта строка ошибки уже не выдает. Однако, чтобы мы вели речь об одном и том же, желательно выложить весть проект целиком, вот в таком виде time.rar Потому как, чтобы проверить я создал новый проект и вставил в него ту часть кода, что была в архиве, и да, вылезло 2 ошибки... Если ввести "rtc_get_time (" то выводится подсказка, как раз о том что там присутствует 3 параметра, и после добавления недостающего параметра строка получения времени компилится без ошибок. После этого ошибку выдает уже следующая строка в которой выводится информация на дисплей, но это уже следующий вопрос, сначала нужно разобратся с первым, а разбираться лучше видя весь оригинальный проект, поскольку в чистом виде строка получения времени работает нормально. Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость химик Опубликовано 6 Сентября, 2010 в 09:40 Жалоба Поделиться Опубликовано 6 Сентября, 2010 в 09:40 Меняется, и эта строка ошибки уже не выдает.Однако, чтобы мы вели речь об одном и том же, желательно выложить весть проект целиком, вот в таком виде 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 Опубликовано 6 Сентября, 2010 в 12:43 Жалоба Поделиться Опубликовано 6 Сентября, 2010 в 12:43 (изменено) Опять могу поспорить, что ошибка не в ,,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 в отдельную переменную и уже ее как один параметр отправлять в буфер. Примеров сейчас под рукой нету, вечером дома посмотрю что нибудь. Изменено 6 Сентября, 2010 в 12:45 пользователем hsl Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость borman Опубликовано 6 Сентября, 2010 в 13:23 Жалоба Поделиться Опубликовано 6 Сентября, 2010 в 13:23 (изменено) Опять могу поспорить, что ошибка не в ,,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 подсвечивает ее и парную ей - помогает разобраться с косяками скобок. Изменено 6 Сентября, 2010 в 13:28 пользователем borman Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость oleg___g Опубликовано 6 Сентября, 2010 в 13:31 Жалоба Поделиться Опубликовано 6 Сентября, 2010 в 13:31 (изменено) Еще пару слов про sprintf( lcd_buffer,"%i",hour); с одним параметром работает, как добавить еще один пока затрудняюсь сказать sprintf ( lcd_buffer, "%i %i %i", hour, min, sec );Естественно в качестве разделителя можно использовать не только пробел, но и другие символы PS: Полный синтаксис в справке к codevision в разделе "Standard C Input/Output Functions" Изменено 6 Сентября, 2010 в 13:37 пользователем oleg___g Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость borman Опубликовано 6 Сентября, 2010 в 14:24 Жалоба Поделиться Опубликовано 6 Сентября, 2010 в 14:24 (изменено) Еще... у тебя идет непрерывный опрос датчика и непрерывный вывод на дисплей. При тактовой 8 Мгц оно будет происходить более 10000 тыс раз в секунду. Дисплей имеет свою внутреннюю "кадровую" и "строчную" частоты, которые заведомо меньше килогерца. И смысл обновлять буфер дисплея с частотой в десятки и сотни раз большими? Тем более у тебя информация на дисплее меняется вообще раз в секунду. Совет. Все инициализации выполнить ДО бесконечного цикла while(1), там же инициализировать wathdog timer, в сам цикл поместить сброс сторожевого таймера и парочку nop. Команды опроса часов и вывода на дисплей из цикла убрать. Активизировать один из таймеров, установить прерывание по переполнению. Делитель и число, загружаемое в счетчик таймера подобрать такими, чтобы прерывание срабатывало 1-20 раз в секунду. Делается до цикла while. Перед самым циклом разрешить прерывания. Команды опроса часов и вывода на дисплей поместить в обработчик прерывания. Изменено 6 Сентября, 2010 в 14:25 пользователем borman Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость hsl Опубликовано 6 Сентября, 2010 в 15:22 Жалоба Поделиться Опубликовано 6 Сентября, 2010 в 15:22 Еще... у тебя идет непрерывный опрос датчика и непрерывный вывод на дисплей. При тактовой 8 Мгц оно будет происходить более 10000 тыс раз в секунду... Не совсем понятно к кому этот пост, в исходном коде в цикле нет ничего, значит это в мой адрес, посему прокоментирую. Датчик, стоп какой датчик? У нас часы реального времени, но тем не менее опрос должен быть в цикле, вывод на дисплей должен быть в цикле, то что слишком часто в данном случае, это уже другой вопрос, задача была для начала исправить код, чтоб компилился без ошибок, но тем не менее в цикле для этого все таки стоит задержка, так что для проверки все правильно. Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость borman Опубликовано 6 Сентября, 2010 в 16:27 Жалоба Поделиться Опубликовано 6 Сентября, 2010 в 16:27 Не совсем понятно к кому этот пост, в исходном коде в цикле нет ничего, значит это в мой адрес, посему прокоментирую. Датчик, стоп какой датчик? У нас часы реального времени, но тем не менее опрос должен быть в цикле, вывод на дисплей должен быть в цикле, то что слишком часто в данном случае, это уже другой вопрос, задача была для начала исправить код, чтоб компилился без ошибок, но тем не менее в цикле для этого все таки стоит задержка, так что для проверки все правильно. Вообще-то пост к Химику... как совет по более оптимальному построению программы. Ну чем RTC отличается от датчика температуры? Только характером пересылаемых данных. Собственно сам RTC и является датчиком времени :smile: Вызов прерываний позволяет периодически выполняемые действия проводить в как раз строго периодически, позволив процессору в остальное время заниматься другими полезными делами, а не зависать, обжевывая delay. Хотя как попытка написать фрагмент кода, чтобы обкатать обмен с RTC и вывод на LCD можно и так. А вот в релизе ПМСМ при обработке опроса и вывода лучше озаботиться прерываниями, тем или другим способом. Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость hsl Опубликовано 6 Сентября, 2010 в 17:07 Жалоба Поделиться Опубликовано 6 Сентября, 2010 в 17:07 Вообще-то пост к Химику... как совет по более оптимальному построению программы... Ну тогда помогайте, не буду сбивать с толку своим дилетантским подходом) Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти