Код бегущей строки WH0802

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Прорезались зубы
Сообщения: 218
Зарегистрирован: Сб окт 02, 2010 19:06:46
Откуда: Красногорск

Сообщение m210 »

Что-то не получается особо, если ставить счетчик в while(1), тогда он меняется только когда закончится цикл бег.строки....если его ставвить в цикл бегущей строки, тогда значение меняется внутри цикла, но цикл опять же нельзя остановить
Реклама
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский

Сообщение phanis »

Пример реализации
Спойлер

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

/*************************************/
#include <mega8.h>
#include <lcd.h>
#include <delay.h>
#asm
   .equ __lcd_port=0x12; PORTD /* ЖКИ дисплей подключили к порту I/O D */
#endasm
#define	CLK		4000000		// Clock
#define Time_dev    (unsigned char)((CLK*0.01)/256) 

     

void put_scrolltext (flash unsigned char *intext); 
void scrolltext (void);
static unsigned char scroll_time,scroll,inter,len,del_time,time_10ms;   

flash unsigned char *text;    
   
void main(void)    /* Основная функция "main", с которой начинается выполнение всей программой процедуры */ 
{    
   lcd_init(16);
   lcd_clear();   
   //=== Timer T2 ===// Таймер реального времени.
       OCR2 =   Time_dev;                          // записать в регистр заранее подготовленоого значения 10msec
          TCCR2  = (0<< FOC2)|(0<<WGM20)|           // разрешить работу и прерывание  таймер2
                (0<<COM21)|(0<<COM20)|
                (1<<WGM21)|(1<< CS22)|
                (1<< CS21)|(0<< CS20);   
                 
       TIMSK  = (1<< OCIE2)|(0<< TOIE2)|           // маска разрешения прерываний по таймерам
                (0<<TICIE1)|(0<<OCIE1A)|
                (0<<OCIE1B)|(0<< TOIE1)|
                (0<< 0)    |(0<< TOIE0);
                
                #asm("sei");
                put_scrolltext("Bort voltage value = 25 V");
   while(1)
   {
   
   
     
 
 
 //-----------------//  
   if (time_10ms)
   {
   time_10ms = 0;
   if (len)
   {
   scrolltext ();
   }
   } 
   }
 //****************//
 
 
}

void put_scrolltext (flash unsigned char *intext)
{
len=inter=scroll_time=scroll=0;;
while (*(intext+len)) len++;
if (len > 8)text = intext;
  else   len= 0;
}

void scrolltext (void)
{
unsigned char i;

 if (del_time++>=100)
      {del_time= 0;
if (((inter++)+16)<=(len*2))
   {   
     
        
       lcd_gotoxy(0,0);
       for(i=0; i<8; i++) lcd_putchar(*(text+i+ scroll_time));                   
       
        if(scroll)scroll_time--; //движение в обратную сторону
        else scroll_time++; //движение справа-налево
     
        if ((scroll_time==0)||(scroll_time+8>= len) ) scroll^=1; 
       

    
        
 }else len =0;
 }
     
} 

interrupt [TIM2_COMP] void timer2_comp_isr(void)
{

time_10ms=1;
// Place your code here

}
Контактная информация:
Реклама
Прорезались зубы
Сообщения: 218
Зарегистрирован: Сб окт 02, 2010 19:06:46
Откуда: Красногорск

Сообщение m210 »

Спасибо за пример, с прерыванием никогда не приходилось работать, может делаю что-то не так. Использую atmega48, поэтому настройки прерывания пришлось додумывать самостоятельно :)
Настройки таймера у меня уже используются для ШИМ, оставил их пока как есть:

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

//Программа инициализации ШИМ
void init_pwm (void)
{
TCCR0A=0xF3; //timer 0 15,625 kHz Fast PWM top=FFh Inverted PWM out A/B
TCCR0B=0x03;               
TCCR2A=0xF3;
TCCR2B=0x04; //timer 2 15,625 kHz Fast PWM top=FFh Inverted PWM out A/B
TIMSK0=0x01; //для маски разрешения

B_channel = saveB;
G_channel = saveG;
R_channel = saveR;
P_channel = 0xFF;        
}
Далее у atmega48 немного отличается

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

interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
time_10ms=1;
}
Ну и теперь если я пишу put_scrolltext("Напряжение борт.сети"); в теле interrupt [TIM0_OVF] void timer0_ovf_isr(void) или while(1) то строка не двигается, если писать ее в начале загрузки main(void) как в Вашем примере, тогда строка пробегает один раз влево/вправо и останавливается, ну в общем то оно и понятно, дальше идет бесконечный цикл, МК занят им :)


P.S. Вывел на дисплей переменную time_10ms, переменная меняется...значит в таймере все ок
P.S.S. Хотел использовать для прерывания таймер1, но что-то с ним ничего не работает, оставлю пока на 0м
Ответить

Вернуться в «Периферия»