Например TDA7294

Форум РадиоКот • Просмотр темы - CodeVision AVR в вопросах и ответах
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Сб сен 20, 2025 15:37:58

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 8297 ]     ... , , , 304, , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Ср апр 02, 2014 20:25:36 
Встал на лапы

Зарегистрирован: Ср дек 29, 2010 21:19:03
Сообщений: 147
Рейтинг сообщения: 0
isx писал(а):
Д в том то и дело, что я только присваиваю ей значение и все.
Присваиваю countob = 65536; а протеус показывает "0". Вместо 65538 показывает 2 и т.д..

Добавьте переменную в Watch Window по адресу, установите нужный размер - 4 байта в Вашем случае, будет отображать корректно.
Изображение


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Ср апр 02, 2014 20:49:27 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 11
Рейтинг сообщений: 26
Зарегистрирован: Вс июн 26, 2011 20:03:21
Сообщений: 2316
Рейтинг сообщения: 0
Ошибка выходит... (

Изображение


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Ср апр 02, 2014 20:51:51 
Встал на лапы

Зарегистрирован: Ср дек 29, 2010 21:19:03
Сообщений: 147
Рейтинг сообщения: 0
адрес традиционно задается в 16-ричном виде - 0x1234. Ну и соответственно нам нужна data memory


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Чт апр 03, 2014 08:32:34 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1430
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4575
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
isx писал(а):
Д в том то и дело, что я только присваиваю ей значение и все.
Присваиваю countob = 65536; а протеус показывает "0". Вместо 65538 показывает 2 и т.д..
Протеус unsigned long отображает как 2-х байтную - это глюк протеуса. Объявите её как signed long и будет отображаться нормально.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Чт апр 03, 2014 10:56:39 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 21
Рейтинг сообщений: 143
Зарегистрирован: Сб фев 21, 2009 13:11:40
Сообщений: 1900
Откуда: Москва
Рейтинг сообщения: 0
igumich писал(а):
Всплыла другая проблема! vol=0 vol=1... и т.д. до vol=10, далее крутим назад vol=90 vol=80...
а нолик после того как "10" написали, кто стирать будет? ай-яй-яй!))))

_________________
Ставим плюсы: )


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Вс апр 06, 2014 20:04:33 
Встал на лапы

Зарегистрирован: Сб ноя 06, 2010 19:17:02
Сообщений: 100
Откуда: Россия, Омск
Рейтинг сообщения: 0
ibiza11 писал(а):
igumich писал(а):
Всплыла другая проблема! vol=0 vol=1... и т.д. до vol=10, далее крутим назад vol=90 vol=80...
а нолик после того как "10" написали, кто стирать будет? ай-яй-яй!))))

всё получилось, но вот есть ещё одна загвоздка. понять никак не могу.
вот код
#include <mega8.h> //библиотека ввода\вывода
#include <delay.h> //библиотека задержки
#asm //сообщаем куда подключен датчик
.equ __w1_port=0x15; PORTC
.equ __w1_bit=3
#endasm
#asm //сообщаем куда подключён экран
.equ __lcd_port=0x12 ;PORTD
#endasm
#include <lcd.h> //библиотека для LCD
#include <1wire.h> //библиотека работы с 1Wire
#include <ds18b20.h> //библиотека для работы с датчиком ds18b20
#include <stdio.h> //ненаю что за библиотека, но без неё неполучается
unsigned int sek; // переменная сек.
unsigned int min; // пересенная мин.
unsigned int hour; // переменная часов
// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void) // таймер выставлен на частоту 1 Гц
{
// Place your code here
TCNT1H=0;
TCNT1L=0;
sek++; // инкрементируем секунду

}
unsigned char devices; //переменная в которой количество присоеденённых датчиков

