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

Обсуждаем контроллеры компании Atmel.
stepan_31
Родился
Сообщения: 5
Зарегистрирован: Пн сен 06, 2021 18:48:17

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

Сообщение stepan_31 »


Доброго времени суток. Помогите адоптировать кусочек кода под CodeVision. 

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

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

Кто подскажет где собака зарыта?

avr studio

Спойлер

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

#define F_CPU 8000000UL // объявляем частоту процессора
#include <avr/io.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
//#include "btg13264.h"


#define LCDPORT PORTC	//
#define CS PC0			//
#define RES PC1			//
#define DC PC2			//
#define CLK PC3			//
#define SDA PC4			//


#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 ) //
{
	if(data) LCDPORT |=(1 << DC);
	else LCDPORT &= ~(1 << DC);

	LCDPORT |= (1 << CLK); // SPI_MODE = 1
	LCDPORT &= ~(1 << CS); // Chip Select - Enable

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

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

void LcdInit(void)
{
	LCDPORT &= ~(1 << CS);
	LCDPORT &= ~(1 << RES);
	LCDPORT &= ~(1 << DC);
	_delay_us(40);
	LCDPORT |= (1 << RES);
	LCDPORT &= ~(1 << RES);
	_delay_us(10);
	LCDPORT |= (1 << RES);


	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)
{

	LcdSend(START_line_set, 0);

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

		LcdGoToXYSym(1, num);

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

			LcdSend(0x00, 1);

		}
	}
}


int 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);


}



}
CodeVision
Спойлер

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

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


#define LCDPORT PORTC    //
#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) LCDPORT |=(1 << DC);
    else LCDPORT &= ~(1 << DC);

    LCDPORT |= (1 << CLK); // SPI_MODE = 1
    LCDPORT &= ~(1 << CS); // Chip Select - Enable

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

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

void LcdInit(void)
{
    LCDPORT &= ~(1 << CS);
    LCDPORT &= ~(1 << RES);
    LCDPORT &= ~(1 << DC);
	delay_us(40);
	LCDPORT |= (1 << RES);
	LCDPORT &= ~(1 << RES);
	delay_us(10);
	LCDPORT |= (1 << RES);


	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);


      }
}


 

 


Реклама
Аватара пользователя
mixon46
Говорящий с текстолитом
Сообщения: 1644
Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск

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

Сообщение mixon46 »

Здравствуйте. Сделал библиотеку как в прилагаемой статье. С файлами *.lib и *.h
Для того что бы понять смысл как работают библиотеки.

https://mega-avr.ucoz.ru/publ/create_li ... r/1-1-0-12

И знаете. Не работает. CVAVR ругается на PORTD. Словно не знает что это такое. Хотя объявлено в #include <mega8535.h> всё порты. Что не так то бл...
Реклама
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

[uquote="mixon46",url="/forum/viewtopic.php?p=4180120#p4180120"]CVAVR ругается на PORTD. Словно не знает что это такое.[/uquote]
Просто на PORTD или записи типа:

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

PORTD.0=1;
А стоп, все правильно, это же CVAVR такое понимает, а все остальные компиляторы нет...
Аватара пользователя
mixon46
Говорящий с текстолитом
Сообщения: 1644
Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск

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

Сообщение mixon46 »

undefined symbol 'PORTD'
Реклама
Эиком - электронные компоненты и радиодетали
roman.com
Друг Кота
Сообщения: 9149
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

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

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

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

////////////////////////////////////////////////////////////////////////////////
void main(void)
{
/////////////////////////////////////////////// SPI (мастер)
DDRB.5=1; // выход SCK
PORTB.5=0; // выход SCK
DDRB.4=0; // вход MISO
PORTB.4=0; // вход MISO
DDRB.3=1; // выход MOSI
PORTB.3=0; // выход MOSI
...
...
...

у меня не ругается))
Реклама
Аватара пользователя
mixon46
Говорящий с текстолитом
Сообщения: 1644
Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск

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

Сообщение mixon46 »

Ну на другие разные библиотеки он же не ругается?
Реклама
roman.com
Друг Кота
Сообщения: 9149
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

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

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

не знаю... я вообще не использую библиотеки))
раньше писал... потом передумал)) не удобно бегать по библиотекам... лучше всё в одной программе void main(void) написать и всё))
Аватара пользователя
mixon46
Говорящий с текстолитом
Сообщения: 1644
Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск

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

