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

Обсуждаем контроллеры компании Atmel.
Ответить
Друг Кота
Сообщения: 9188
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

проще... но не интересно... и самое главное - не эффективно))

зачем вообще писать библиотеки для UART ? Это же простейший интерфейс))

1.
открываем cvavr
выбираем чип
выбираем частоту чипа
Screenshot_1.jpg
(75.26 КБ) 283 скачивания
2.
выбираем режим работы UART
Screenshot_2.jpg
(84.72 КБ) 264 скачивания
3.
нажимаем сгенерировать новый проект
куда сохранить проект
имя проекта
Screenshot_3.jpg
(81.5 КБ) 233 скачивания
4.
cvavr сгенерировал сам код для UART ))
Screenshot_4.jpg
(106.91 КБ) 248 скачиваний
5.
вот функция прерывания... cvavr сгенерировал сам
Screenshot_5.jpg
(103.74 КБ) 256 скачиваний
6.
вот режим работы UART... cvavr сгенерировал сам

Добавлено after 2 minutes 57 seconds:
Screenshot_6.jpg
(94.79 КБ) 244 скачивания
7.
или вот без прерываний...
Screenshot_7.jpg
(114.17 КБ) 239 скачиваний
8.
вот режим работы UART...
Screenshot_8.jpg
(94 КБ) 252 скачивания
9.
и т.д. и т.п.))

cvavr ВСЁ сгенерировал сам ))
:tea:
Реклама
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 181
Зарегистрирован: Пт окт 22, 2021 13:50:39

Сообщение Diskovod »

[uquote="stepan_31",url="/forum/viewtopic.php?p=4146648#p4146648"]​
Доброго времени суток. Помогите адоптировать кусочек кода под CodeVision. 

Начну из далека. На сайте есть проэкт "БП с микроконтроллерным управлением и регулировкой параметров при помощи энкодера."  есть исходники написаные в CodeVision.Используется экранчик bc1602. А мне бы хотелось в этом пролэкте использовать графический lcd  на на st7567.....нашол код под него но он написан в avr studio .

В CodeVision он не работает.....компилируется и т.д но экран не реагирует.......

Кто подскажет где собака зарыта?
​[/uquote]

Я бы так сделал

CodeVision
Спойлер

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

#include <mega8.h>
#include <io.h>
#include <delay.h>
//#include <avr/pgmspace.h>
//#include "btg13264.h"


#define     CS    PORTC.0     //
#define     RES   PORTC.1    //
#define     DC    PORTC.2   //
#define     CLK   PORTC.3  //
#define     SDA   PORTC.4

#define LCD_bias_set 0b10100010        //
#define ADC_select 0b10100000        //
#define COM_out_mode 0b11001000        //
#define V_sel 0b00100101            //
#define VOL_set 0b10000001            //
#define COLUMN_adr_set 0b00011011    //
#define POWER_set 0b00101111        //
#define START_line_set 0b01000000    //
#define PAGE_adr_set 0b10110000     //
#define COLUMN_adr_up 0b00010000    //
#define COLUMN_adr_lo 0b00000000    //





void CpuInit(void)
{
    DDRC=0xFF;
    PORTC=0b11111111;
}


void LcdSend(char byte, char data ) //
{
    char i;
    if(data) DC = 1;
    else DC = 0;;

    CLK = 1 ; // SPI_MODE = 1
    CS = 0 ; // Chip Select - Enable

    for(i=0; i<8; i++)
    {

        if (byte & 0x80)
        {
            SDA = 1 ;
        }
        else
        {
            SDA = 0 ;
        }
        CLK = 0 ;
        byte <<= 1;
        CLK = 1 ;
    }
     CS = 1 ; // Chip Select - Disable
     CLK = 1 ; // SPI_MODE = 1
}

