Zodiac21

Members
  • Публикации

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

  • Посещение

Репутация

0 Обычный

О Zodiac21

  • Звание
    Осваивающийся

Информация

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

Электроника

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

Посетители профиля

1 903 просмотра профиля
  1. Добрый день. Ребята есть библиотека для 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
  2. Автоматические ворота на atmega

    Да. Действительно, датчик нужная вещь. Про него как-то забыл...
  3. Автоматические ворота на atmega

    Огромное СПАСИБО!!! Сделал вот-так , всё заработало..... #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; } } }
  4. Ребята! Делаю я автоматические ворота на базе 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; } Вот если кратковременно нажать на концевик то всё работает как надо....... Как быть-то???
  5. модуль lcd 5110

    Уже разобрался. Запилил такую функцию, всё работает... 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++); } }
  6. модуль lcd 5110

    Ребятки, недавно начал работать с 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
  7. модуль lcd 5110

    Как-то так, получилось....
  8. модуль lcd 5110

    Уже библиотека не надо. Я переделал ту , что была под winavr...
  9. модуль lcd 5110

    Спасибо огромное. Действительно дело было в обрыве дорожки. Ребята, что-бы не создавать новою тему, спрошу сдесь.: Нет ли у кого-нибудь библиотеки code vision для lcd 1100???? А то те что есть, под WinAvr...
  10. модуль lcd 5110

    И еще заметил, что иногда, когда дотронешься до Reset-а, данные на дисплее на секунду появляются.....
  11. Ребята, недавно приобрел себе вот такой модуль, на замену оригинальному дисплею от nokia 3310... Подключил так-же как и к оригинальному подключал, но на дисплее пусто.... Хотя когда подключаю к оригинальному, все работает..... Библиотеку для lcd которую использую прилагаю......... n3310lcd.c
  12. Получилось сделать следующим образом: 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....... Вроде всё работает........
  13. Будьте добры, подскажите как на примере моего кода это организовать..... Вот я подключил эту функцию, а как дальше быть? #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; }
  14. Изменил на int temp, результат тот-же.....
  15. Ребята, я вот делаю термометр на 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; }