Перейти к содержанию
    

asf

Участник
  • Постов

    29
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о asf

  • Звание
    Участник
    Участник
  1. А какая была длина кабеля? И сколько устройств присутствовало на шине? Подборка задержек заключалась только в подборе задержки выборки данных с линии? Или ещё какие либо из них требуют адаптации к длинной линии? Спасибо за ответ! длину линии не проверял, но 10м работает, сделал опрос всех устройств на шине, более 5ти еще не сажал, но видимых причин для беспокойства нет, кроме работы на паразитном питании. Необходимо питать от внешнего источника, но скажем, один термометр и один ключ работали и на паразитном
  2. все делал программно - дергание одной ногой меги без дополнительных компонентов, только резюк 4,7К на +5, все задача - подбор задержек. Не выдумывайте лишнего.
  3. Большое все спасибо!
  4. Если "с частотой" - это получится мигалка (биения "частоты" и сетевой частоты). А надо с определенной скважностью, отсчитывая момент включения симистора от начала сетевого полупериода. т.е. необходима обратная связь .... получив 0, я начинаю менять длительность подачи фазы от 0 до N, всегда подаю от 0 до N и остальное отсекаю? т.о. яркость будет зависить от продолжительности подачи фазы от 0 до N?
  5. Диммер на Atmega

    Уважаемые, правильно я понимаю, что необходимо лишь дергать тиристор с определенной частатой, т.о. отсекая часть, при этом свечение лампы накаливания будет ровным т.к. у нити есть определенная инертность... :unsure:
  6. вот и я об этом, а гуру-то разошлись
  7. Резервное питание MEGA. Есть ли у кого схемка?
  8. Умный дом.

    я вот тоже примерно по этому пути шел iasf.narod.ru только теперь смотрю на zigbee
  9. это рабочий вариант А зачем const char Logo122[4][122]=// кому это надо???? Можно было просто исходник приаттачить и коментарии к нему... нужно таким, как я - новичкам
  10. //************************************************************ #define F_CPU 8000000UL // 8 MHz Задаем частоту процессора * #include <util/delay.h> //************************************************************ #include <avr/io.h> #include <avr/interrupt.h> //***LCD МЭЛТ const char Logo122[4][122]=//122x32 pixel, каждые 8 вертикальных точек собраны в байт { { 0xFF,0x01,0x01,0x01,0x01,0xC1,0xE1,0xB1,0x11,0x1D,0x1D,0x7F,0x7F,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xFD,0xF9,0xB1, 0xF1,0xE1,0x81,0x01,0x01,0x01,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1, 0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1, 0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1, 0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1, 0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1, 0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xFF }, { 0xFF,0xE0,0x7C,0x7F,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x6F,0x6F,0x07, 0x07,0x06,0x00,0x00,0x03,0x03,0x0F,0x3F,0x07,0x07,0x07,0x03,0x03,0x07,0x0F,0x3B, 0x13,0x80,0x80,0x23,0x9E,0xF8,0xF8,0xF8,0xFC,0xFE,0xFE,0xFE,0xFC,0x00,0x00,0x00, 0x80,0x80,0xE0,0xF8,0xFC,0xFE,0xFE,0xFE,0xFC,0x00,0x00,0x00,0x60,0xF0,0xF8,0xF8, 0x7C,0x3E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x3E,0x3E,0x7E,0xFC,0xF8,0xF0,0xE0, 0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0xF8,0xFC,0xFE, 0xFE,0xFE,0xFE,0xFC,0x00,0x1C,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0xFE,0xFE,0xFE, 0xFE,0xFE,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x1C,0xFF }, { 0xFF,0x07,0x7C,0xE0,0x80,0x00,0x1F,0x3F,0xFF,0xFF,0xFF,0xFF,0x0F,0x30,0x38,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80, 0xE0,0xF0,0xFC,0xFF,0xFF,0x3F,0x0F,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0xFE,0xFF, 0x7F,0x7F,0x1F,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x18,0x3C,0x7E,0x7E,0x7E,0x7E,0x7E,0x7E,0x3C,0x3C,0x18,0x00,0x00,0x01,0xFF, 0xFF,0xFF,0xFF,0x00,0x00,0x80,0xE0,0xF0,0xFC,0xFE,0xFF,0x7F,0x1F,0x07,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF, 0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF }, { 0xFF,0x80,0x80,0x80,0x80,0x83,0x86,0x8C,0x98,0xB0,0xB0,0xE0,0xC0,0xC0,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,0x80,0xC0,0xC0,0xC0,0xC0,0xC0,0xE0,0xF8,0xFC,0xFF,0xFF, 0xBF,0x8F,0x87,0x81,0x80,0x80,0x80,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0x9F,0x83,0x80, 0x80,0x80,0x80,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x80,0x80,0x86,0x8F,0x9F,0xBF, 0xFE,0xFC,0xF8,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF8,0xF8,0xFC,0xFE,0xBF,0x9F,0x8F, 0x87,0xE3,0xF9,0xFC,0xFF,0xFF,0xBF,0x9F,0x87,0x81,0x80,0x80,0x80,0x80,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xFF,0xFF,0xFF, 0xFF,0xFF,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xFF } }; #define LCD_PORTDATA PORTC #define LCD_DDRDATA DDRC #define LCD_PINDATA PINC #define LCD_PORTCONTROL PORTA #define LCD_DDRCONTROL DDRA #define LCD_wire_A0 PA3 #define LCD_wire_RW PA4 #define LCD_wire_E PA5 #define LCD_RES PA6 #define LCD_wire_CS PA7 //***************************************************************************** //Низкоуровневые команды //******************************************************************************/ // Установка цикла обмена по шине данных #define LCD_StrCYC() {LCD_PORTCONTROL &= ~_BV(LCD_wire_E);} // начало цикла обмена данными #define LCD_EndCYC() {LCD_PORTCONTROL |= _BV(LCD_wire_E);} // окончание цикла обмена данными //Процедура выдачи байта в индикатор void WriteByte(char b, int cd, int lr) { LCD_PORTCONTROL &= ~(_BV(LCD_wire_E)); // LCD.E=0;//Начальное значение сигнала индикатору // LCD.RW=0; LCD.A0=cd; //Выдача байта в индикатор как данных или команды if (cd) LCD_PORTCONTROL |= (_BV(LCD_wire_A0)); else LCD_PORTCONTROL &= ~(_BV(LCD_wire_A0)); // LCD.CS=lr; LCD.D=b; //Выбрать кристалл индикатора и выдать байт на шину данных индикатора if (lr) LCD_PORTCONTROL |= (_BV(LCD_wire_CS)); else LCD_PORTCONTROL &= ~(_BV(LCD_wire_CS)); LCD_PORTDATA = b; _delay_us(1); LCD_StrCYC(); // начало строба LCD_EndCYC(); // конец строба _delay_us(10); } void WriteCodeL(char B) { WriteByte(b,0,1); }//Команду в левый кристалл индикатора void WriteCodeR(char B) { WriteByte(b,0,0); }//Команду в правый кристалл индикатора void WriteDataL(char B) { WriteByte(b,1,1); }//Данные в левую половину индикатора void WriteDataR(char B) { WriteByte(b,1,0); }//Данные в правую половину индикатора //***LCD МЭЛТ int main(void) { int p;//Номер текущей страницы индикатора int c;//Позиция по горизонтали выводимого байта ASSR &= ~_BV(AS2); //Clear AS2 bit PC7 and PC6 // для PC5 и PC4 и PC3 и PC2 - JTAGEN Fuse поставить галку т.е. отключить JTAG TWCR &= ~(_BV(TWEN)); //Clear TWEN bit PC1 ADCSRA &= ~(_BV(ADEN)); //Clear all ADC on portA LCD_PORTDATA = 0x00; LCD_DDRDATA = 0xFF; LCD_PORTCONTROL = 0x00; LCD_DDRCONTROL = 0xFF; LCD_PORTCONTROL |= _BV(LCD_wire_E); // LCD.E=1;//Начальное значение сигнала индикатору LCD_PORTCONTROL &= ~_BV(LCD_RES); // LCD.RES=0;//Выдать сигнал RES=0 индикатору LCD_PORTCONTROL |= _BV(LCD_RES); // LCD.RES=1;//Снять сигнал RES WriteCodeL(0xE2);//Reset WriteCodeR(0xE2);//Reset WriteCodeL(0xEE);//ReadModifyWrite off WriteCodeR(0xEE);//ReadModifyWrite off WriteCodeL(0xA4);//Включить обычный режим WriteCodeR(0xA4);//Включить обычный режим WriteCodeL(0xA9);//Мультиплекс 1/32 WriteCodeR(0xA9);//Мультиплекс 1/32 WriteCodeL(0xC0);//Верхнюю строку на 0 WriteCodeR(0xC0);//Верхнюю строку на 0 WriteCodeL(0xA1);//Invert scan RAM WriteCodeR(0xA0);//NonInvert scan RAM WriteCodeL(0xAF);//Display on WriteCodeR(0xAF);//Display on for(p=0; p<4; p++) {//Цикл по всем 4-м страницам индикатора WriteCodeL(p|0xB8);//Установка текущей страницы для левого кристалла индикатора WriteCodeL(0x13);//Установка текущего адреса для записи данных в левую отображаемую позицию левой половины индикатора for(c=0; c<61; c++) {//Цикл вывода данных в левую половину индикатора WriteDataL(Logo122[p][c]);//Вывод очередного байта в индикатор } WriteCodeR(p|0xB8);//Установка текущей страницы для правого кристалла индикатора WriteCodeR(0x00);//Установка текущего адреса для записи данных в левую отображаемую позицию правой половины индикатора for(c=61; c<122; c++) {//Цикл вывода данных в правую половину индикатора WriteDataR(Logo122[p][c]);//Вывод очередного байта в индикатор } } while(1) { } } //main
  11. Смотрел, пробовал уже все, что-то не так...... распаял кабель на LPT, проверил с компа - живет..... может глаза замылились? #define LCD_PORTDATA PORTC #define LCD_DDRDATA DDRC #define LCD_PINDATA PINC #define LCD_PORTCONTROL PORTA #define LCD_DDRCONTROL DDRA #define LCD_wire_A0 PA3 #define LCD_wire_RW PA4 #define LCD_wire_E PA5 #define LCD_RES PA6 #define LCD_wire_CS PA7 LCD_PORTDATA = 0x00; LCD_DDRDATA = 0xFF; LCD_PORTCONTROL = 0x00; LCD_DDRCONTROL = 0xFF; LCD_PORTCONTROL |= _BV(LCD_wire_E); // LCD.E=1;//Начальное значение сигнала индикатору LCD_PORTCONTROL &= ~_BV(LCD_RES); // LCD.RES=0;//Выдать сигнал RES=0 индикатору _delay_us(100); // Задержка на время больше 10 мкс LCD_PORTCONTROL |= _BV(LCD_RES); // LCD.RES=1;//Снять сигнал RES _delay_ms(5); // Delay(>1ms);//Задержка на время больше 1 мс WriteCodeL(0xE2);//Reset WriteCodeR(0xE2);//Reset WriteCodeL(0xEE);//ReadModifyWrite off WriteCodeR(0xEE);//ReadModifyWrite off WriteCodeL(0xA4);//Включить обычный режим WriteCodeR(0xA4);//Включить обычный режим WriteCodeL(0xA9);//Мультиплекс 1/32 WriteCodeR(0xA9);//Мультиплекс 1/32 WriteCodeL(0xC0);//Верхнюю строку на 0 WriteCodeR(0xC0);//Верхнюю строку на 0 WriteCodeL(0xA1);//Invert scan RAM WriteCodeR(0xA0);//NonInvert scan RAM WriteCodeL(0xAF);//Display on WriteCodeR(0xAF);//Display on for(p=0; p<4; p++) {//Цикл по всем 4-м страницам индикатора WriteCodeL(p|0xB8);//Установка текущей страницы для левого кристалла индикатора WriteCodeL(0x13);//Установка текущего адреса для записи данных в левую отображаемую позицию левой половины индикатора for(c=0; c<61; c++) {//Цикл вывода данных в левую половину индикатора WriteDataL(Logo122[p][c]);//Вывод очередного байта в индикатор } WriteCodeR(p|0xB8);//Установка текущей страницы для правого кристалла индикатора WriteCodeR(0x00);//Установка текущего адреса для записи данных в левую отображаемую позицию правой половины индикатора for(c=61; c<122; c++) {//Цикл вывода данных в правую половину индикатора WriteDataR(Logo122[p][c]);//Вывод очередного байта в индикатор } } // Установка цикла обмена по шине данных #define LCD_StrCYC() (LCD_PORTCONTROL |= LCD_wire_E) // начало цикла обмена данными #define LCD_EndCYC() (LCD_PORTCONTROL &= ~LCD_wire_E) // окончание цикла обмена данными //Процедура выдачи байта в индикатор void WriteByte(char b, int cd, int lr) { //При необходимости настроить здесь шину данных на вывод // LCD.RW=0; LCD.A0=cd; //Выдача байта в индикатор как данных или команды LCD_PORTCONTROL &= ~_BV(LCD_wire_RW); if (cd) LCD_PORTCONTROL |= _BV(LCD_wire_A0); else LCD_PORTCONTROL &= ~_BV(LCD_wire_A0); // LCD.CS=lr; LCD.D=b; //Выбрать кристалл индикатора и выдать байт на шину данных индикатора if (lr) LCD_PORTCONTROL |= _BV(LCD_wire_CS); else LCD_PORTCONTROL &= ~_BV(LCD_wire_CS); LCD_PORTDATA = b; _delay_us(100); //Это время предустановки адреса (tAW) LCD_StrCYC(); // начало строба LCD_EndCYC(); // конец строба } void WriteCodeL(char B) { WriteByte(b,0,1); }//Команду в левый кристалл индикатора void WriteCodeR(char B) { WriteByte(b,0,0); }//Команду в правый кристалл индикатора void WriteDataL(char B) { WriteByte(b,1,1); }//Данные в левую половину индикатора void WriteDataR(char B) { WriteByte(b,1,0); }//Данные в правую половину индикатора
  12. Новых примеров нет? А то что-то не запускается зараза (AVR Studio+GCC) перепробовал все варианты, вкл. datasheet... #define LCD_DISP_OFF 0xAE /* turn LCD panel OFF */ #define LCD_DISP_ON 0xAF /* turn LCD panel ON */ #define LCD_SET_LINE 0xC0 /* set line for COM0 (4 lsbs = ST3:ST2:ST1:ST0) */ #define LCD_SET_PAGE 0xB8 /* set page address (2 lsbs = P1:P0) */ #define LCD_SET_COL 0x00 /* set column address (6 lsbs = Y4:Y4:Y3:Y2:Y1:Y0) */ #define LCD_SET_ADC_NOR 0xA0 /* ADC set for normal direction */ #define LCD_SET_ADC_REV 0xA1 /* ADC set for reverse direction */ #define LCD_STATIC_OFF 0xA4 /* normal drive */ #define LCD_STATIC_ON 0xA5 /* static drive (power save) */ #define LCD_DUTY_16 0xA8 /* driving duty 1/16 */ #define LCD_DUTY_32 0xA9 /* driving duty 1/32 */ #define LCD_SET_MODIFY 0xE0 /* start read-modify-write mode */ #define LCD_CLR_MODIFY 0xEE /* end read-modify-write mode */ #define LCD_RESET 0xE2 /* soft reset command */ /* SED1520 is used with reverse direction (ADC_REV). This value is the address of the leftmost column: */ #define LCD_STARTCOL_REVERSE 19 /* LCD screen and bitmap image array consants */ #define LCD_X_BYTES 122 #define LCD_Y_BYTES 3 #define LCD_PORT_DATA PORTC #define LCD_DDR_DATA DDRC #define LCD_PORT_CTRL PORTA #define LCD_DDR_CTRL DDRA #define LCD_A0 PA3 #define LCD_CMD LCD_A0 #define LCD_RW PA4 #define LCD_E PA5 #define LCD_RES PA6 #define LCD_CS PA7 #define LCD_CMD_MODE() LCD_PORT_CTRL &= ~(1<<LCD_CMD) #define LCD_DATA_MODE() LCD_PORT_CTRL |= (1<<LCD_CMD) #define LCD_ENABLE_E() LCD_PORT_CTRL &= ~(1<<LCD_E ) #define LCD_DISABLE_E() LCD_PORT_CTRL |= (1<<LCD_E ) void LCDinit(void) { // Переводим в исходное состояние линии управления ЖКИ: // все выходы в нулевом состоянии, только CS1 и CS2 = "1". LCD_DDR_CTRL |= (1 << LCD_CS) | (1 << LCD_RES) | (1 << LCD_E) | (1 << LCD_RW) | (1 << LCD_A0) ; LCD_PORT_CTRL &= ~((1 << LCD_CS) | (1 << LCD_RES) | (1 << LCD_E) | (1 << LCD_RW) | (1 << LCD_A0) ); LCD_PORT_CTRL |= (1 << LCD_CS); // Выполняем аппаратный сброс модуля. Паузы формируем программно, так как // прерывания еще могут быть не разрешены. LCD_PORT_CTRL |= ( (1<<LCD_CMD) | (1<<LCD_E) ); lcd_out_ctl(0); lcd_out_ctl(LCD_RESET); _delay_ms(100); lcd_out_ctl(LCD_DISP_ON); lcd_out_ctl(LCD_SET_ADC_REV); // ! lcd_out_ctl(LCD_SET_LINE+0); lcd_out_ctl(LCD_SET_PAGE+0); lcd_out_ctl(LCD_SET_COL+LCD_STARTCOL_REVERSE); LCD_PORT_CTRL |= _BV(LCD_E); LCD_PORT_CTRL &= ~_BV(LCD_RES); _delay_loop_2(40); LCD_PORT_CTRL |= _BV(LCD_RES); _delay_loop_2(40); WriteCodeL(0xE2);//Reset _delay_loop_2(40); WriteCodeR(0xE2);//Reset _delay_loop_2(40); WriteCodeL(0xEE);//ReadModifyWrite off _delay_loop_2(40); WriteCodeR(0xEE);//ReadModifyWrite off _delay_loop_2(40); WriteCodeL(0xA4);//Включить обычный режим _delay_loop_2(40); WriteCodeR(0xA4);//Включить обычный режим _delay_loop_2(40); WriteCodeL(0xA9);//Мультиплекс 1/32 _delay_loop_2(40); WriteCodeR(0xA9);//Мультиплекс 1/32 _delay_loop_2(40); WriteCodeL(0xC0);//Верхнюю строку на 0 _delay_loop_2(40); WriteCodeR(0xC0);//Верхнюю строку на 0 _delay_loop_2(40); WriteCodeL(0xA1);//Invert scan RAM _delay_loop_2(40); WriteCodeR(0xA0);//NonInvert scan RAM _delay_loop_2(40); WriteCodeL(0xAF);//Display on _delay_loop_2(40); WriteCodeR(0xAF);//Display on _delay_loop_2(40); } void WriteByte(char b, int cd, int lr) { //При необходимости настроить здесь шину данных на вывод LCD_PORT_CTRL &= ~_BV(LCD_RW);// LCD.RW=0; if (cd==1) LCD_PORT_CTRL |= _BV(LCD_A0); else LCD_PORT_CTRL &= ~_BV(LCD_A0);// LCD.A0=cd; //Выдача байта в индикатор как данных или команды if (lr==1) LCD_PORT_CTRL |= _BV(LCD_CS); else LCD_PORT_CTRL &= ~_BV(LCD_CS);// LCD.CS=lr; LCD_PORT_DATA = b;// LCD.D=b; //Выбрать кристалл индикатора и выдать байт на шину данных индикатора _delay_loop_2(70); //Это время предустановки адреса (tAW) LCD_PORT_CTRL &= ~_BV(LCD_E); // LCD.E=0; _delay_loop_2(240); //Длительность сигнала E=0 (время предустановки данных попало сюда (tDS)) LCD_PORT_CTRL |= _BV(LCD_E); // LCD.E=1; _delay_ms(10); //Минимально допустимый интервал между сигналами E=0 } void WriteCodeL(char B) { WriteByte(b,0,1); }//Команду в левый кристалл индикатора void WriteCodeR(char B) { WriteByte(b,0,0); }//Команду в правый кристалл индикатора void WriteDataL(char B) { WriteByte(b,1,1); }//Данные в левую половину индикатора void WriteDataR(char B) { WriteByte(b,1,0); }//Данные в правую половину индикатора ну и в main LCDinit(); for(p=0; p<4; p++) {//Цикл по всем 4-м страницам индикатора WriteCodeL(p|0xB8);//Установка текущей страницы для левого кристалла индикатора WriteCodeL(0x13);//Установка текущего адреса для записи данных в левую отображаемую позицию левой половины индикатора for(c=0; c<61; c++) {//Цикл вывода данных в левую половину индикатора WriteDataL(Logo122[p][c]);//Вывод очередного байта в индикатор } WriteCodeR(p|0xB8);//Установка текущей страницы для правого кристалла индикатора WriteCodeR(0x00);//Установка текущего адреса для записи данных в левую отображаемую позицию правой половины индикатора for(c=61; c<122; c++) {//Цикл вывода данных в правую половину индикатора WriteDataR(Logo122[p][c]);//Вывод очередного байта в индикатор } } ---- может хня какая-то с задержками опять? у меня atmega16 8Mhz ни у кого нет работающего минимального кода для GCC ? а то может быть что с МЭЛТом?
  13. Чем больше информации вы будете скрывить когда задаете вопрос, тем позже получете ответ! вот код функции _delay_ms: Анатолий. Анатолий, спасибо за помощь, но разве delay.h стоило приводить в качестве примера? Это же стандартные функции....
×
×
  • Создать...