void LcdInit(void)
{
     CS - 0 ;
     RES = 0 ;
    DC = 0 ;
	delay_us(40);
	 RES = 1 ;
	RES = 0 ;
	delay_us(10);
	RES = 1 ;


	LcdSend(LCD_bias_set, 0);
	LcdSend(ADC_select, 0);
	LcdSend(COM_out_mode, 0);
	LcdSend(V_sel, 0);
	LcdSend(VOL_set, 0);
	LcdSend(COLUMN_adr_set, 0);
	LcdSend(POWER_set, 0);




}

void LcdOn(void)
{
	LcdSend(0b10101111, 0);
}

void LcdGoToXYSym(char x, char y)//переход на знакоместо (1-22, 1-8)
{
    
	if(0<<y<=8)	LcdSend(PAGE_adr_set | (y-1), 0);

	if(0<<x<=22){

		x=(x-1)*6;

		LcdSend((COLUMN_adr_up | (x >> 4)), 0);
		LcdSend((COLUMN_adr_lo | (x & 0b00001111)), 0);
	}
}

void LcdClear(void)
{
    char num;
    char i;
	LcdSend(START_line_set, 0);

	for(num=1; num<=8; num++){

		LcdGoToXYSym(1, num);

		for(i=0; i < 132; i++ ){

			LcdSend(0x00, 1);

		}
	}
}






void main(void)
{

CpuInit();
LcdInit();
LcdClear();
LcdOn();

while (1)
{
    LcdGoToXYSym(3, 3);
    LcdSend(0x07, 1);
    LcdSend(0x08, 1);
    LcdSend(0x70, 1);
    LcdSend(0x08, 1);
    LcdSend(0x07, 1);
    LcdSend(0x00, 1);
    delay_ms(500);


      }
}


 

 
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2314
Зарегистрирован: Вт янв 26, 2021 22:33:21

Сообщение Alex_641 »

Не с того не с сего перестал работать CVAVR версии 3.12, пропали все кнопки ( или как они там называются), в основном окне только окно с программой и то маленького размера. Переустановка не помогла, антивирусник ничего не нашёл... Может было такое у кого нить?
Изображение
Не спрашивай по ком звонит колокол, он звонит по тебе !
Вымогатель припоя
Сообщения: 535
Зарегистрирован: Вт фев 09, 2010 17:52:26

Сообщение codenamehawk »

[uquote="mixon46",url="/forum/viewtopic.php?p=4182169#p4182169"]и компилятор ругается что я что то не так объявляю. что не так не могу понять[/uquote]
Попробуйте другое название функции придумать.
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 18
Зарегистрирован: Вт янв 05, 2016 11:44:44

Сообщение foxmikola »

Всем доброго времени суток. Нужна помощь есть архив для CodeVision AVR1.24.7
http://gornvasiliy.narod.ru/schrulle_a1.htm
в конце архив в строке:

Проект, исходный текст, прошивка для CodeVisionAVR1.24.7 здесь

Сам с CodeVision пока никак, уровень могу прошить AVR на программаторе tl866. Просьба, нужен HEX или BIN и как поставить фьюзы.
У меня не получается устройство работает, но не правильно.
Последний раз редактировалось foxmikola Вт апр 26, 2022 08:03:11, всего редактировалось 3 раза.
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 601
Зарегистрирован: Пт фев 13, 2009 20:58:13
Откуда: Донецк

Сообщение DataLife »

[uquote="foxmikola",url="/forum/viewtopic.php?p=4221771#p4221771"]Сам с CodeVision пока никак, уровень могу прошить AVR на программаторе tl866. Просьба, нужен HEX или BIN и как поставить фьюзы.
У меня не получается устройство работает, но не правильно.[/uquote]

HEX есть в архиве, прошивайте удобным вам методом. Фьюзы - выставить на работу от внутренего генератора на 8 МГц.