int temp;
char lcd_buffer[33]; //масив с данными для экрана
void main(void)
{
PORTC=0x03;
DDRC=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 7,813 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x1E;
OCR1AL=0x85;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

//переменная для хранения температуры
lcd_init(16);
//инициилизация LCD, и говорим что он на 16 символов
devices=w1_init(); //ищим датчики
#asm("sei")


while(1) //бесконечный цикл, если датчик подключон
{
temp=ds18b20_temperature(0); //читаем температуру
if (temp>1000) //если датчик выдаёт больше 1000
{
temp=4096-temp; //отнимаем от данных 4096
temp=-temp; //и ставим знак "минус"
}

if (temp<=25)
{

sprintf(lcd_buffer,"ALARM");
lcd_gotoxy(0,1);
lcd_puts(lcd_buffer);
}





sprintf(lcd_buffer,"t=%i.%u\xdfC",temp,temp%1); //записуемв масив для экрана температуру
lcd_gotoxy(4,0);
lcd_clear();
lcd_puts(lcd_buffer);
delay_ms(50);



// роботаем с кнопками
if (PINC.0==0) // если нажата первая кнопка
{
delay_ms(20); // задержка 1/4 сек. (для удобства) выбора
min++; // к значению минуты добавляем еденицу
}
if (PINC.1==0) // если нажата вторая кнопка
{
delay_ms(20); // задержка 1/4 сек. (для удобства) выбора
hour++; // к значению часов добавляем еденицу
}
///// Условия часов.
if(sek==60) // если сек = 60
{
min++; // добавляем 1 к переменной "минута"
sek=0; // зануляем переменную "секунда"
}
if(min==60) // если мин = 60
{
hour++; // добавляем 1 к переменной "час"
min=0; // зануляем переменную "минута"
}
if (hour==24) // так как у нас часы имеют 24 часовый формат
{ // при достыжении 24 часов, онулируем все переменные.
hour=0;
min=0;
sek=0;
}
// выводим переменные
lcd_gotoxy(8,1);
lcd_putchar(hour/10+0x30);
lcd_putchar(hour%10+0x30);
lcd_putchar(':');
lcd_putchar(min/10+0x30);
lcd_putchar(min%10+0x30);
lcd_putchar(':');
lcd_putchar(sek/10+0x30);
lcd_putchar(sek%10+0x30);
};

}

Проблема такая. Температуру отображает нормально, но вот время... все цифры моргают раз в секунду и при настройке часов и минут прибавляет с задержкой раз в секунду,если зажать соответствующую кнопку. хотя задержка на кнопках такая что по идее цифры должны "летать". никак не могу разобраться, кажется я что-то напутал с while(1)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Вс апр 06, 2014 20:44:57 
Это не хвост, это антенна
Аватар пользователя

Карма: 11
Рейтинг сообщений: 1
Зарегистрирован: Пт фев 19, 2010 19:39:28
Сообщений: 1451
Откуда: Москва
Рейтинг сообщения: 0
Так все правильно. Вывод информации на экран у вас происходит примерно раз в секунду( зависит от того, сколько настроено время конвертирования температуры датчика). А вот изменение переменной происходит практически мнгновенно. Хотите что бы цифры менялись почти сразу? - Запихните вывод на экран в таймер... Правда чувство у меня, что время со временем будет отставать :) если конечно не запустить другой таймер... Но это уже совсем другая история :))


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Вс апр 06, 2014 20:51:38 
Встал на лапы

Карма: 1
Рейтинг сообщений: 1
Зарегистрирован: Пн фев 22, 2010 11:16:00
Сообщений: 89
Рейтинг сообщения: 0
Добрый день. Подскажите пожалуйста в чём может быть подвох? Подключаю модуль часов DS1302 стандартной библиотекой CodeWision .
Изображение
В протеусе работает как надо а в железе данные возвращаются с ошибкой вот лог терминала
Second = 12
Second = 92
Second = 124
Second = 144
Second = 14
Second = 94
Second = 18
Second = 98
Second = 92
Second = 132
Second = 20
Second = 100
Second = 126
Second = 146
Second = 22
Second = 102
Пробовал заваливать ардуиновский скетч, так с ним часы работают как часы.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Вс апр 06, 2014 20:53:18 
Это не хвост, это антенна
Аватар пользователя

Карма: 11
Рейтинг сообщений: 1
Зарегистрирован: Пт фев 19, 2010 19:39:28
Сообщений: 1451
Откуда: Москва
Рейтинг сообщения: 0
Экстрасенсы есть? А настрадамусы? А...
Может коТ выложите?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Вс апр 06, 2014 20:57:56 
Встал на лапы

Карма: 1
Рейтинг сообщений: 1
Зарегистрирован: Пн фев 22, 2010 11:16:00
Сообщений: 89
Рейтинг сообщения: 0
Пардон.


Вложения:
Новая папка (6).rar [109.76 KiB]
Скачиваний: 178
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Вс апр 06, 2014 21:06:38 
Встал на лапы

Зарегистрирован: Сб ноя 06, 2010 19:17:02
Сообщений: 100
Откуда: Россия, Омск
Рейтинг сообщения: 0
Сериг писал(а):
Так все правильно. Вывод информации на экран у вас происходит примерно раз в секунду( зависит от того, сколько настроено время конвертирования температуры датчика). А вот изменение переменной происходит практически мнгновенно. Хотите что бы цифры менялись почти сразу? - Запихните вывод на экран в таймер... Правда чувство у меня, что время со временем будет отставать :) если конечно не запустить другой таймер... Но это уже совсем другая история :))


