-
Постов
82 -
Зарегистрирован
-
Посещение
Тип контента
Профили
Форумы
Блоги
Весь контент Zodiac21
-
Добрый день! Ребята, нет ли ни у кого примера работы с памятью AT25F1024 или подобной для Atmega8. Желательно под CVAVR... Заранее благодарю...
-
Закомментировал условие ,появляються коды при нажатии на кнопки пульта, но какие-то не правильные...
-
Спасибо! Буду пробовать. А таймер T1, я правильно настроил на прерывание 560мкс?
-
Изменил переменную, прошил мегу, всё равно ничего не отображает... А вообще, код правильный??? Кварц стоит на 16мгц. Предделитель 1
-
Всем доброго дня! Ребята, не подскажите как декодировать сигнал с ик пульта (работающего по протоколу 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; // Сбрасываем флаг окончания декодирования сигнала } } }
-
Добрый день. Ребята есть библиотека для 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
-
Да. Действительно, датчик нужная вещь. Про него как-то забыл...
-
Огромное СПАСИБО!!! Сделал вот-так , всё заработало..... #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; } } }
-
Ребята! Делаю я автоматические ворота на базе 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; } Вот если кратковременно нажать на концевик то всё работает как надо....... Как быть-то???
-
Уже разобрался. Запилил такую функцию, всё работает... 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++); } }
-
Ребятки, недавно начал работать с 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
-
Как-то так, получилось....
-
Уже библиотека не надо. Я переделал ту , что была под winavr...
-
Спасибо огромное. Действительно дело было в обрыве дорожки. Ребята, что-бы не создавать новою тему, спрошу сдесь.: Нет ли у кого-нибудь библиотеки code vision для lcd 1100???? А то те что есть, под WinAvr...
-
И еще заметил, что иногда, когда дотронешься до Reset-а, данные на дисплее на секунду появляются.....
-
Ребята, недавно приобрел себе вот такой модуль, на замену оригинальному дисплею от nokia 3310... Подключил так-же как и к оригинальному подключал, но на дисплее пусто.... Хотя когда подключаю к оригинальному, все работает..... Библиотеку для lcd которую использую прилагаю......... n3310lcd.c
-
Получилось сделать следующим образом: void temperature(void) { temp[0]=ds18b20_temperature(&rom_codes[0][0]); temp[1]=ds18b20_temperature(&rom_codes[1][0]); if (temp[0]<0){ temp[0]=~temp[0]+1; data4=11; } if(temp[1]<0){ temp[1]=~temp[1]+1; data1=11; } data6 = temp[0]%10; data5 = temp[0]/10; data3 = temp[1]%10; data2 = temp[1]/10; } То есть проинвертировав значения переменной temp и прибавив 1....... Вроде всё работает........
-
Будьте добры, подскажите как на примере моего кода это организовать..... Вот я подключил эту функцию, а как дальше быть? #include <mega8.h> #include <delay.h> // DS1307 Real Time Clock functions #include <ds1307.h> #asm .equ __w1_port=0x15 ;PORTC .equ __w1_bit=2 #endasm #include <1wire.h> #include <ds18b20.h> #define MAX_DS1820 8 unsigned char rom_codes[MAX_DS1820][9]; //переменная хранения rom кодов int temp[8]; // переменная для хранения значений температуры unsigned char devices; // переменная для устройств #define DIG_BASE 10 /* основание системы считсления для перевода */ #define MAX_SIZE 6 /* максимальное число выводимых символов */ #define SPACE_CHAR ' ' /* символ "пустого" места */ #define NEG_CHAR '-' /* символ "минус" */ unsigned char out[MAX_SIZE]; // выходной массив символов (экранная область) flash char number[] = { 0x3f, //0 0x06, //1 0x5b, //2 0x4f, //3 0x66, //4 0x6d, //5 0x7d, //6 0x07, //7 0x7f, //8 0x6f, //9 0x00, //blank 0x40 // minus }; //числа для вывода на индикатор volatile unsigned char data1 = 10; volatile unsigned char data2 = 0; volatile unsigned char data3 = 0; volatile unsigned char data4 = 10; volatile unsigned char data5 = 0; volatile unsigned char data6 = 0; void temperature(void) { temp[0]=ds18b20_temperature(&rom_codes[0][0]); temp[1]=ds18b20_temperature(&rom_codes[1][0]); if (temp>1000){ temp[0]=4096-temp[0]; temp[0]=-temp[0]; } if(temp>1000){ temp[1]=4096-temp[1]; temp[1]=-temp[1]; } data6 = temp[0]%10; data5 = temp[0]/10; data3 = temp[1]%10; data2 = temp[1]/10; } void s_trim_convert(int NUM){ int i, m, sign = 0; if(NUM <0){ // если число отрицательное sign = 1; // установим признак наличия знака NUM *= -1; // а само число возьмем по модулю } // выводим уже положительное число i=MAX_SIZE-1; do{ // цикл заполнения выходного массива СПРАВА НАЛЕВО m = NUM % DIG_BASE; // находим остаток от деления числа на основание if((NUM==0)&&(i!=(MAX_SIZE-1))) break; // закончим цикл вывода числа else out[i] = number[m]; // иначе выводим символ нужной ЦИФРЫ NUM /= DIG_BASE; // уменьшаем число в DIG_BASE раз } while (--i >= 0); // число выведено, проверяем свободное место и выводим при необходимости знак if (i < 0) return; // места не хватает - выход if (sign) out[i--] = NEG_CHAR; // выводим знак, если нужно for(; i>=0;i--) out[i] = SPACE_CHAR; // очищаем незначащие позиции } void main( void ) { //порт, к которому подкл. сегменты PORTD = 0xff; DDRD = 0xff; PORTC=0xFF; DDRC=0x00; //порт, к которому подкл. катод PORTB = 0xff; DDRB |= (1<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(1<<0); //инициализация таймера Т0 TCCR0 = (1<<CS02)|(0<<CS01)|(1<<CS00); TCNT0 = 0xE6; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (1<<TOIE0); // Оприделение устройств devices=w1_search(0xf0,rom_codes); #asm("sei") while(1){ s_trim_convert(temp[0]); temperature(); } } //прерывания таймера Т0 - вывод на индикатор interrupt [TIM0_OVF] void Timer0Ovf(void) { static unsigned char count = 0; TCNT0 = 0xE6; //гасим все разряды PORTB |= (1<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(1<<0); //зажигаем следующий разряд if (count == 0) { PORTD = number[data1]; PORTB = ~(1<<0); } if (count == 1) { PORTD = number[data2]; PORTB = ~(1<<1); } if (count == 2) { PORTD = number[data3]; PORTB = ~(1<<2); } if (count == 3) { PORTD = number[data4]; PORTB = ~(1<<3); } if (count == 4) { PORTD = number[data5]; PORTB = ~(1<<4); } if (count == 5) { PORTD = number[data6]; PORTB = ~(1<<5); } count++; if (count == 6) count = 0; }
-
Изменил на int temp, результат тот-же.....
-
Ребята, я вот делаю термометр на atmega8 + ds18b20+ семисегментник, и столкнулся с такой вот проблемкой . Как реализовать вывод отрицательной температуры??? В моем коде, температуры те что выше 0 отображаются нормально, а вот те, что ниже , какие-то каркозяблы........ #include <mega8.h> #include <delay.h> #asm .equ __w1_port=0x15 ;PORTC .equ __w1_bit=2 #endasm #include <1wire.h> #include <ds18b20.h> #define MAX_DS1820 8 unsigned char rom_codes[MAX_DS1820][9]; //переменная хранения rom кодов unsigned char temp[8]; // переменная для хранения значений температуры unsigned char devices; // переменная для устройств flash char number[] = { 0x3f, //0 0x06, //1 0x5b, //2 0x4f, //3 0x66, //4 0x6d, //5 0x7d, //6 0x07, //7 0x7f, //8 0x6f, //9 0x00, //blank 0x40 // minus }; //числа для вывода на индикатор volatile unsigned char data1 = 0; volatile unsigned char data2 = 0; volatile unsigned char data3 = 0; volatile unsigned char data4 = 0; volatile unsigned char data5 = 0; volatile unsigned char data6 = 0; void temperature(void) { temp[0]=ds18b20_temperature(&rom_codes[0][0]); temp[1]=ds18b20_temperature(&rom_codes[1][0]); if (temp>1000){ temp[0]=4096-temp[0]; temp[0]=-temp[0]; data4 = 11; } if(temp>1000){ temp[1]=4096-temp[1]; temp[1]=-temp[1]; data1 = 11; } data6 = temp[0]%10; data5 = temp[0]/10; data4 = 10; data3 = temp[1]%10; data2 = temp[1]/10; data1 = 10; } void main( void ) { //порт, к которому подкл. сегменты PORTD = 0xff; DDRD = 0xff; PORTC=0xFF; DDRC=0x00; //порт, к которому подкл. катод PORTB = 0xff; DDRB |= (1<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(1<<0); //инициализация таймера Т0 TCCR0 = (1<<CS02)|(0<<CS01)|(1<<CS00); TCNT0 = 0xE6; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (1<<TOIE0); // Оприделение устройств devices=w1_search(0xf0,rom_codes); #asm("sei") while(1){ temperature(); } } //прерывания таймера Т0 - вывод на индикатор interrupt [TIM0_OVF] void Timer0Ovf(void) { static unsigned char count = 0; TCNT0 = 0xE6; //гасим все разряды PORTB |= (1<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(1<<0); //зажигаем следующий разряд if (count == 0) { PORTD = number[data1]; PORTB = ~(1<<0); } if (count == 1) { PORTD = number[data2]; PORTB = ~(1<<1); } if (count == 2) { PORTD = number[data3]; PORTB = ~(1<<2); } if (count == 3) { PORTD = number[data4]; PORTB = ~(1<<3); } if (count == 4) { PORTD = number[data5]; PORTB = ~(1<<4); } if (count == 5) { PORTD = number[data6]; PORTB = ~(1<<5); } count++; if (count == 6) count = 0; }
-
Спасибо огромное...
-
Судя по этой схеме при работающем генераторе на катушке реле будет присутствовать два плюса и на 85 и на 86 контакте....
-
Добрый день! Ребята не подскажите правильно ли подключается 86 контакт реле на + питания или на массу, потому как при запуске генератора на 85 контакте появиться +. ???
-
Спасибо, уже разобрался, темку можно закрыть.
-
Набросал такой код : #include <mega8.h> #include <stdio.h> #include <alcd.h> char lcd_buffer[30]; char i; // Timer1 output compare A interrupt service routine interrupt [TIM1_COMPA] void timer1_compa_isr(void) { i++; } void main(void) { // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 7,813 kHz // Mode: Normal top=0xFFFF // OC1A output: Disconnected // OC1B output: Disconnected // Noise Canceler: Off // Input Capture on Falling Edge // Timer Period: 8,3886 s // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: On // Compare B Match Interrupt: Off TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10); TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (1<<CS12) | (0<<CS11) | (1<<CS10); TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x1E; OCR1AL=0x83; 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); #asm("sei") while (1) { lcd_gotoxy(0,0); sprintf(lcd_buffer,"i=%d",i); lcd_puts(lcd_buffer); } } И вот когда моделирую в Proteus, почему-то начинает дублироваться текст. Не подскажите почему?