Добавлено after 17 minutes 55 seconds:
Всем доброго дня!
Поставил себе задачу впихнуть в ATTiny13A программу сбора показаний с нескольких DS18b20 и передачу из по UART.
Помощник CVAVR сделал все необходимые первичные настройки, активировал 1-wire и тд, но даже без UARTa компилятор ругается на недостаток RAM (Linker error: global RAM variables size: 81 bytes is too large) ! Я просто выхожу из мастера генерации кода и пробую всё собрать!
СпойлерBuild configuration: Release
Chip: ATtiny13A
Clock frequency: 1,200000 MHz
Memory model: Tiny
Optimize for: Size
(s)printf features: int, width
(s)scanf features: int, width
Promote 'char' to 'int': Yes
'char' is unsigned: Yes
global 'const' stored in FLASH: Yes
8 bit enums: Yes
Enhanced function parameters passing: Yes
Automatic register allocation: Yes

Build: 7
764 line(s) compiled
1 error(s)
No warnings

Bit variables size: 0 byte(s)

Data Stack area: 0x60 to 0x6F
Data Stack size: 16 byte(s)
Estimated Data Stack usage: 0 byte(s)

RAM Global variables area: 0x70 to 0xC0
RAM Global variables size: 81 byte(s)

Hardware Stack area: 0xC1 to 0x9F
Hardware Stack size: -33 byte(s)

Heap size: 0 byte(s)

EEPROM usage: 0 byte(s), 0,0% of EEPROM
Честно сказать, я в замешательстве, ведь у многих работает (судя по статьям в интернете), правда все делают для одного датчика...
У меня задача использовать несколько, максимально возможное количество.

Попробовал уменьшить дефайн MAX_DS1820 ... при "2" - проект собирается:
СпойлерBuild configuration: Release
Chip: ATtiny13A
Clock frequency: 1,200000 MHz
Memory model: Tiny
Optimize for: Size
(s)printf features: int, width
(s)scanf features: int, width
Promote 'char' to 'int': Yes
'char' is unsigned: Yes
global 'const' stored in FLASH: Yes
8 bit enums: Yes
Enhanced function parameters passing: Yes
Automatic register allocation: Yes

Build: 6
764 line(s) compiled
No errors
No warnings

Bit variables size: 0 byte(s)

Data Stack area: 0x60 to 0x6F
Data Stack size: 16 byte(s)
Estimated Data Stack usage: 0 byte(s)

RAM Global variables area: 0x70 to 0x8A
RAM Global variables size: 27 byte(s)

Hardware Stack area: 0x8B to 0x9F
Hardware Stack size: 21 byte(s)

Heap size: 0 byte(s)

EEPROM usage: 0 byte(s), 0,0% of EEPROM
Program size: 226 words (452 bytes), 44,1% of FLASH
0 words (0 bytes), 0,0% reduced by Code Compression
Может какие настройки в компиляторе нужно сделать?

Пустая программа, которая не помещается:
Спойлер

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

/*******************************************************
This program was created by the
CodeWizardAVR V3.12 Advanced
Automatic Program Generator

Chip type               : ATtiny13A
AVR Core Clock frequency: 1,200000 MHz         9.6 Mhz / 8 preskaller
Memory model            : Tiny
External RAM size       : 0
Data Stack size         : 16
*******************************************************/

#include <tiny13a.h>
    
// 1 Wire Bus interface functions
#include <1wire.h>

// DS1820 Temperature Sensor functions
#include <ds1820.h>

// maximum number of DS1820 devices
// connected to the 1 Wire bus
#define MAX_DS1820 8

// number of DS1820 devices
// connected to the 1 Wire bus
unsigned char ds1820_devices;
// DS1820 devices ROM code storage area,
// 9 bytes are used for each device
// (see the w1_search function description in the help)
unsigned char ds1820_rom_codes[MAX_DS1820][9];

// Declare your global variables here

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

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B initialization
// Function: Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
DDRB=(0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
// State: Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
PORTB=(0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);


// 1 Wire Bus initialization
// 1 Wire Data port: PORTB
// 1 Wire Data bit: 4
// Note: 1 Wire port settings are specified in the
// Project|Configure|C Compiler|Libraries|1 Wire menu.
w1_init();

// Determine the number of DS1820 devices
// connected to the 1 Wire bus
ds1820_devices = w1_search(0xf0,ds1820_rom_codes);

while (1)
      {
      // Place your code here

      }
}
UPD: думаю мне понятно... 9 bytes are used for each device ... 8 устройств Х 9 байт = 72 байта, что уже больше 64 имеющихся в Тиньке...
Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного.
Реклама
Поставщик валерьянки для Кота
Сообщения: 1916
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария

