Обсуждаем контроллеры компании Atmel.
Ответить

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

Чт дек 23, 2021 10:09:52


Доброго времени суток. Помогите адоптировать кусочек кода под 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);


      }
}




 

 


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

Вс фев 13, 2022 13:17:20

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

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

И знаете. Не работает. CVAVR ругается на PORTD. Словно не знает что это такое. Хотя объявлено в #include <mega8535.h> всё порты. Что не так то бл...

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

Вс фев 13, 2022 13:21:10

CVAVR ругается на PORTD. Словно не знает что это такое.

Просто на PORTD или записи типа:
Код:
PORTD.0=1;

А стоп, все правильно, это же CVAVR такое понимает, а все остальные компиляторы нет...

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

Вс фев 13, 2022 13:23:03

undefined symbol 'PORTD'

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

Вс фев 13, 2022 14:28:13

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

////////////////////////////////////////////////////////////////////////////////
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
...
...
...

у меня не ругается))

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

Вс фев 13, 2022 16:44:00

Ну на другие разные библиотеки он же не ругается?

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

Вс фев 13, 2022 17:13:46

не знаю... я вообще не использую библиотеки))
раньше писал... потом передумал)) не удобно бегать по библиотекам... лучше всё в одной программе void main(void) написать и всё))

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

Пн фев 14, 2022 15:27:36

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

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

Вместо 9600 можно влепить int с другими значениями. Внутри функции расчёт по формуле и подстановка в регистр

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

Пн фев 14, 2022 15:32:45

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

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

Пн фев 14, 2022 15:36:09

void USART_initialization(int)

Пишу так. А он мне слишком мало аргументов.

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

Пн фев 14, 2022 15:40:13

mixon46 писал(а):void USART_initialization(int)
так можно только описать функцию, а реализовать её надо с параметром типа int:
Код:
void USART_initialization(int baud){
  if(baud == 9600){ /* или что там надо */ }
}

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

Пн фев 14, 2022 15:45:22

Не хочет. Пишет мало аргументов
Вложения
IMG_20220214_154317_compress27.jpg
(210.29 KiB) Скачиваний: 132

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

Вт фев 15, 2022 00:56:02

каких аргументов... :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
//////////////////////////////////

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

Вт фев 15, 2022 12:30:52

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


Пока только uart_initialization написал.
Надо ещё функции добавить для отправки и считывания

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

Вт фев 15, 2022 13:41:01

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

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

Вт фев 15, 2022 18:48:15

Как она называется?

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

Ср фев 16, 2022 11:31:29

mixon46 писал(а):Я тут библиотеку пишу для работы с uart.

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

какие ?

Зачем это всё ? И как это всё должно работать ?

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

Ср фев 16, 2022 12:06:29

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

Но теперь другая проблема. Он ругается на мою функцию. Пишет 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

далее идет файл реализации

[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) {} ;

}


и компилятор ругается что я что то не так объявляю. что не так не могу понять

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

Ср фев 16, 2022 17:23:14

я так и не понял... зачем это всё ?

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

Ср фев 16, 2022 17:28:25

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