а что влияет на моргание отображения часов, и прибавляет переменные часов и минут(от кнопок) раз в секунду, когда в задержке 20мс. я этот момент понять не могу!

если я делаю вот так

while(1)
{
всё что к датчику и отображение температуры
while(1)
{
всё что к часам...
}
}

то у меня часы идут нормально и настройка часов и минут "летит", а вот температуру показывает ту, которая была зафиксирована в момент подачи питания на контроллер, и более не реагирует на изменения


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Вс апр 06, 2014 21:30:13 
Это не хвост, это антенна
Аватар пользователя

Карма: 11
Рейтинг сообщений: 1
Зарегистрирован: Пт фев 19, 2010 19:39:28
Сообщений: 1451
Откуда: Москва
Рейтинг сообщения: 0
Объясняю первый пункт вашего сообщения:
Вы опрашиваете датчик температуры в основном цикле. Он требует по максимуму 800 миллисекунд. После чего вы считываете температуру и выводите на дисплей. Дальше выводите состояние переменных времени. И так по кругу. Как вы можете видеть, каждый такой <<цикл>> имеет задержку в 800 миллисекунд (0,8 секунды), следовательно вывод на дисплей у вас будет происходить каждые примерно 800 мС. Если вы хотите мнгновенного отображения на дисплее состояния - сделайте вывод в прерывание, там же и опрашивайте кнопки! А вот опрос датчика пусть весит в основном цикле. Тем самым вы добьетесь:
Постоянное обновление отображения информации на экране, плюс опрос датчика температуры чуть меньше чем раз в секунду. " если я делаю вот так..." Вот так - это как? Код в студию!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Вс апр 06, 2014 21:41:43 
Встал на лапы

Зарегистрирован: Сб ноя 06, 2010 19:17:02
Сообщений: 100
Откуда: Россия, Омск
Рейтинг сообщения: 0
Сериг писал(а):
" если я делаю вот так..." Вот так - это как? Код в студию!



#include <mega8.h> //библиотека ввода\вывода
#include <delay.h> //библиотека задержки
#asm //сообщаем куда подключен датчик
.equ __w1_port=0x15; PORTC
.equ __w1_bit=3
#endasm
#asm //сообщаем куда подключён экран
.equ __lcd_port=0x12 ;PORTD
#endasm
#include <lcd.h> //библиотека для LCD
#include <1wire.h> //библиотека работы с 1Wire
#include <ds18b20.h> //библиотека для работы с датчиком ds18b20
#include <stdio.h> //ненаю что за библиотека, но без неё неполучается
unsigned int sek; // переменная сек.
unsigned int min; // пересенная мин.
unsigned int hour; // переменная часов
// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void) // таймер выставлен на частоту 1 Гц
{
// Place your code here
TCNT1H=0;
TCNT1L=0;
sek++; // инкрементируем секунду

}
unsigned char devices; //переменная в которой количество присоеденённых датчиков

int temp;
char lcd_buffer[33]; //масив с данными для экрана
void main(void)
{
PORTC=0x03;
DDRC=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 7,813 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x1E;
OCR1AL=0x85;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

//переменная для хранения температуры
lcd_init(16);
//инициилизация LCD, и говорим что он на 16 символов
devices=w1_init(); //ищим датчики
#asm("sei")


while(1) //бесконечный цикл, если датчик подключон
{
temp=ds18b20_temperature(0); //читаем температуру
if (temp>1000) //если датчик выдаёт больше 1000
{
temp=4096-temp; //отнимаем от данных 4096
temp=-temp; //и ставим знак "минус"
}

if (temp<=25)
{

sprintf(lcd_buffer,"ALARM");
lcd_gotoxy(0,1);
lcd_puts(lcd_buffer);
}





sprintf(lcd_buffer,"t=%i.%u\xdfC",temp,temp%1); //записуемв масив для экрана температуру
lcd_gotoxy(4,0);
lcd_clear();
lcd_puts(lcd_buffer);
delay_ms(50);

while(1)
{

// роботаем с кнопками
if (PINC.0==0) // если нажата первая кнопка
{
delay_ms(20); // задержка 1/4 сек. (для удобства) выбора
min++; // к значению минуты добавляем еденицу
}
if (PINC.1==0) // если нажата вторая кнопка
{
delay_ms(20); // задержка 1/4 сек. (для удобства) выбора
hour++; // к значению часов добавляем еденицу
}
///// Условия часов.
if(sek==60) // если сек = 60
{
min++; // добавляем 1 к переменной "минута"
sek=0; // зануляем переменную "секунда"
}
if(min==60) // если мин = 60
{
hour++; // добавляем 1 к переменной "час"
min=0; // зануляем переменную "минута"
}
if (hour==24) // так как у нас часы имеют 24 часовый формат
{ // при достыжении 24 часов, онулируем все переменные.
hour=0;
min=0;
sek=0;
}
// выводим переменные
lcd_gotoxy(8,1);
lcd_putchar(hour/10+0x30);
lcd_putchar(hour%10+0x30);
lcd_putchar(':');
lcd_putchar(min/10+0x30);
lcd_putchar(min%10+0x30);
lcd_putchar(':');
lcd_putchar(sek/10+0x30);
lcd_putchar(sek%10+0x30);
};


}

}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Вс апр 06, 2014 21:46:30 
Встал на лапы