Сообщение mixon46 »

Напомните как передать значение в функцию.

Я делаю функцию USART_initialization (9600) ;

Вместо 9600 можно влепить int с другими значениями. Внутри функции расчёт по формуле и подстановка в регистр
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

mixon46 писал(а):Напомните как передать значение в функцию
дык вот прямо так и передать, как вы сами и написали:
mixon46 писал(а):USART_initialization(9600) ;
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
mixon46
Говорящий с текстолитом
Сообщения: 1644
Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск

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

Сообщение mixon46 »

void USART_initialization(int)

Пишу так. А он мне слишком мало аргументов.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

mixon46 писал(а):void USART_initialization(int)
так можно только описать функцию, а реализовать её надо с параметром типа int:

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

void USART_initialization(int baud){
  if(baud == 9600){ /* или что там надо */ }
}
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
mixon46
Говорящий с текстолитом
Сообщения: 1644
Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск

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

Сообщение mixon46 »

Не хочет. Пишет мало аргументов
Вложения
IMG_20220214_154317_compress27.jpg
(210.29 КБ) 203 скачивания
roman.com
Друг Кота
Сообщения: 9149
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

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

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

каких аргументов... :dont_know:

рабочий пример АЦП
////////////////////////////////// АЦП:
void adc(unsigned char adc_input)
{
ADMUX = 0b01000000 | adc_input; // опорное AVCC // канал ADC0...ADC7
delay_us(10);
ADCSRA|=0b01000000;
while (ADCSRA & 0b01000000);
}
////////////////////////////////// вызов функции АЦП:
adc(5); // канал ADC 5
//////////////////////////////////
Аватара пользователя
mixon46
Говорящий с текстолитом
Сообщения: 1644
Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск

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

Сообщение mixon46 »

Разобрался уже. Я тут библиотеку пишу для работы с uart.


Пока только uart_initialization написал.
Надо ещё функции добавить для отправки и считывания
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
Аватара пользователя
mixon46
Говорящий с текстолитом
Сообщения: 1644
Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск

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

Сообщение mixon46 »

Как она называется?
roman.com
Друг Кота
Сообщения: 9149
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

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

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

mixon46 писал(а):Я тут библиотеку пишу для работы с uart.
зачем ?
mixon46 писал(а):Надо ещё функции добавить для отправки и считывания
какие ?

Зачем это всё ? И как это всё должно работать ?
Аватара пользователя
mixon46
Говорящий с текстолитом
Сообщения: 1644
Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск

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

Сообщение mixon46 »

В общем разобрался. Переоткрыл проект.

Но теперь другая проблема. Он ругается на мою функцию. Пишет declaration syntax error. В чем проблема может быть?

В общем смотрите. Есть заголовочный файл
Спойлер#ifndef _UART32U4_H_
#define _UART32U4_H_

//эта деректива запрещает компилятору выдавать предупреждения о том, что функция объявлена, но в программе не используется


#pragma used+

//прототипы функций

void uart (unsigned int long BAUD);

#pragma used-

//эта деректива разрешает компилятору выдавать предупреждения о том, что функция объявлена, но в программе не используется

//подключение библиотечного файла name.lib

#pragma library uart32u4.lib

#endif [/spoiler

далее идет файл реализации
Спойлер#include <mega32u4.h>
#define CLOK 16000000
unsigned int CLOKtemp = 0;

