Форум по микроконтроллерам: Avr Video Terminal - Форум по микроконтроллерам

Перейти к содержимому

Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

Avr Video Terminal Вывод изображения на экран телевизора или монитора с Atmega 16 / 32

#1 Пользователь офлайн   bwc 

  • Новичок
  • Pip
  • Группа: Пользователи
  • Сообщений: 2
  • Регистрация: 17 Июль 13

Отправлено 17 Июль 2013 - 16:30

Всем привет!!!
Я здесь новенький, да и с контроллерами avr знакомство начал совсем недавно,
но решил сразу прыгнуть выше своей головы, выбрав проект поинтересней, да и посложнее,
не то что-бы мне это сильно хочется, просто это необходимость, надо для работы,
нужно собрать небольшой блок управления станочным комплексом, причем не одним,
планировалось что блок будет работать на интерпретаторе БЭЙСИКа,
ну в общем так и получается, только мне пришлось написать свой интерпретатор,
и свой диалект языка, специально заточив его под свои потребности,
благо опыт в написании интерпретаторов не маленький, ну да ладно,
вопрос вот в чем:
Необходимо организовать вывод данных на экран телевизора, или монитора,
начало положено,у меня есть небольшой проект, который выводит картинку на экран тв, но:

1. Не получается сделать вывод текста динамически, получается только вывод текста, который при старте находились во флешь памяти контроллера, по ходу пьесы текст менять не получается, хотя в коде есть секции в которых все же можно изменить текст на экране, но нарушаются тайминги видео...

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

Схема и проект в AVR Studio я прикрепил.

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

Прикрепленные изображения

  • Прикрепленное изображение: simple-vga_correct.JPG

Прикрепленные файлы

  • Прикрепленный файл  AVRGCC1.zip (46,22К)
    Количество загрузок:: 35

0

#2 Пользователь офлайн   bwc 

  • Новичок
  • Pip
  • Группа: Пользователи
  • Сообщений: 2
  • Регистрация: 17 Июль 13

Отправлено 17 Июль 2013 - 19:29

#include <avr/io.h>
#include <util/delay.h>
#include <avr/signal.h>
#include <avr/sleep.h>
#include <avr/pgmspace.h>
#include <string.h>
#include <compat/deprecated.h>
#include "symbol_tbl.h"

#define true 1
#define false 0
#define NOP asm("nop")

//Global defenitions for render PAL
#define pal_field_line_count 312//standart PAL/SECAM quantity lines (interlaced 625~312*2)
#define pal_symbol_height 12 //rendered symbol height
#define pal_symbols_per_row 39 //symbols quantity per horizontal
#define pal_row_count 22                 //symbols quantity per vertical
//Makro for video handle
//Video
#define video_off DDRB=0x90
#define video_on DDRB=0xB0

#define check_jumper bit_is_clear(PINC,1)

//Глобальные переменные
volatile unsigned char str_array[pal_symbols_per_row*pal_row_count+1]; //Chars array for display buffer
volatile unsigned int current_symbol; //Current symbol number at terminal
volatile unsigned char video_enable_flg;//flag for enable render
volatile unsigned char raw_render;//Current row at display buffer for render
volatile unsigned int linecount;// current line for render
volatile unsigned char y_line_render; //Current Y-line at symbol for render
volatile unsigned char dd;


uint8_t help_text[] PROGMEM = {
"AVR command shell v1.0  \r\n\
Currently supports three commands: \r\n\
help - display this help;        \r\n\
listarg - lists its arguments;   \r\n\
led <color> <state> - control LEDs. \r\n\
\t color: green/blue;    \r\n\
\t state: on/off/blink/noblink   \r\n"
};


