Jump to content
Sign in to follow this  
Laz

C Atmega8 На Atmega16 (Wg12864A)

Recommended Posts

Всем здрасте!

Ребят подскажите, я в Си не очень хорош, но так уж вышло что пришлось. Есть программа для графического ЖК, написана под atmega8. При компиляции на amega16 ошибок не выдает но и ничего не показывает.

Нужно для правильного перевода на atmega16? Танцы с бубном не помогают...я пробывал =)

Есть вариант что напутаны порты в\в даже глядя по схемам они разные, при исправлении портов в коде компилятор начинает ругатся на неизвестную функцию((((

Вот код.

#include <avr/io.h>
#include "symbol.h"

#define DI 0	
#define RW 1
#define E 2
#define CS1 3
#define CS2 4
#define RST 5

void pause (unsigned int a)
{ unsigned int i;

for (i=a;i>0;i--)
;
}

void lcd_dat (unsigned char data)
{
PORTD=data; //Выводим данные
PORTB|=_BV(DI); //Говорим дисплею что передаются данные
asm("nop");
PORTB|= _BV(E); //Импульс записи
asm("nop");
PORTB&=~_BV(E);
PORTB&=~_BV(DI);
}

void lcd_com (unsigned char comm)
{
PORTD=comm; //Выводим команду
asm("nop");
PORTB|= _BV(E); // Импульс записи
asm("nop");
PORTB&=~ _BV(E);
}

void gotoxy (unsigned char x, unsigned char y)
{
if (x<64) PORTB|=_BV(CS1); //Если x<64 включаем CS1
 else {
	 PORTB|=_BV(CS2); //else включаем CS2
x=x-64;
 }
lcd_com(0x40+x); //Выставляем X координату
lcd_com(0xb8+y/8); //Выставляем Y координату
}

void clear_screen (void)
{ unsigned char i,j;

PORTB|=_BV(CS1)|_BV(CS2); //Включаем оба чипа
for (j=0;j<8;j++)
{
lcd_com(0xb8+j);
for (i=0;i<64;i++)
lcd_dat(0x00); //Очищаем
}
}

void wg12864_init(void)
{
DDRD=0xff;	 //PD0-7 как выхода
PORTD=0x00;
PORTB=_BV(RST)|_BV(CS1)|_BV(CS2); //Включаем оба чипа
DDRB=_BV(DI)|_BV(RW)|_BV(E)|_BV(CS1)|_BV(CS2)|_BV(RST); //PB0-5 как выхода
asm("nop");
lcd_com(0x3f);	 //Разрешаем отображение
lcd_com(0xc0);	 //Устанавливаем начало отображения
lcd_com(0x40);	 //Ставим X=0
lcd_com(0xb8);	 //Ставим Y=0
clear_screen();

PORTB&=~(_BV(CS1)|_BV(CS2));
}

void put_pixel (const unsigned char x, const unsigned char y, const unsigned char color)
{ unsigned char temp=0;

PORTB=_BV(RST);
if ( (x>128)||(y>64) ) return;

gotoxy (x,y);

PORTD=0xff;	
DDRD=0x00; //PD0-7 как входа
PORTB|=(_BV(RW)|_BV(DI)); //Считываем данные
pause(1);

PORTB|= _BV(E);
asm("nop");
PORTB&=~_BV(E);
asm("nop");
PORTB|= _BV(E);
asm("nop");
temp=PIND;	
PORTB&=~_BV(E);

if (color==1) temp|= _BV(y%8); //Выставляем/снимаем нужный нам бит
	 else temp&=~_BV(y%8);

PORTB&=~(_BV(RW)|_BV(DI));
DDRD=0xff; //PD0-7 как выхода
asm("nop");
gotoxy(x,y); //Переходим к X,Y
lcd_dat(temp); //Записываем данные
PORTB=_BV(RST);
}

int sign (int x)
{
if (x<0) return -1;
if (x>0) return 1;
return 0;
}

int abs (int x)
{
if (x<0) return -x;
 else return x;
}	

void line (unsigned char x1,unsigned char y1,unsigned char x2,
unsigned char y2,unsigned char color)
{ int dx,dy,i,sx,sy,check,e,x,y;

dx=abs(x1-x2);
dy=abs(y1-y2);
sx=sign(x2-x1);
sy=sign(y2-y1);
x=x1;
y=y1;
check=0;
if (dy>dx) {
		 dx=dx+dy;
		 dy=dx-dy;
		 dx=dx-dy;
		 check=1;
		 }
e=2*dy - dx;
for (i=0;i<=dx;i++)
{
 put_pixel(x,y,color);
 if (e>=0) {
		 if (check==1) x=x+sx;
		 else y=y+sy;
			 e=e-2*dx;
		 }
 if (check==1) y=y+sy;
	 else x=x+sx;
 e=e+2*dy;
}
}

void rectangle (unsigned char x1,unsigned char y1,unsigned char x2,
unsigned char y2,unsigned char color)
{
line (x1,y1,x2,y1,color);
line (x2,y1,x2,y2,color);
line (x2,y2,x1,y2,color);
line (x1,y2,x1,y1,color);
}

void put_char (unsigned char x0, unsigned char y0, unsigned char code, unsigned char mode)
{ unsigned char i,x,y;
x=x0;
y=y0;
PORTB=_BV(RST)|_BV(CS1);
if ( (x>128)||(y>64) ) return;
for (i=0;i<6;i++)
{
if (x>=64) { //Включить CS2
 x=x-64;
PORTB|=_BV(CS2);
		 PORTB&=~_BV(CS1);
 }	
lcd_com(0x40+x); //Перейти X,Y
lcd_com(0xb8+y);

if (i<=4) { if (mode==1) lcd_dat(~sym[code][i]); //Пишем колонку
			 else lcd_dat (sym[code][i]); //Пишем инвертированную колонку
		 }
if (i==5) { if (mode==1) lcd_dat(0xff); //Рисуем разделитель
				 else lcd_dat(0x00); //Рисуем инвертированный разделитель
		 }
x=x+1;
}

}

int main(void)
unsigned char data2[8]={0x20,0x10,0x01,0x02,0x08,0x06,0x04,0x0a}; //"WG12864A"
unsigned char i;

pause(5000); //Задержка для включения ЖКИ
wg12864_init(); //Инициализация ЖКИ

rectangle(0,0,127,63,1); //Рисуем контур
line (127,0,0,63,1); //Рисуем линии
line (127,5,5,63,1);
line (127,10,10,63,1);
line (127,15,15,63,1);
line (127,20,20,63,1);
line (127,25,25,63,1);
line (127,30,30,63,1);
line (127,35,35,63,1);
line (127,40,40,63,1);
line (127,45,45,63,1);
line (127,50,50,63,1);
line (127,55,55,63,1);
line (127,60,60,63,1);

for (i=0;i<8;i++)
put_char (10+6*i,3,data2[i],0); //Пишем "WG12864A"

while (1)
;

return 1;
}

И схема на atmega8 к которой он написан.sch_little_0.gif

==============================================

А вот схема atmega16 к которой надо запилить этот код..5618ab022d9b.jpg

Edited by Laz

Share this post


Link to post
Share on other sites

Изготовление 2-х слойных плат от 2$, а 4-х слойных от 5$!

Быстрое изготовление прототипа платы всего за 24 часа! Прямая доставка с нашей фабрики!

Смотрите видео о фабрике JLCPCB: https://youtu.be/_XCznQFV-Mw

Посетите первую электронную выставку JLCPCB https://jlcpcb.com/E-exhibition чтобы получить купоны и выиграть iPhone 12, 3D-принтер и так далее...

Безмостовые ККМ для 99% КПД!

Схема коррекции коэффициента мощности (ККМ) на основе так называемого «тотемного столба» (Totem Pole) обладает минимально возможными потерями и потенциально может обеспечить самые жесткие требования к энергоэффективности источников питания. Компания Wolfspeed представляет референсную разработку – плату ККМ CRD-02AD065N на базе собственных карбид-кремниевых MOSFET и диодов с наилучшими в отрасли характеристиками.

Подробнее

Гибридные IGBT - сила Si и SiC в одном корпусе!

Компания Infineon представила новые гибридные IGBT-транзисторы на 650 В, которые сочетают в себе преимущества технологий TRENCHSTOP и CoolSiC. Использование SiC-диода Шоттки позволяет значительно расширить возможности IGBT и снизить уровень энергии, необходимой для включения транзистора (Eon), а также уменьшить потери на переключение.

Подробнее

Программа AVRStudio 4работаю на железе на вот такой прелести=)easyavr5a_550_1.jpg

По вопросу "И где код?" интернет зависал(

Edited by Laz

Share this post


Link to post
Share on other sites

Вебинар «Параметры выше, цена ниже. Обновление в линейке AC/DC- и DC/DC-преобразователей MORNSUN» (26.01.2021)

Приглашаем 26 января на бесплатный вебинар, посвящённый преимуществам и отличиям новых источников питания и DC/DC-преобразователей Mornsun. На вебинаре будут рассмотрены изолированные и неизолированные DC/DC-преобразователи последнего, четвертого, поколения (R4) и компактные модульные источники питания второго и третьего поколений (семейства LS/R3 и LD/R2) на плату. Рассмотрим новую группу продукции – встраиваемые источники питания в кожухе.

Подробнее

А самому переназначить в программе линии МК, согласно новой схемы, и проинициализировать (соответственно) порты религия не позволяет?

Share this post


Link to post
Share on other sites

Геннадий

Я писал уже, что при исправлении портов в том коде что я привел, компилятор начинает ругаться на неизвестную функцию ,

PORTB|= _BV(E); // Импульс записи

скорее не хватает понимания языка чем религии

Edited by Laz

Share this post


Link to post
Share on other sites

Сие тема не актуальна, ибо понимание посетило меня.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

  • Сообщения

    • Помогите опознать транзистор, поиск в интернете не дал результатов. Маркировка N65KAE.
    • Возможно что еще проблема в библиотеках. Какая-то из них разрослась в новой версии и места уже не хватает.
    • Это всё-таки не техническая наука. Наверное, ближе к формальной, как и математика. Я разговаривал с математиком. Он кроме математики больше ничем не интересуется. Но это было ещё до вброса о лунной афере. Химики тоже нифига ничего не знают ни о космосе, ни о Аполлоне, хотя это естественная наука.  А вот люди инженерных профессий, если даже ничего и  не слышали о лунных фальсификациях, то очень быстро ориентируются в предоставленной информации противоборствующих сторон и разоблачают сторонников лунной аферы. Я для этого прикидывался дилетантом и выкладывал самые распространенные "факты" обмана, с просьбой разобраться и разьяснить положение дел. Как правило, почти никто не вникал в тонкости предоставленной информации от НАСА. Все довольно быстро заостряли своё внимание и замечали фальшивки из длинного списка  "фактов обмана" и после двух - трех разоблаченных фейковых доводов, остальные уже не рассматривали, вынося окончательный вердикт. ))  Среди астрономов вообще нет "немогликов". И нет таких, кто бы не знал о полете Аполлона с высадкой на Луну. Ну это и понятно, почему. Я утверждал именно о вранье, а не о заблуждении.  А какое может быть у наших  специалистов заблуждение по Аполлону??? Это люди, далекие от космонавтики могут в чем то заблуждаться, а у наших академиков и докторов подобные заблуждения исключены. Точно!  Это философское словечко встречается ещё и в математике.   Да какая разница, имела или не имела редакционная коллегия полномочий выступать авторами ?????  Ты хочешь сказать, что в этой книге, отредактированной академиками и докторами, описана конструкция Сатурна,  Аполлона, которые не летали на Луну и ровера, который не бороздил просторов её поверхности??    Остальное, чистой воды демагогия. Это не моё. В книге имеются все ссылки на литературу.
    • Мдя... ИИ не обманешь. Любимый вами Яндекс видимо хорошо вас изучил и выдаёт то, что вам действительно надо. Смиритесь и не дёргайтесь.
    • Питать сетевую ламповую радиолу от батареек - глупость и утопия. Так как аутентичный внешний вид уже похерен  (), то никакой антикварной ценности аппарат не представляет. Поэтому предлагаю следующее: Найти на месте специалиста с руками и головой, который удалит из неё ламповое шасси и внедрит вместо него схему современного тюнера с усилителем, которая потребляет в десятки раз меньше энергии, да и ловит радиостанции куда лучше. Органы управления и переднюю панель при этом сохранить. Заодно и внутри куча места освободится, хоть автомобильный аккумулятор можно будет засунуть.

  • Ультразвуковой датчик расстояния HC-SR04

  • Similar Content

    • By Sambler
      У меня была похожая тема,  я решил проблему установив в include util/delay.h
      Но возникла еще одна ошибка, не могу понять, что оно хочет


      p.s. Я обещал, что предыдущая - последняя тема, но я ошибся, не думал, что тут 2 разные программы будут. В этот раз 100 процентов последняя тема и пойду сдавать работы Ы)

       

    • By Sambler
      Дана следующая программа и следующая схема.
      После запуска, циклично выдает одни и те же ошибка и до такой степени, что ПК не выдерживает нагрузку и приходится принудительно закрывать программу ( когда обычно, запустил программу и она не продолжает запускаться, а сразу указывает на ошибку в коде, а тут она даже не останавливается )
      При создании проекта выбираю WINAvr!!!



      Я не могу остановить симуляцию, приходится закрывать принудительно.
      Z
    • Guest Василий
      By Guest Василий
      Кто  может  помочь с примером  программирования в  программе  LDmicro  ?  Интересует  как  программировать   PWM выход  ? Хотелось  бы   увидеть  наглядный  пример  может  кто  знает ! Буду  рад  любой  информации !!!
    • By Atreides
      Добрый день. Мне требуется реализовать программный юарт на атмеге16. Он нужен для того, чтобы принятые по нему данные отправить на аппаратный юарт. В интернете нашел примеры кода, но понять его мне трудно. Прошу вас словами в общих чертах объяснить принцип реализации программного юарта. Буду рад примерам, которые, на ваш взгляд, являются наиболее простыми и понятными. Заранее спасибо.
    • Guest Константин
      By Guest Константин
      Приветствую всех! Прошу помощи у вас, форумчане в программировании системы из 2х контроллеров atmega16, суть системы заключается в:
      Есть мастер и слэйв, это два отдельных омк
      всего 1 мастер и 2 слэйва
      Что входит в мастер: 1)настойка времени путем набора из 8 4 2 и 1 минуты(кнопки), выбор адреса, те кому будет послан сигнал, 1 или 2 слэйву, индикация ответа( красный диод если не ответил, зеленый если ответил в течении заданного времени), если ответ есть - зеленый, если ответа нет красный и кнопка полного сброса всех указаний, те возврат к исходной точке где никто не опрашивается
      Что входит в слэйв, это кнопка подтверждения, визуализация таймера ( те 4 диода, когда 1/4 времени прошла 1 тухнет итд) и если кнопка не нажата отправка информации о аларме
      собственно все
      те
      1 ввод адреса и времени
      2 отправка сигнала
      3 сигнал есть?
      3.1 (нет) аларм
      3.2 (зелень)
      Заранее благодарю!
      (popovkostya96@icloud.com)
×
×
  • Create New...