void uart (unsigned int long BAUD)
{

#asm ("sei");
UCSR1A=(0<<RXC1)|(0<<TXC1)|(0<<UDRE1)|(0<<FE1)|(0<<DOR1)|(0<<UPE1)|(0<<U2X1)|(0<<MPCM1);

//RXC1- ФЛАГ ЗАВЕРШЕНИЯ ПРИЕМА
//TXC1- ФЛАГ ЗАВЕРШЕНИЯ ПЕРЕДАЧИ
//UDRE1 - ФЛАГ ОСВОБОЖДЕНИЯ РЕГИСТРА ДАННЫХ
//FE1 - ОШИБКА ПОСЫЛКИ
//DOR1 - ФЛАГ ПЕРЕПОЛНЕНИЯ ДАННЫХ
//UPE1 - ОШИБКА ПАРИТЕТА
//U2X1 - УДВОЕНИЕ СКОРОСТИ СВЯЗИ
//MPCM1 - РЕЖИМ МНОГОПРОЦЕССОРНОЙ СВЯЗИ

UCSR1B=(1<<RXCIE1)|(0<<TXCIE1)|(0<<UDRIE1)|(1<<RXEN1)|(1<<TXEN1)|(0<<UCSZ12)|(0<<RXB81)|(0<<TXB81);

//RXCIE1 - РАЗРЕШАЕТ ПРЕРЫВАНИЯ ПО ЗАВЕРШЕНИЮ ПРИЕМА
//TXCIE1 - РАЗРЕШЕНИЕ ПРЕРЫВАНИЯ ПО ЗАВЕРШЕНИЮ ПЕРЕДАЧИ
//UDRIE1 - РАЗРЕШЕНИЕ ПРЕРЫВАНИЯ ПО ОСВОБОЖДЕНИЮ РЕГИСТРА ДАННЫХ
//RXEN1 - РАЗРЕШЕНИЕ РАБОТЫ ПРИЕМНИКА
//TXEN1 - РАЗРЕШЕНИЕ РАБОТЫ ПЕРЕДАТЧИКА
//UCSZ12 - ФОРМАТ ДАННЫХ
//RXB81 - ЗНАЧЕНИЕ 8 РАЗРЯДА ПРИНЯТЫХ ДАННЫХ
//TXB81 - ЗНАЧЕНИЕ 8 РАЗРЯДА ПЕРЕДАВАЕМЫХ ДАННЫХ

UCSR1C=(0<<UMSEL11)|(0<<UMSEL10)|(0<<UPM11)|(0<<UPM10)|(0<<USBS1)|(1<<UCSZ11)|(1<<UCSZ10)|(0<<UCPOL1);

//UMSEL11
//UMSEL10 - ЭТИМИ ДВУМЯ БИТАМИ ВЫБИРАЕТСЯ РЕЖИМ РАБОТЫ 00-АСИНХРОННЫЙ 01-СИНХРОННЫЙ 11-МАСТЕР SPI
//UPM11
//UPM11 - ЭТИМИ ДВУМЯ БИТАМИ УСТАНАВЛИВАЕТСЯ РЕЖИМ ПАРИТЕТА 00-ОТКЛЮЧЕН 10-ЧЕТНОСТЬ 11-НЕЧЕТНОСТЬ
//USBS1 - ФОРМАТ ДАННЫХ (0-1 СТОП БИТ) (1-2 СТОП БИТА)
//UCSZ11
//UCSZ10 - ЭТИМИ 3 БИТАМИ НАСТРАИВАЕТСЯ ФОРМАТ ДАННЫХ (000 - 5 БИТ) (001 - 6 БИТ) (010 - 7 БИТ) (011 - 8 БИТ)
//UCPOL1 - ПОЛЯРНОСТЬ СИНХРОНИЗАЦИИ (ИСПОЛЬЗУЕТСЯ/РАБОТАЕТ В СИНХРОННОМ РЕЖИМЕ)

CLOKtemp = (CLOK / (16*BAUD))-1;

//ВЫСЧИТЫВАЕМ ЗНАЧЕНИЕ ДЛЯ СКОРОСТИ РАБОТЫ UART

UBRR1L = CLOKtemp & 0xFF;

UBRR1H = (CLOKtemp & 0xFF00) >> 8;

//РАЗБИВАЕМ CLOKset НА МЛАДШИЙ И СТАРШИЙ РЕГИСТРЫ UBRR1L, UBRR1H



}
ну а далее я объявляю функцию в программе
Спойлер#include <mega32u4.h>
#include <uart32u4.h>







void main(void)
{

void uart (9600);
while (1) {} ;

}
и компилятор ругается что я что то не так объявляю. что не так не могу понять
roman.com
Друг Кота
Сообщения: 9149
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

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

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

я так и не понял... зачем это всё ?
Аватара пользователя
mixon46
Говорящий с текстолитом
Сообщения: 1644
Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск

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

Сообщение mixon46 »

Ну мне интересно как библиотеки работают. Проще же взять готовую функцию. Вставить себе в программу и не вспоминать чего там и какие регистры настраивать
Ответить

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