static void avr_init(void);
//Вся PAL синхронизация происходит сдесь..
SIGNAL(SIG_OUTPUT_COMPARE1A)
{

//количество номеров в строке

if (++linecount == pal_field_line_count)
{
linecount = 0;
//clear pointers for render display buffer
raw_render = 0;
y_line_render = 0;
}

//Invert HSYNC for VSYNC

if (linecount > 300 && linecount < 322)
{
//Make here vertical syncronization

sbi(PORTC,0); //inverted syncro level on
char i = 10;
while (--i)
{ NOP;}
//And "black" = 8 mksk;
cbi(PORTC,0); //inverted syncro level off
         }
else
{
//СМЕЩЕНИЕ
cbi(PORTC,0); //ВКЛЮЧАЕМ УРОВЕНЬ СИНХРОНИЗАЦИИ
char i = 15;
while (--i)
{ NOP;}
//And "black" = 8 mksk;
sbi(PORTC,0); //ОТКЛЮЧАЕМ УРОВЕНЬ СИНХРОНИЗАЦИИ
}


video_enable_flg = true;
if ((linecount < 20) || (linecount > 270))
{
video_enable_flg = false;
        
         //Add to avoid flickering at top display
        
        
         NOP;
         NOP;
         NOP;
        
        
}
else
{
         //Forming current string for rendering
         if (++y_line_render == pal_symbol_height)
         {
         raw_render++;
         y_line_render = 0;
         }
         else
         {
        
         NOP;
         NOP;
         NOP;
         NOP;
         NOP;
         NOP;
         NOP;
         NOP;
         }

}
}
void spi_init (void)
{
//Set SPI PORT DDR bits
sbi(DDRB, 7); //SCK
cbi(DDRB, 6); //MISO
sbi(DDRB, 1); //MOSI
sbi(DDRB, 4); //SS
SPSR = 1 << SPI2X;
SPCR = (1 << SPE) | (1 << MSTR); //SPI enable as master ,FREQ = fclk/2
}
static void uart_inits(void)
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
UCSRC = 0x86; //8 bits data & 2 stop bits
//UART SPEED 19200 bs
UBRRL = 0x33; //set baud rate lo
UBRRH = 0x00; //set baud rate hi
UCSRB = (1 << RXEN);
UCSRA = (1 << TXEN);

}

void send_char(char c)
{
UDR = c;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void s_print(y,x,data)
{
if( y<23 )
{
if( x<40 )
{
const char str0 = data;
str_array[pal_symbols_per_row * y + x]=str0;
}
}
}

char *string_print(char y, char x, char *line )
{
char i;
i=strlen(line);

while(i--)
{

s_print(y,i+x,line[i]);

//str_array[pal_symbols_per_row * y + x + i]=line[i];
//line = 0;
}

}


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void pal_render(void)
{
unsigned char i;
char * _ptr;
const char * _ptr1;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////////////////////
asm ("sei");
for(;;)/>/>
{
//Wait compare interrupt signal from Timer1
sleep_mode();

//Увеличение ширины изображения с левой стороны
i=12;
while(i--) NOP;

//Check visible field
if(video_enable_flg)
{
//OK, visible
//Main render routine
_ptr = &str_array[raw_render * pal_symbols_per_row];
_ptr1 = &symbol[0][y_line_render];

//Cycle for render line
i = pal_symbols_per_row;
video_on;
while(i--)
{
        
         SPDR = pgm_read_byte_near(_ptr1 + (* _ptr++)*pal_symbol_height);
        
         //That's a great pity can't shift data faster (8Mhz at FOSC=16Mhz)!!
         _delay_us(-1);
         _delay_us(-1);
         _delay_us(-1);
        
        
}
//Увеличение ширины изображения с правой стороны
i=10;
while(i--) NOP;

video_off;

}
else
{


s_print(1, 1, dd);



}


}//for(;;)/>/>
}


static void avr_init(void)
{
//Set pin jumper VGA/PAL
cbi(DDRC,1);
sbi(PORTC,1);

//Enable SPI
spi_init();
//init uart
uart_inits();
//Set power mode
set_sleep_mode(SLEEP_MODE_IDLE);
//init PAL SYNC port
sbi(DDRC,0);
//C.0 is sync:1000 ohm + diode to 75 ohm resistor
//MOSI is video:330 ohm + diode to 75 ohm resistor

// Initialize Sync for PAL
OCR1A = 1024;    //One PAL line 64us
TCCR1B = (1<<WGM12)|(1<<CS10);//full speed; clear-on-match
TCCR1A = 0x00; //turn off pwm and oc lines
TIMSK = 1<<OCIE1A; //enable interrupt from Timer1 CompareA
return;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

int main(void)
{


avr_init();
pal_render();

general_bitmap_drow();
return(0);
}






void general_bitmap_drow()
{
char i;
for(;;)/>/>
{
i++;
dd = i;
}
}



Речь идет о переменной dd, она вроде как глобальная переменная...

Не могу понять, если я пытаюсь задать значение переменной в цикле в функции main то оно вроде как не задается, хотя точно не знаю, но я пытаюсь вывести значение на экран, а результата 0....

Не понимаю...
0

Поделиться темой:


Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей