Страница 234 из 421
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс янв 20, 2013 09:05:04
kotriks
как в юарте можно сделать чтобы выбирать меню не цифрой а написанием слова или определённых набор букв вместо 1 написать erase не прокатывает
Код: Выделить всё
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSR0A;
data=UDR0;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) {
WDTCSR = (1<<WDCE) | (1<<WDE);
/* Выкл. сторожевого таймера */
WDTCSR = 0x00;
if (data=='1') Erase();
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс янв 20, 2013 09:54:29
vitalik_1984
Для того, чтобы писать словами нужно принимать строки в виде массива и анализировать их
Вот
пример на си++ для поиска строк.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс янв 20, 2013 23:11:16
Marchello
"vitalik_1984" Спасибо за подсказку! Снял галочку с "Include I/O registtrs Bits Definitions" и отладчик перестал ругаться! Но программка все равно не хочет работать! Дату и время не отображает!
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 21, 2013 11:19:43
kotriks
vitalik_1984 писал(а):Для того, чтобы писать словами нужно принимать строки в виде массива и анализировать их
Вот
пример на си++ для поиска строк.
ничего не понял

Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 21, 2013 11:41:39
urry
Прерывание должно быть максимально коротким, в нем не должно быть вызова функций, на то оно и прерывание - максимум,что там можно - проверить переполнение буфера, поставить флаг, "очередной символ принят" и отвалиться.
В основном цикле проверяйте флаг, если он взведен, гасите и проверяйте принятый буфер.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 21, 2013 21:19:36
Marchello
Вот код часиков! Но при запуске первые полторы минуты даты отображаются нормально, а потом какая то ерунда!
#include <mega16.h>
// I2C Bus functions
#asm
.equ __i2c_port=0x15 ;PORTC
.equ __sda_bit=1
.equ __scl_bit=0
#endasm
#include <i2c.h>
// DS1307 Real Time Clock functions
#include <ds1307.h>
#asm
.equ __lcd_port=0x12 ;PORTD
#endasm
#include <lcd.h>
#include <delay.h>
#include <stdio.h>
#include <bcd.h>
unsigned char lcd_buffer [33];
unsigned char hour, min, sec; // переменные - часы, минуты и секунды
unsigned char day, month, year; // переменные - дни, месяцы и года
void main(void)
{
lcd_init(20);
// sprintf(lcd_buffer,"Test DS1307\n Real time clock");
// lcd_puts(lcd_buffer);
// delay_ms(50);
i2c_init();
rtc_init(0,1,0);
rtc_write(0,0);
lcd_clear();
while (1)
{
rtc_get_time(&hour, &min, &sec); //считываем время
rtc_get_date(&day, &month, &year); //считываем дату
sprintf(lcd_buffer,"Time:%u.%u.%u", hour, min, sec);
// lcd_clear();
lcd_gotoxy(0,0);
lcd_puts(lcd_buffer);
delay_ms(50);
sprintf(lcd_buffer,"Date:%u.%u.%u", day, month, year);
//lcd_clear();
lcd_gotoxy(0,1);
lcd_puts(lcd_buffer);
delay_ms(50);
};
}
Подскажите в чем косяк! Работу часиков Эмулирую в Протеусе!
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 21, 2013 21:39:19
U235
Для DS1307 функция получения даты имеет четыре параметра. Может в этом проблема.
Код: Выделить всё
void rtc_get_date(unsigned char *week_day, unsigned char *day, unsigned char *month, unsigned char *year);
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт янв 22, 2013 17:28:32
Marchello
Подскажите почему так тупят часики?! Выкладываю исходник + файл в Протеусе! В посте выше я спрашивал почему коряво отображаются время и дата, ошибку подправил, в Протеусе был косяк, резисторы заменил на Pullup и все заработало, но часы тем не менее жутко отстают от реального времени за два часа работы отставание чуть ли не на 40 минут!
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт янв 22, 2013 17:39:53
mr4ester
Та может это протеус тупит? В железе собирать не пробовали?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт янв 22, 2013 17:46:02
Marchello
Пока не пробовал! Пытаюсь весь проект смоделировать в Протеусе, а потом уже буду железом обрастать! Задумок много, но увы знаний программирования очень скудны, так что до железа пока далековато!
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт янв 22, 2013 17:49:19
Marchello
А может быть проблема в том что в исходнике частота МК не правильно установлена?! Или это будет известно после прошивки МК? Я если честно не совсем понял как частоту кварца 32768 совместить с частотой МК чтобы импульс был частотой в 1Гц!
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт янв 22, 2013 18:27:11
mr4ester
дык от кварца 32768 работает микросхема часов, а микроконтроллер работает от своего тактового генератора, их никак синхронизировать не надо, от частоты микроконтроллера зависит сколько будет выполняться операций в секунду
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср янв 23, 2013 02:11:00
Apparatchik
Протеус по ряде причин работает медленее чем реальное время, тоесть секунда в нем длится дольше чем реальная и чем слабее комп тем дольше. Протеус это не панацея точность в нем сверять - это бред! он лишь иногда полезен при отладке в простейших схемах (например плавную смену цифр он уже не покажет).
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср янв 23, 2013 04:32:55
unalex
kotriks писал(а):не цифрой а написанием слова
Код: Выделить всё
enum myNUMBERS{ZERO, ONE, TWO};
unsigned int a = 5, result;
result = a + TWO // ответ 7
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср янв 23, 2013 13:02:27
Marchello
Уважаемые Коты, подскажите как объединить в один проект две самостоятельные программы! Обе проги рабочие, в Протеусе эмулируются без проблем. Одна программа - таймер на DS1307. вторая термометр на DS18b20. МК - Atmega16. Пытался тупо исходник из одной вставить во второй исходник (вместе с со всеми #include, #define. #asm) менял void main (void), но отладчик в CVAVR ругается! Хотя по отдельности обе программки проходят процедуру отладки без проблем!
Вот исходники обеих программ:
Таймер DS1307
Спойлер
#include <mega16.h>
#asm
.equ __i2c_port=0x15; PORTC
.equ __sda_bit=1
.equ __scl_bit=0
#endasm
#include <i2c.h>
#include <ds1307.h>
#asm
.equ __lcd_port=0x12; PORTD
#endasm
#include <lcd.h>
#include <delay.h>
#include <stdio.h>
unsigned char lcd_buffer [33];
unsigned char hour, min, sec; // переменные - часы, минуты и секунды
unsigned char day, month, year; // переменные - дни, месяцы и года
void main(void)
{
lcd_init(20);
sprintf(lcd_buffer,"Test DS1307\n Real time clock");
lcd_puts(lcd_buffer);
delay_ms(50);
i2c_init();
rtc_init(0,0,0);
rtc_write(0,0);
lcd_clear();
while (1)
{
rtc_get_time(&hour, &min, &sec); //считываем время
rtc_get_date(&day, &month, &year); //считываем дату
sprintf(lcd_buffer,"Time:%u%u:%u%u:%u%u",hour/10,hour%10,min/10,min%10,sec/10,sec%10);
lcd_gotoxy(0,0);
lcd_puts(lcd_buffer);
sprintf(lcd_buffer,"Date:%u%u:%u%u:%u%u",day/10,day%10,month/10,month%10,year/10,year%10);
lcd_gotoxy(0,1);
lcd_puts(lcd_buffer);
}
}
И термометр DS18b20
#include <mega16.h>
#asm
.equ __w1_port=0x12 ;PORTD
.equ __w1_bit=3
#endasm
#include <1wire.h>
#include <ds18b20.h>
#include <delay.h>
#include <stdio.h>
#define MAX_DS18B20 8
unsigned char ds18b20_devices;
unsigned char ds18b20_rom_codes[MAX_DS18B20][9];
#asm
.equ __lcd_port=0x12 ;PORTD
#endasm
#include <lcd.h>
#include <stdio.h>
float temper;
int temper_int,temper_fl,min=0;
unsigned long int temper_t;
unsigned char lcd_buffer[33];
void temperature(void) // функция по работе с термо-датчиком
{
temper=ds18b20_temperature(&ds18b20_rom_codes[0][0]);
temper_int=temper;
if(temper_int>1000) // при отрицательной температуре
{
temper_fl=(temper-temper_int)*10;
temper_t=(long)temper_int*10;
temper_t=temper_t+temper_fl;
temper_int=40960-temper_t;
min=1;
}else // при положительной
{
min=0;
temper_fl=(temper-temper_int)*10;
temper_int=(temper_int*10)+temper_fl;
}
}
void main(void)
{
// Determine the number of DS1820 devices
// connected to the 1 Wire bus
ds18b20_devices=w1_search(0xf0,ds18b20_rom_codes);
ds18b20_init(0,-35,35,DS18B20_12BIT_RES); // переключения термометра в 12 битный режим
// LCD module initialization
lcd_init(20);
while (1)
{
// Place your code here
delay_ms(500);
temperature(); // вызываем функцию температуры
lcd_clear(); // очищаем LCD
if(min==1)
{
sprintf(lcd_buffer,"t=-%i.%d\xdfC",temper_int/10,temper_int%10); //вывод отрицательной температуры
}else
{
sprintf(lcd_buffer,"t=+%i.%d\xdfC",temper_int/10,temper_int%10); // вывод положительной
}
lcd_gotoxy(0,3);
lcd_puts(lcd_buffer); // вывод на дисплей
};
}
Выручайте, а то застопорился я как то!
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср янв 23, 2013 13:05:30
Apparatchik
Ну естественно он будет ругатся, самое первое это две функции main. Просто так "скрестить" две проги невыйдет, нада чуть и мозгами пошевелить.
Проще заново написать чем так мучится.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср янв 23, 2013 13:14:20
Marchello
main во второй проге (Таймер) при слиянии я меняю на void timer (void)? а отладчик ругается на переменные "unsigned char hour, min, sec; // переменные - часы, минуты и секунды" и соответственно на команду "rtc_get_time(&hour, &min, &sec); //считываем время"
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср янв 23, 2013 13:21:33
Apparatchik
Marchello писал(а):main во второй проге (Таймер) при слиянии я меняю на void timer (void)? а отладчик ругается на переменные "unsigned char hour, min, sec; // переменные - часы, минуты и секунды" и соответственно на команду "rtc_get_time(&hour, &min, &sec); //считываем время"
Ну поменять имя функции этого мало, её хотябы нужно гденибудь вызвать чтоб она заработала, будет много ошибок так, как синтаксис нарушен. Нужно не переименовывать а попытатся объеденить, инициализацию вместе, глобальные переменные наверх и т.д. Судя по вашему посту Вам бы лучше с нуля заодно и поучитесь, а мы вам поможем.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср янв 23, 2013 13:32:45
Marchello
Я бы с удовольствием! К тому же если вы мне реально поможете! Ну в таком случае давайте начнем!
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср янв 23, 2013 13:36:05
Apparatchik
Marchello писал(а):Я бы с удовольствием! К тому же если вы мне реально поможете! Ну в таком случае давайте начнем!
написал в личку