Jump to content

Zodiac21

Members
  • Content Count

    82
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Zodiac21

  • Rank
    Осваивающийся

Информация

  • Пол
    Мужчина
  • Интересы
    IT, Электроника

Электроника

  • Стаж в электронике
    3-5 лет
  • Сфера радиоэлектроники
    микроконтроллеры

Recent Profile Visitors

2345 profile views
  1. Добрый день! Ребята, нет ли ни у кого примера работы с памятью AT25F1024 или подобной для Atmega8. Желательно под CVAVR... Заранее благодарю...
  2. Закомментировал условие ,появляються коды при нажатии на кнопки пульта, но какие-то не правильные...
  3. Спасибо! Буду пробовать. А таймер T1, я правильно настроил на прерывание 560мкс?
  4. Изменил переменную, прошил мегу, всё равно ничего не отображает... А вообще, код правильный??? Кварц стоит на 16мгц. Предделитель 1
  5. Всем доброго дня! Ребята, не подскажите как декодировать сигнал с ик пульта (работающего по протоколу Nec). Прерывание T1 срабатывает, внешнее прерывание INT0 тоже срабатывает все 33 значения записываются в массив ir_signal. А вот в функции ir_decode почему-то не выполняется условие оператора IF , а выполняется ELSE...? #include <io.h> #include <delay.h> #include <alcd.h> #include <stdio.h> unsigned char signal_time; static unsigned char ir_ok,ir_decode_ok; unsigned char ir_code[4]; // Массив для хранения значений адресов и команд unsigned char ir_signal[33]; // Массив для хранения значений интервалов // Прерывание по совпадению T1(каждые 560мкс) interrupt [TIM1_COMPA] void timer1_compa_isr(void) { signal_time++; // Счетчик интервалов } // Внешнее прерывание по INT0 interrupt [EXT_INT0] void ExtInt0(void) { // Определяем начало приема посылки if(signal_time > 9) // (4,5ms+562us)/560 = 9 x = 0; // Выбираем первый интервал ir_signal[x] = signal_time; // Записываем в буфер значения интервалов signal_time = 0; // Обнуляем счетчик интервалов x++; // Следующий интервал if(x == 33) // Если все интервалы приняты { ir_ok = 1; // Устанавливаем флаг окончания приема сигнала } } // Функция декодирования сигнала void ir_decode(void) { unsigned char j; unsigned char i; unsigned char k = 0; unsigned char signal_length,value = 0; for(i = 0; i < 4; i++) // Обработка байтов адреса или команды { for(j = 0; j < 8; j++) // Обработка 8-ми битов адреса или команды { k++; value = value >> 1; // Сдвигаем биты вправо signal_length = ir_signal[k]; // Выбираем следущее значение интервала if(signal_length > 4) // Если интервал больше (1,675ms+562us)/560 = 4 value = value | 0x80; // Добавляем к старшему разряду единицу } ir_code[i] = value; // Запоминаем в буфере байт адреса или команды //value = 0; // Обнуляем значение адреса или команды } // Производим явное приведение типов и проверяем принятые байты if(((unsigned char)ir_code[0] == (unsigned char)~ir_code[1]) && ((unsigned char)ir_code[2] == (unsigned char)~ir_code[3])) { ir_decode_ok = 1; // Устанавливаем флаг окончания декодирования сигнала ir_ok = 0; // Сбрасываем флаг окончания приема сигнала } else { ir_decode_ok = 0; // Сбрасываем флаг окончания декодирования сигнала ir_ok = 0; // Сбрасываем флаг окончания приема сигнала } } void main(void) { PORTD.2=1; DDRD.2=0; MCUCR |= (1 << ISC01); // Внешнее прерывание по заднему фронту GICR |= (1 << INT0); // Разрешение внешнего прерывния по INT0 TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10); TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (1<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10); TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x22; OCR1AL=0xFF; OCR1BH=0x00; OCR1BL=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (1<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<TOIE0); lcd_init(16); // Инициализация ЖК дисплея lcd_gotoxy(0, 0); lcd_puts("Test"); lcd_gotoxy(0, 1); lcd_puts("Decoder 'NEC'"); delay_ms(500); #asm ("sei") // Глобально разрешаем прерывания while(1) { if(ir_ok) ir_decode(); // Если сигнал принят, декодируем его if(ir_decode_ok) // Если обработка сигнала завершена, выводим данные на дисплей { lcd_gotoxy(0,1); lcd_putchar(ir_code[0]/10+0x30); lcd_gotoxy(1,1); lcd_putchar(ir_code[0]%10+0x30); lcd_gotoxy(2,1); lcd_putchar(ir_code[1]/10+0x30); lcd_gotoxy(3,1); lcd_putchar(ir_code[1]%10+0x30); lcd_gotoxy(4,1); lcd_putchar(ir_code[2]/10+0x30); lcd_gotoxy(5,1); lcd_putchar(ir_code[2]%10+0x30); lcd_gotoxy(6,1); lcd_putchar(ir_code[3]/10+0x30); lcd_gotoxy(7,1); lcd_putchar(ir_code[3]%10+0x30); ir_decode_ok = 0; // Сбрасываем флаг окончания декодирования сигнала } } }
  6. Добрый день. Ребята есть библиотека для lcd 3310... Решил я допилить функцию вывода изображений произвольного размера в любом месте, по такому алгоритму: void icons(flash unsigned char*icondata,char x,char y,char width) { unsigned int i; unsigned int LcdIdx; // индекс в массиве LcdIdx=(y-1)*84+(x-1)*6; for(i=LcdIdx; i<LcdIdx+width; i++) LcdCache[i]= icondata[i-LcdIdx]; Потом в основном цикле вызываем эту функцию , указываем название массива с изображением, координаты по оси x, по оси y и ширину изображения... Если изображение допустим 16*8 все хорошо.А вот если изображение 16*16 , как сделать что-бы значения в массиве начиная с 17 по 32 переносились на следующую строку.??? n3310lcd.c
  7. Да. Действительно, датчик нужная вещь. Про него как-то забыл...
  8. Огромное СПАСИБО!!! Сделал вот-так , всё заработало..... #include <io.h> #include <mega8.h> #include <delay.h> bit open=0; bit close=0; void main(void) { PORTD=0x00; DDRD=0xff; PORTB=0xff; DDRB=0x00; while (1) { if(PINB.0==0) { PORTD.0=1; PORTD.1=0; } if(PINB.1==0) { open=1; PORTD.0=0; } if(open==1&&PINB.0==0) { PORTD.0=0; PORTD.1=1; } if(PINB.2==0) { close=1; PORTD.1=0; } } }
  9. Ребята! Делаю я автоматические ворота на базе atmega8, и столкнулся с проблемой в прошивке..... Алгоритм работы таков: кратковременно нажимаем на кнопку "открытие/закрытие" ----- начинается открытие до срабатывания концевика открытия. нажимаем еще-раз, происходит закрытие до срабатывания концевика закрытия. #include <io.h> #include <mega8.h> #include <delay.h> int i=0; void main(void) { PORTD=0x00; DDRD=0xff; PORTB=0xff; DDRB=0x00; PORTD.0=0; while (1) { if(PINB.0==0) { delay_ms(100); i++; } \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ if(i==1) { PORTD.0=1; PORTD.1=0; } if(PINB.1==0) { PORTD.0=0; PORTD.1=0; } \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ if(i==3) { PORTD.0=0; PORTD.1=1; } if(PINB.2==0) { PORTD.0=0; PORTD.1=0; } \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ if(i>3) { i=0; } } } Всё-бы ничего, но есть одно НО... Допустим ворота открылись, концевик открытия нажался и удерживается... При этом не получается закрыть ворота , потому-что выполняется условие : if(PINB.1==0) { PORTD.0=0; PORTD.1=0; } Вот если кратковременно нажать на концевик то всё работает как надо....... Как быть-то???
  10. Уже разобрался. Запилил такую функцию, всё работает... void Send_Image (char x, char y, char width, char height, flash char *img) { unsigned int idx=0, size_array; lcd_write(CMD,0x2A); lcd_write16(x+2); lcd_write16(x+2+width-1); lcd_write(CMD,0x2B); lcd_write16(y+1); lcd_write16(y+1+height-1); lcd_write(CMD,0x2C); size_array= width * height; for (idx = 0; idx < size_array; idx++) { lcd_write(DATA, *img++); } }
  11. Ребятки, недавно начал работать с LCD от nokia 1616 на контроллере SPFD54124B, пробивал выводить текст- всё работает, а вот с выводом изображений никак не могу разобраться. Когда работал с LCD от nokia 1100 там я выводил изображения таким способом : flash unsigned char batt[8] = {0xFC,0x86,0x86,0x84,0x84,0x86,0x86,0xFC}; void image(char x, char y) { int i; nlcd_GotoXY(x,y); for ( i = 0; i < 8; i++ ) {nlcd_SendByte(DATA_LCD_MODE, batt[i]);} }; Потом в главном цикле вызывал эту функцию и указывал координаты..... А вот в LCD1616 пробивал записывать данные , и ничего не происходит........ Вот полный код: #include <mega8.h> #include <delay.h> #include <spi.h> #include <string.h> #include "DEFINE.h" flash unsigned char batt[8] = {0xFC,0x86,0x86,0x84,0x84,0x86,0x86,0xFC}; int i; void image () { for(i=0;i<8;i++) { lcd_write(DATA,batt[i]); } }; void main(void) { PORTB=0x00; DDRB=0xff; BACKLIGHT=0; lcd_init_rgb(); fill_screen(BLACK); while (1) { put_string(9, 60, "Hello", YELLOW,1); put_string(9, 80, "World!", RED,1); LCD_XY(9,100); image(); } } В прикрепленном файле библиотека с которой работаю..... lcd_1616.rar
  12. Уже библиотека не надо. Я переделал ту , что была под winavr...
  13. Спасибо огромное. Действительно дело было в обрыве дорожки. Ребята, что-бы не создавать новою тему, спрошу сдесь.: Нет ли у кого-нибудь библиотеки code vision для lcd 1100???? А то те что есть, под WinAvr...
  14. И еще заметил, что иногда, когда дотронешься до Reset-а, данные на дисплее на секунду появляются.....
×
×
  • Create New...