CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
kotriks
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

Re: CodeVision AVR в вопросах и ответах

Сообщение 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();
 
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение vitalik_1984 »

Для того, чтобы писать словами нужно принимать строки в виде массива и анализировать их
Вот пример на си++ для поиска строк.
Marchello
Встал на лапы
Сообщения: 114
Зарегистрирован: Чт ноя 24, 2011 12:39:13

Re: CodeVision AVR в вопросах и ответах

Сообщение Marchello »

"vitalik_1984" Спасибо за подсказку! Снял галочку с "Include I/O registtrs Bits Definitions" и отладчик перестал ругаться! Но программка все равно не хочет работать! Дату и время не отображает!
kotriks
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

Re: CodeVision AVR в вопросах и ответах

Сообщение kotriks »

vitalik_1984 писал(а):Для того, чтобы писать словами нужно принимать строки в виде массива и анализировать их
Вот пример на си++ для поиска строк.

ничего не понял :shock:
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение urry »

Прерывание должно быть максимально коротким, в нем не должно быть вызова функций, на то оно и прерывание - максимум,что там можно - проверить переполнение буфера, поставить флаг, "очередной символ принят" и отвалиться.
В основном цикле проверяйте флаг, если он взведен, гасите и проверяйте принятый буфер.
Marchello
Встал на лапы
Сообщения: 114
Зарегистрирован: Чт ноя 24, 2011 12:39:13

Re: CodeVision AVR в вопросах и ответах

Сообщение 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);

};

}

Подскажите в чем косяк! Работу часиков Эмулирую в Протеусе!
Вложения
Ерунда с датами.JPG
(246.25 КБ) 430 скачиваний
Аватара пользователя
U235
Встал на лапы
Сообщения: 135
Зарегистрирован: Вт фев 21, 2012 20:42:26
Откуда: Санкт-Петербург, Россия, Земля

Re: CodeVision AVR в вопросах и ответах

Сообщение U235 »

Для DS1307 функция получения даты имеет четыре параметра. Может в этом проблема.

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

void rtc_get_date(unsigned char *week_day, unsigned char *day, unsigned char *month, unsigned char *year);
А из наших труб идет необычный дым. Стой! Опасная зона! Работа мозга!...
Marchello
Встал на лапы
Сообщения: 114
Зарегистрирован: Чт ноя 24, 2011 12:39:13

Re: CodeVision AVR в вопросах и ответах

Сообщение Marchello »

Подскажите почему так тупят часики?! Выкладываю исходник + файл в Протеусе! В посте выше я спрашивал почему коряво отображаются время и дата, ошибку подправил, в Протеусе был косяк, резисторы заменил на Pullup и все заработало, но часы тем не менее жутко отстают от реального времени за два часа работы отставание чуть ли не на 40 минут!
Вложения
Пробуем часы.rar
(112.33 КБ) 163 скачивания
Аватара пользователя
mr4ester
Держит паяльник хвостом
Сообщения: 900
Зарегистрирован: Чт авг 27, 2009 20:09:01
Откуда: Приднестровье г.Бендеры
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение mr4ester »

Та может это протеус тупит? В железе собирать не пробовали?
Работа избавляет нас от трех великих зол: скуки, порока, нужды. (Вольтер)
Marchello
Встал на лапы
Сообщения: 114
Зарегистрирован: Чт ноя 24, 2011 12:39:13

Re: CodeVision AVR в вопросах и ответах

Сообщение Marchello »

Пока не пробовал! Пытаюсь весь проект смоделировать в Протеусе, а потом уже буду железом обрастать! Задумок много, но увы знаний программирования очень скудны, так что до железа пока далековато!
Marchello
Встал на лапы
Сообщения: 114
Зарегистрирован: Чт ноя 24, 2011 12:39:13

Re: CodeVision AVR в вопросах и ответах

Сообщение Marchello »

А может быть проблема в том что в исходнике частота МК не правильно установлена?! Или это будет известно после прошивки МК? Я если честно не совсем понял как частоту кварца 32768 совместить с частотой МК чтобы импульс был частотой в 1Гц!
Аватара пользователя
mr4ester
Держит паяльник хвостом
Сообщения: 900
Зарегистрирован: Чт авг 27, 2009 20:09:01
Откуда: Приднестровье г.Бендеры
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение mr4ester »

дык от кварца 32768 работает микросхема часов, а микроконтроллер работает от своего тактового генератора, их никак синхронизировать не надо, от частоты микроконтроллера зависит сколько будет выполняться операций в секунду
Работа избавляет нас от трех великих зол: скуки, порока, нужды. (Вольтер)
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

Re: CodeVision AVR в вопросах и ответах

Сообщение Apparatchik »

Протеус по ряде причин работает медленее чем реальное время, тоесть секунда в нем длится дольше чем реальная и чем слабее комп тем дольше. Протеус это не панацея точность в нем сверять - это бред! он лишь иногда полезен при отладке в простейших схемах (например плавную смену цифр он уже не покажет).
«И всё-таки она вертится!»
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Re: CodeVision AVR в вопросах и ответах

Сообщение unalex »

kotriks писал(а):не цифрой а написанием слова


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

enum myNUMBERS{ZERO, ONE, TWO};

unsigned int a = 5, result;

result = a + TWO // ответ 7
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Marchello
Встал на лапы
Сообщения: 114
Зарегистрирован: Чт ноя 24, 2011 12:39:13

Re: CodeVision AVR в вопросах и ответах

Сообщение 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); // вывод на дисплей
};
}

Выручайте, а то застопорился я как то!
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

Re: CodeVision AVR в вопросах и ответах

Сообщение Apparatchik »

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

Проще заново написать чем так мучится.
«И всё-таки она вертится!»
Marchello
Встал на лапы
Сообщения: 114
Зарегистрирован: Чт ноя 24, 2011 12:39:13

Re: CodeVision AVR в вопросах и ответах

Сообщение Marchello »

main во второй проге (Таймер) при слиянии я меняю на void timer (void)? а отладчик ругается на переменные "unsigned char hour, min, sec; // переменные - часы, минуты и секунды" и соответственно на команду "rtc_get_time(&hour, &min, &sec); //считываем время"
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

Re: CodeVision AVR в вопросах и ответах

Сообщение Apparatchik »

Marchello писал(а):main во второй проге (Таймер) при слиянии я меняю на void timer (void)? а отладчик ругается на переменные "unsigned char hour, min, sec; // переменные - часы, минуты и секунды" и соответственно на команду "rtc_get_time(&hour, &min, &sec); //считываем время"

Ну поменять имя функции этого мало, её хотябы нужно гденибудь вызвать чтоб она заработала, будет много ошибок так, как синтаксис нарушен. Нужно не переименовывать а попытатся объеденить, инициализацию вместе, глобальные переменные наверх и т.д. Судя по вашему посту Вам бы лучше с нуля заодно и поучитесь, а мы вам поможем.
«И всё-таки она вертится!»
Marchello
Встал на лапы
Сообщения: 114
Зарегистрирован: Чт ноя 24, 2011 12:39:13

Re: CodeVision AVR в вопросах и ответах

Сообщение Marchello »

Я бы с удовольствием! К тому же если вы мне реально поможете! Ну в таком случае давайте начнем!
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

Re: CodeVision AVR в вопросах и ответах

Сообщение Apparatchik »

Marchello писал(а):Я бы с удовольствием! К тому же если вы мне реально поможете! Ну в таком случае давайте начнем!

написал в личку
«И всё-таки она вертится!»
Ответить

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