Зарегистрирован: Сб ноя 06, 2010 19:17:02
Сообщений: 100
Откуда: Россия, Омск
Рейтинг сообщения: 0
Время нормально, а вот изменения температуры нет. если сначала нагреть датчик, потом подать питание на контроллер, то покажет ту температуру, которую зафиксировал в момент включения, дальнейшие изменения температуры не отображаются


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Вс апр 06, 2014 22:09:53 
Это не хвост, это антенна
Аватар пользователя

Карма: 11
Рейтинг сообщений: 1
Зарегистрирован: Пт фев 19, 2010 19:39:28
Сообщений: 1451
Откуда: Москва
Рейтинг сообщения: 0
Я вижу у вас два подряд бесконечных цикла, причем из которых вы не выходите. В этом и ошибка, судя по всему вы попадаете в цикл обработки кнопок, хотя я не понимаю как. Бесконечный цикл в данном случае у вас должен быть один. Исправляйте!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Вс апр 06, 2014 22:17:25 
Встал на лапы

Зарегистрирован: Сб ноя 06, 2010 19:17:02
Сообщений: 100
Откуда: Россия, Омск
Рейтинг сообщения: 0
я уже всю голову сломал! :( ничего сообразить не могу. помоги куском кода, просто мне как-то трудно на словах воспринять...
а если сделать 2 бесконечных цикла. отдельно на температуру и отдельно на время?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Вс апр 06, 2014 22:25:22 
Это не хвост, это антенна
Аватар пользователя

Карма: 11
Рейтинг сообщений: 1
Зарегистрирован: Пт фев 19, 2010 19:39:28
Сообщений: 1451
Откуда: Москва
Рейтинг сообщения: 0
То микроконтроллер зависнет в первом. Если конечно нет из нее выхода методом return/brake...
Извинтиляюсь, какой тебе кусок кода надо? Как бы я сделал? Я бы сделал через таймер и тд... Тогда ты уже точно ничего не поймешь!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Пн апр 07, 2014 13:43:11 
Нашел транзистор. Понюхал.

Зарегистрирован: Сб янв 20, 2007 20:44:33
Сообщений: 164
Откуда: Из закаулков вашей души
Рейтинг сообщения: 0
Подскажите как в CVAVR директивами предпроцессора описать следующию структуру:

если микроконтроллер ATMEGA8 то TXSize=32
если микроконтроллер ATMEGA16 то TXSize=64
в остальных случаях TXSize=64

Нужно для того чтобы каждый раз не переписывать свою библиотеку под каждый МК


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Пн апр 07, 2014 14:27:56 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 21
Рейтинг сообщений: 143
Зарегистрирован: Сб фев 21, 2009 13:11:40
Сообщений: 1900
Откуда: Москва
Рейтинг сообщения: 0
Код:
#define ATMEGA8
// #define ATMEGA16

//...
#undef TXSize

#ifdef ATMEGA8
#define TXSize 32
#endif

#ifdef ATMEGA16
#define TXSize 64
#endif 

_________________
Ставим плюсы: )


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Пн апр 07, 2014 15:07:35 
Нашел транзистор. Понюхал.

Зарегистрирован: Сб янв 20, 2007 20:44:33
Сообщений: 164
Откуда: Из закаулков вашей души
Рейтинг сообщения: 0
Не совсем подходит т.к. одну и туже библиотеку пользуют несколько МК одновременно, может есть вариант с управлением из main.c?


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 8297 ]     ... , , , 304, , , ...  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 40


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y