Jump to content

Схеман

Members
  • Posts

    46
  • Joined

  • Last visited

Информация

  • Город
    Сыктывкар

Электроника

  • Стаж в электронике
    Менее года
  • Сфера радиоэлектроники
    Любитель
  • Оборудование
    DT 830, DSO138

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

Схеман's Achievements

Apprentice

Apprentice (3/14)

  • One Year In
  • Collaborator
  • Week One Done
  • One Month Later

Recent Badges

2

Reputation

  1. Сломались петли экрана, разобрал весь ноутбук, аккуратно поменял петли дисплея. За одно решил поменять термопасту на видеокарте и процессоре (старую пасту убрал растворителем и уайт спиритом) и попутно поменял их куллер, так как он издавал странные звуки и добавил оперативки 8 гигов (теперь 2 планки 4 и 8), заменил батарею, так как старя уже не заряжалась, теперь не включается монитор. Подключал дополнительный монитор, тоже не включается, значит менять придётся материнскую плату целиком? Сам ноут работает, HDD крутится, куллер крутится. Можно ли как-то отдельно протестировать дисплей? Есть ли какие-то тестеры, что бы подключить его в разъём и проверить?
  2. Задержка 1 секунда с помощью нулевого таймера Всем привет, изучаю таймеры, начал с нулевого. Захотел сделать паузу 1 секунду. Правильно ли я всё понимаю? МК у меня настроен на 1МГц, TCCR0 решил выставить на 0b00000101; Получается 1МГц = 1 000 000 / 1024 = 977, с такой частотой теперь будет работать МК. Узнаю длительность, 1 делю на частоту 1/ 977 = 0.001 (одна милисекунда, с округлением) TCNT0 может сохранить 255 тактов, это значит каждый такт будет происходить, через 0.001 миллисекунд. Значит максимальное время будет 0.001 * 255 = 0.255 секунды, то есть почти четверть секунды. Мне нужно сделать задержку 1 секунду, значит 0.001 можно умножить на 100 и потом ещё на 10. Перехожу к коду, сначала отслежу, когда счётчик дойдёт до 100, значит прошло 0.100 миллисекунд, увеличиваю переменную z на 1 и когда она достигнет числа 10, значит прошла одна секунда и можно включить один светодиод, если переменная == 20, значит прошло 2 секунды и светодиод можно переключить. Каким способом это можно сделать лучше? Я так понял, мой способ выдаёт не точную секунду, а приблизительную? И ещё я кое что не понимаю, таймер восьмибитный, в каждую ячейку памяти регистра таймера записывается один бит по истечению определённого промежутка времени в моём случае мне нужно 100 ячеек, значит надо 100 бит? И так таймер начинается с 0, значит через 0.001 микросекунду заполнится 1 бит, а их всего 8 и тут я в ступаре.
  3. Я починил, написал код, которому надо только один выход 15. Не нужен транзистор, кварц и c PC6 ничего мудрить не надо. #define F_CPU 1000000UL // 1 MHz #include <avr/io.h>//библиотека ввода/вывода #include <util/delay.h> int main(void) { PORTB=0x00; DDRB=0x02; TCCR1A=(1<<COM1A1)|(1<<WGM10); //На выводе OC1A единица, когда OCR1A==TCNT1, восьмибитный ШИМ TCCR1B=(1<<CS10); //Делитель= /1 OCR1A=0x00; unsigned char i; while (1){ for (i=0;i<255;i++){ OCR1A++; _delay_ms(5); } for (i=0;i<255;i++) { OCR1A--; _delay_ms(5); } }; }
  4. @_abk_ Не решена, теперь не могу сделать плавное тушение
  5. @andrusha152 остальное я програмировал без кварца и всё работает @andrusha152 вот фьюзы @andrusha152 Вот сделал код, который плавно включает светодиод без кварца #define F_CPU 1000000UL // 1 MHz #include <avr/io.h>//библиотека ввода/вывода #include <util/delay.h> int main(void) { PORTB=0x00; DDRB=0x02; TCCR1A=(1<<COM1A1)|(1<<WGM10); //На выводе OC1A единица, когда OCR1A==TCNT1, восьмибитный ШИМ TCCR1B=(1<<CS10); //Делитель= /1 OCR1A=0x00; while (1) { OCR1A++; _delay_ms(100); }; }
  6. Нашёл схему и код. Светодиод должен мигать, но почему то он просто горит. Кварц по схеме я подключать не стал, потому что моя atmega8 работает на частоте 1МГц и PC6 у меня просто подключён от программатора разъёма MISO, я думаю без этого должно работать. #define F_CPU 1000000UL // 1 MHz #include <avr/io.h>//библиотека ввода/вывода //Програма задержки void pause (unsigned int a) { unsigned int i; for (i=a;i>0;i--); } //Програма инициализации ШИМ void init_pwm (void) { TCCR1A=(1<<COM1A1)|(1<<WGM10); //На выводе OC1A единица, когда OCR1A==TCNT1, восьмибитный ШИМ TCCR1B=(1<<CS10); //Делитель= /1 OCR1A=0x00; //Начальная яркость нулевая } //Основная програма int main(void) { unsigned char i; DDRB=0x02; //Инициализация PB1 (OC1A) как выход init_pwm(); while (1) { for (i=0;i<255;i++) //Плавно повышаем яркость {OCR1A++; pause(1000);} for (i=0;i<255;i++) //Плавно понижаем яркость {OCR1A--; pause(1000);} } return 1; }
  7. @Dr. West Большое спасибо, я оказывается неправильно подключал потенциометр.
  8. Я у подстроечника, всегда только 2 вывода использую
  9. Я подключил на 10 км, подсветка не реагирует.
  10. Я регулятор вообще не подключал.
  11. Включается экран и вообще ничего не выводится, пробовал atmega8 и на ардуине (для неё использовал тестовый код). Что может быть? Может ли такое быть, что контакты плохо спаял? Как вообще проверить, что символы могут отображаться? #define F_CPU 1000000UL #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <stdio.h> #include <stdlib.h> //---------------------------------------- void LCD_ini(void); void setpos(unsigned char x, unsigned y); void str_lcd (char str1[]); //---------------------------------------- #define e1 PORTD|=0b00001000 // установка линии E в 1 #define e0 PORTD&=0b11110111 // установка линии E в 0 #define rs1 PORTD|=0b00000100 // установка линии RS в 1 (данные) #define rs0 PORTD&=0b11111011 // установка линии RS в 0 (команда) //---------------------------------------- //---------------------------------------- void sendhalfbyte(unsigned char c) { c<<=4; e1; //включаем линию Е _delay_us(50); PORTD&=0b00001111; //стираем информацию на входах DB4-DB7, остальное не трогаем PORTD|=c; e0; //выключаем линию Е _delay_us(50); } //---------------------------------------- void sendbyte(unsigned char c, unsigned char mode) { if (mode==0) rs0; else rs1; unsigned char hc=0; hc=c>>4; sendhalfbyte(hc); sendhalfbyte(c); } //---------------------------------------- void sendchar(unsigned char c) { sendbyte(c,1); } //---------------------------------------- void setpos(unsigned char x, unsigned y) { char adress; adress=(0x40*y+x)|0b10000000; sendbyte(adress, 0); } //---------------------------------------- void LCD_ini(void) { _delay_ms(15); //Ждем 15 мс (стр 45) sendhalfbyte(0b00000011); _delay_ms(4); sendhalfbyte(0b00000011); _delay_us(100); sendhalfbyte(0b00000011); _delay_ms(1); sendhalfbyte(0b00000010); _delay_ms(1); sendbyte(0b00101000, 0); //4бит-режим (DL=0) и 2 линии (N=1) _delay_ms(1); sendbyte(0b00001100, 0); //включаем изображение на дисплее (D=1), курсоры никакие не включаем (C=0, B=0) _delay_ms(1); sendbyte(0b00000110, 0); //курсор (хоть он у нас и невидимый) будет двигаться влево _delay_ms(1); } //---------------------------------------- void clearlcd() { sendbyte(0b00000001, 0); _delay_us(1500); } //---------------------------------------- void str_lcd (char str1[]) { wchar_t n; for(n=0;str1[n]!='\0';n++) sendchar(str1[n]); } //----------- void port_ini(void) { PORTD=0x00; DDRD=0xFF; } //---------------------------------------- int main(void) { port_ini(); //Инициализируем порты LCD_ini(); //Инициализируем дисплей setpos(0,0); str_lcd("Hello World!"); setpos(2,1); str_lcd("String 2"); while(1) { } }
  12. Вот такой код #define F_CPU 1000000UL // 1 MHz #include <avr/io.h> #include <util/delay.h> int main(void) { DDRD = 0b11111111; PORTD = 0b0000100; while(1){ PORTD = 0b00010010; PORTD = PORTD & (1 << 5); } } 00010010 & (1 << 5) Получается 00010010 & 00100000 = 00010000 Почему получается тогда 00010010? Должен гореть только светодиод, под номером 5, а горят 2, второй и пятый.
×
×
  • Create New...