Обсуждаем контроллеры компании Atmel.
stepan_31
Родился
Сообщения: 5 Зарегистрирован: Пн сен 06, 2021 18:48:17
Сообщение
stepan_31 » Чт дек 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);
}
}
mixon46
Говорящий с текстолитом
Сообщения: 1644 Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск
Сообщение
mixon46 » Вс фев 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> всё порты. Что не так то бл...
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089 Зарегистрирован: Вс июн 19, 2016 09:32:03
Сообщение
Reflector » Вс фев 13, 2022 13:21:10
[uquote="mixon46",url="/forum/viewtopic.php?p=4180120#p4180120"]CVAVR ругается на PORTD. Словно не знает что это такое.[/uquote]
Просто на PORTD или записи типа:
А стоп, все правильно, это же CVAVR такое понимает, а все остальные компиляторы нет...
mixon46
Говорящий с текстолитом
Сообщения: 1644 Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск
Сообщение
mixon46 » Вс фев 13, 2022 13:23:03
undefined symbol 'PORTD'
roman.com
Друг Кота
Сообщения: 9149 Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru
Сообщение
roman.com » Вс фев 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
...
...
...
у меня не ругается))
mixon46
Говорящий с текстолитом
Сообщения: 1644 Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск
Сообщение
mixon46 » Вс фев 13, 2022 16:44:00
Ну на другие разные библиотеки он же не ругается?
roman.com
Друг Кота
Сообщения: 9149 Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru
Сообщение
roman.com » Вс фев 13, 2022 17:13:46
не знаю... я вообще не использую библиотеки))
раньше писал... потом передумал)) не удобно бегать по библиотекам... лучше всё в одной программе void main(void) написать и всё))
mixon46
Говорящий с текстолитом
Сообщения: 1644 Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск
Сообщение
mixon46 » Пн фев 14, 2022 15:27:36
Напомните как передать значение в функцию.
Я делаю функцию USART_initialization (9600) ;
Вместо 9600 можно влепить int с другими значениями. Внутри функции расчёт по формуле и подстановка в регистр
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546 Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:
Сообщение
ARV » Пн фев 14, 2022 15:32:45
mixon46 писал(а): Напомните как передать значение в функцию
дык вот прямо так и передать, как вы сами и написали:
mixon46 писал(а): USART_initialization(9600) ;
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик ... заходите!
mixon46
Говорящий с текстолитом
Сообщения: 1644 Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск
Сообщение
mixon46 » Пн фев 14, 2022 15:36:09
void USART_initialization(int)
Пишу так. А он мне слишком мало аргументов.
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546 Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:
Сообщение
ARV » Пн фев 14, 2022 15:40:13
mixon46 писал(а): void USART_initialization(int)
так можно только описать функцию, а реализовать её надо с параметром типа int:
Код: Выделить всё
void USART_initialization(int baud){
if(baud == 9600){ /* или что там надо */ }
}
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик ... заходите!
roman.com
Друг Кота
Сообщения: 9149 Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru
Сообщение
roman.com » Вт фев 15, 2022 00:56:02
каких аргументов...
рабочий пример АЦП
////////////////////////////////// АЦП:
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
Откуда: Курск
Сообщение
mixon46 » Вт фев 15, 2022 12:30:52
Разобрался уже. Я тут библиотеку пишу для работы с uart.
Пока только uart_initialization написал.
Надо ещё функции добавить для отправки и считывания
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546 Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:
Сообщение
ARV » Вт фев 15, 2022 13:41:01
мне вообще не понятно, зачем для кодвижна писать свою библиотеку UART, если там своя встроенная есть.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик ... заходите!
mixon46
Говорящий с текстолитом
Сообщения: 1644 Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск
Сообщение
mixon46 » Вт фев 15, 2022 18:48:15
Как она называется?
roman.com
Друг Кота
Сообщения: 9149 Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru
Сообщение
roman.com » Ср фев 16, 2022 11:31:29
mixon46 писал(а): Я тут библиотеку пишу для работы с uart.
зачем ?
mixon46 писал(а): Надо ещё функции добавить для отправки и считывания
какие ?
Зачем это всё ? И как это всё должно работать ?
mixon46
Говорящий с текстолитом
Сообщения: 1644 Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск
Сообщение
mixon46 » Ср фев 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
далее идет файл реализации
Спойлер #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
Сообщение
roman.com » Ср фев 16, 2022 17:23:14
я так и не понял... зачем это всё ?
mixon46
Говорящий с текстолитом
Сообщения: 1644 Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск
Сообщение
mixon46 » Ср фев 16, 2022 17:28:25
Ну мне интересно как библиотеки работают. Проще же взять готовую функцию. Вставить себе в программу и не вспоминать чего там и какие регистры настраивать