Сообщение veso74 »

Из этой части кода, которым поделились, оптимизацию памяти вероятно сделать невозможно. Код, предложенный в компиляторе, часто является примерным и не оптимизированным (для памяти). Он часто универсален. Нужно переделывать (по возможности) код в других файлах. Например, почему данные всех датчиков хранятся в памяти? Выполнить действия с одним, определиться с результатом и загрузить в память другое. Максимум для сохранения: текущих температур как окончательный результат (но для этого тоже нужен объем памяти). И лично: зачем нужен такой минималистичный вариант? Лучше замените контроллер. Нет даже место запускать ни один алгоритм статистической обработки данных, хоть усреднение, хоть moving average ... о более сложных алгоритми просто нет смысла думать. И в конце: показания температуры будут колебаться +/-x.xx, что не связано с физическим процессом.
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 601
Зарегистрирован: Пт фев 13, 2009 20:58:13
Откуда: Донецк

Сообщение DataLife »

[uquote="veso74",url="/forum/viewtopic.php?p=4228672#p4228672"]Из этой части кода, которым поделились, оптимизацию памяти вероятно сделать невозможно. Код, предложенный в компиляторе, часто является примерным и не оптимизированным для памяти. Нужно переделывать (по возможности) код в других файлах. Например, почему данные всех датчиков хранятся в памяти? Выполнить действия с одним, определиться с результатом и загрузить в память другое. Максимум для сохранения: текущих температур как окончательный результат (но для этого тоже нужен объем памяти). И лично: зачем нужен такой минималистичный вариант? Лучше замените контроллер. Нет даже место запускать ни один алгоритм статистической обработки данных, хоть усреднение, хоть moving average ...[/uquote]
Да, посмотрел в сторону Тини85 - размер тот же, возможностей намного больше. И цена та же...
На счёт - зачем хранить - судя по всему, основной объём занимает хранение ROM-кодов датчиков (те самые 9 байт на датчик). А без их хранения - получится ли их все опрашивать? Пока не понял. В любом случае - выбор в пользу тини85 даёт прирост в ОЗУ до 512 Байт. Всё поместится.

Теперь стала задача сделать программный UART, ибо не доглядел, что аппаратного там нет...
Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного.
Поставщик валерьянки для Кота
Сообщения: 1916
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария

Сообщение veso74 »

[uquote="DataLife",url="/forum/viewtopic.php?p=4228680#p4228680"]... основной объём занимает хранение ROM-кодов датчиков (те самые 9 байт на датчик).[/uquote]
Можно сделать функцию: считать датчик (возвращает, например, уже считанную текущую температуру) и применить ко всем датчикам. Таким образом, промежуточные результаты чтения регистров не будут постоянно сохраняться. При необходимости сохраните только уже считанные температуры с каждой датчик (8 штук * 2 байт).
Контактная информация:
AVK
Потрогал лапой паяльник
Сообщения: 349
Зарегистрирован: Сб окт 20, 2007 14:12:03

Сообщение AVK »

У блока USART есть три прерывания окончание приема, окончание передачи и опустошение буфера.
Но в CV доступны только первые два. Это нормально или как то можно третье прерывание завести?
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

Есть ли возможность в CVAVR встроенными средствами разместить flash константу по фиксированному адресу?

Придумал пока использовать asm вставку:

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

// область глобальных переменных в отдельном С-файле:
#asm
.cseg
.org 8000 // адрес
.db 0x64 // константа
#endasm

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

// В main:
OSCCAL = *((volatile flash uint8_t *) OSCCAL_CONST_ADRESS);
Проблема в том что компилятор дальше пытается разместить за этой константой блок данных или код из других файлов, который вылезает далеко за пределы флеш Atmega168. При этом в середине флеш оказывается свободна. То есть решение не является правильным.

В Keil MDK или GCC для этого я создавал scatter-файл или скрипт линкера где делал собственные сегменты и назначал в таких сегментах нужные мне константы.

А как делают в Codevision?
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

ARV писал(а):а зачем, если не секрет?
1. Калибровка RC генератора. Вам наверно известно что при запуске загружается значение в OSCCAL для 1МГц(Например Atmega8 и др.). Для 8МГц надо считать программатором константу и записать в флеш или еепром. Дело не очень хлопотное когда программируется только 1 устройство. Можно и программу пересобрать. А когда 10-100 штук? А когда приходит время исправлений или обновлений, адреса калибровок начинают съезжать. Это лишний источник ошибок.
2. Работа с бутлоадером. Для этого надо разместить функции и блоки данных по фиксированным адресам.
3. Эмуляция еепром во флеш памяти. Надо назначать переменным адреса страниц не пересекающиеся с адресами кода.

Конечно, 2 и 3 сегодня уже не сильно актуально для авр. Но 3 вариант лично использовал на Stm без собственной еепром.
Открыл глаза
Аватара пользователя
Сообщения: 44
Зарегистрирован: Ср ноя 21, 2012 00:00:49

Сообщение Burguy »

Доброго всем вечера прошу помощи. Перестал работать интерфейс.
....
Основное окно Codevision замораживается, пропадают все кнопки. Просто серое окно.. Работает только выход, свернуть или закрыть программу с несохраненными данными по по нажатию кнопок сверху слева на окне.
CAVR 3.12, 3.14, Windows 8 64 бит.

Пробовал на разных версиях везде одно и тоже. Поставил на другой комп все работает.
НЕ могу понять где искать.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2314
Зарегистрирован: Вт янв 26, 2021 22:33:21

Сообщение Alex_641 »

У меня такое же было недавно, сын что то сделал - заработало.

Добавлено after 3 minutes 23 seconds:
Вроде бы какие то файлы из какой то папки самой кавр удалял....
Не спрашивай по ком звонит колокол, он звонит по тебе !
Открыл глаза
Аватара пользователя
Сообщения: 44
Зарегистрирован: Ср ноя 21, 2012 00:00:49

Сообщение Burguy »

Теперь осталось выяснить с какой папки и какие файлы)
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2314
Зарегистрирован: Вт янв 26, 2021 22:33:21

Сообщение Alex_641 »

Не спрашивай по ком звонит колокол, он звонит по тебе !
Открыл глаза
Аватара пользователя
Сообщения: 44
Зарегистрирован: Ср ноя 21, 2012 00:00:49

Сообщение Burguy »

Попробую. Но в Вашем примере хотя-бы окна видны и кнопки меню. У меня просто серое окно.
Доберусь через пару часов до компа проверю. Надеюсь сработает.

Добавлено after 2 hours 57 minutes 22 seconds:
УУУРРААА!!! Работает!!!!
Нужно было удалить файлы из папки c:\ProgramData\HP InfoTech\CodeVisionAVR\

Спасибо НКВД!!!
Мучитель микросхем
Сообщения: 430
Зарегистрирован: Вс апр 18, 2021 15:43:55

Сообщение Kalisnik »

Вылазит 2 ошибки. В чем я ошибся? Как сделать правильно?

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

var.h(4), #included from: lern.c: '(' expected
var.c(1): '(' expected
var.h

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

#ifndef H_VAR
    #define H_VAR
 
    extern uint8_t i; 
 
#endif
var.c:

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

uint8_t i = 8;
lern.c

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

#include <mega8.h>
#include "var.h"

void main(void)
{

...

while (1)
      {
      // Place your code here

      }
}
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

В var.c только одна строчка? Ни var.h не инклюдится, ни stdint.h?
Контактная информация:
Ответить

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