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

John23

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

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

  • Посещение

Репутация

0 Обычный

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

  • Звание
    Участник
    Участник
  1. Матричная клавиатура

    Здравствуйте уважаемые знатоки. Зарание извиняюсь за банальный вопрос, но он возник и никак не могу с ним справится. У меня всё та же ATmega128, к ней подключена матричная клавиатура на 4 строки и 6 столбцов. На стороках PORTE4-7, на столбцах PORTB0-5. Проблема в том что прерывания при нажании на клавиши возникают и выводится текст на экранчик, авот как определить столбец не понятно. так как никакие значния в прте В не изменяются. Клавиатура расчитана на одиночные нажатия. Подскажите пожалуйста как быть. Я уже кажеться все варианты перепробывал. Самое здравое что пришло- это в обработчике прерывания поменять направления столбцов и строк и увидеть уже какой столбец задействован, но ничего не вышло. Вот код, посмотрите пожалуйста. Закоментирована последняя неудачная попытка. void InitKB(void) { DDRE =0x0F; PORTE=0xF0; DDRB =0x3F; //0b00111111; PORTB =0xC0 // 0b11000000; cli(); EICRB=0; EIMSK=0xF0; } SIGNAL(SIG_INTERRUPT4) { Btn=PINB; int j =1; LCDputs("Џђ…ђ›‚ЂЌ?…=4",12,0); _delay_ms(5000); LCDsendCommand(0x01); /* if(flag==1) { //BtnFlag=EIFR; DDRB=0xC0; PORTB=0x3F; DDRE =0xF0; //BtnFlag;//0xF0; PORTE =0x0F;//0x0F; // Btn=PINB; // BtnFlag=PORTB; flag=0; } else { Btn=PINB; BtnFlag=PORTB; DDRE =0x0F; PORTE =0xF0; DDRB =0x3F; //0b00111111; PORTB =0xC0; // 0b11000000 flag=1; } */ } SIGNAL(SIG_INTERRUPT5) { Btn=PINB; int j =1; LCDputs("Џђ…ђ›‚ЂЌ?…=5",12,0); _delay_ms(5000); LCDsendCommand(0b00000001); } SIGNAL(SIG_INTERRUPT6) { Btn=PINB; int j =1; LCDputs("Џђ…ђ›‚ЂЌ?…=6",12,0); _delay_ms(5000); LCDsendCommand(0b00000001); } SIGNAL(SIG_INTERRUPT7) { Btn=PINB; int j =1; // DDRB = 0x3F; //PORTB =0xC0; LCDputs("Џђ…ђ›‚ЂЌ?…=7",12,0); _delay_ms(5000); LCDsendCommand(0b00000001); } int main(void) { LCDinit(); InitKB(); sei(); for(;;) { sec=0; Btn=0; } }
  2. Спасибо за совет :) , всегда рад здравым мыслям. Копаться в ДШ сразу желания не было, поэтому сначала поискал в инете как это делают другие ( к стати тоже натыкался на вышеупомянутого бедолагу :) ), после того как их советы не помогли покопался в ДШ, к моему недоумению это тоже было безрезультатно. Спасением стал этот форум, уважаемые участники которого мне всячески старались помочь. Но жалко что проблемма была такой глупой и неожиданной - просто контраст на нуле. А касательно языка С, для меня он удобнее потому что пишу на нём не первый год (с асмом ,как ни стыдно признаться, разбираться лень, хотя в институте заставляли). До недавнего времени писал приложения под винду и волей случая сейчас приходится вникать в другую область программирования, поэтому сейчас тяжковато.
  3. Да уж, я даже не догадывался что для маленького дисплейчика тоже реализовали подстройку контрастности. Просто не подумал, я за собой заметил что зачастую ищу ошибку в чём то сложном, вместо того чтоб проверить самое банальное. Как говорится- посыпаю голову пеплом, но рад что могу двигаться дальше, а точнее пока ползти :). Впереди куча всего что прийдётся делать впервые.
  4. Здравствуйте. Да уж теперь то я понимаю как много времени зря потерял из за незнания. Но поймите, плата с атмегой и дисплейчиком мне досталась в наследство и поэтому ничего о том как всё устроено и что должно быть отрегулировано не знал. Я начал подозревать что подсветка и питание мк - реализованы отдельно, так как на форуме читал что должны подсветится знакоместа, оказалось не так, мне помогли в принципиальных схемах разобраться и нашли этот резистор, после этого притензии только к разработчику схемы(ну и к себе - за то что раньше не догадался).
  5. Уважаемые знатоки, благодарю за помощь, проблема решена благодаря моему сообразительному другу. Проблема оказалась не в порядке посылки команд и выставления задержек а в коварном подстроичном резисторе регулирующем контрастность. На самом деле значок курсора выводился уже около двух недель , только благодаря резистору я его не видел. Совет начинающим - если вдруг инициализация не проходит НЕ исключайте этой ошибки и обязательно проверяйте етот самый резистор. Всем спасибо, тема закрыта.
  6. Доброго времени суток! Стянул библиотечку, действительно понятное описание и читабельный код, спасибо за ссылочку)). Содрал код инициализации и добавил лишь VLED ножку на которую даётся питание, проверил пошагово - всё работае так как написано, а продвижения все равно нет, он всего лиш загорается при подаче питания. Если не трудно читать, то вот что есть на инициализации: //------------------------------------------------------------------------------------- //инициализация дисплея //------------------------------------------------------------------------------------- #define F_CPU 1000000UL // 1 MHz //---------- #define VLED 0 //power #define LCD_RS 1 //define MCU pin connected to LCD RS #define LCD_RW 2 //define MCU pin connected to LCD R/W #define LCD_E 3 //define MCU pin connected to LCD E #define LCD_D4 4 //define MCU pin connected to LCD D3 #define LCD_D5 5 //define MCU pin connected to LCD D4 #define LCD_D6 6 //define MCU pin connected to LCD D5 #define LCD_D7 7 //define MCU pin connected to LCD D6 #define LDP PORTC //define MCU port connected to LCD data pins #define LCP PORTC //define MCU port connected to LCD control pins #define LDDR DDRC //define MCU direction register for port connected to LCD data pins #define LCDR DDRC //define MCU direction register for port connected to LCD control pins //VLED - PC0 //RS - PC1 //R/W - PC2 //E - PC3 //DB4..DB7 - PC4..PC7 void _delay_ms(double __ms) { uint16_t __ticks; double __tmp = ((F_CPU) / 4e3) * __ms; if (__tmp < 1.0) __ticks = 1; else if (__tmp > 65535) { // __ticks = requested delay in 1/10 ms __ticks = (uint16_t) (__ms * 10.0); while(__ticks) { // wait 1/10 ms _delay_loop_2(((F_CPU) / 4e3) / 10); __ticks --; } return; } else __ticks = (uint16_t)__tmp; _delay_loop_2(__ticks); } void LCDsendCommand(uint8_t cmd) //Sends Command to LCD { LDP=(cmd&0b11110000)|1<<VLED; LCP|=1<<LCD_E; _delay_ms(1); LCP&=~(1<<LCD_E); _delay_ms(1); LDP=((cmd&0b00001111)<<4)|(1<<VLED); LCP|=1<<LCD_E; _delay_ms(1); LCP&=~(1<<LCD_E); _delay_ms(1); } void LCDinit(void)//Initializes LCD { LDP=1<<VLED; LCP=1<<VLED; _delay_ms(15); //LDP=0x00; //LCP=0x00; LDDR|=1<<LCD_D7|1<<LCD_D6|1<<LCD_D5|1<<LCD_D4; LCDR|=1<<LCD_E|1<<LCD_RW|1<<LCD_RS; //---------one------ LDP=0<<LCD_D7|0<<LCD_D6|1<<LCD_D5|1<<LCD_D4|1<<VLED; //4 bit mode LCP|=1<<LCD_E|0<<LCD_RW|0<<LCD_RS; _delay_ms(1); LCP&=~(1<<LCD_E); _delay_ms(1); //-----------two----------- LDP=0<<LCD_D7|0<<LCD_D6|1<<LCD_D5|1<<LCD_D4|1<<VLED; //4 bit mode LCP|=1<<LCD_E|0<<LCD_RW|0<<LCD_RS; _delay_ms(1); LCP&=~(1<<LCD_E); _delay_ms(1); //-------three------------- LDP=0<<LCD_D7|0<<LCD_D6|1<<LCD_D5|0<<LCD_D4|1<<VLED; //4 bit mode LCP|=1<<LCD_E|0<<LCD_RW|0<<LCD_RS; _delay_ms(1); LCP&=~(1<<LCD_E); _delay_ms(1); //--------4 bit--dual line--------------- LCDsendCommand(0b00101000); //-----increment address, cursor shift------ LCDsendCommand(0b00001110); } Я просто вызываю LCDinit() из main(). Может на момент инициализации нужно запретить глобально прерывания может это мешает тоже?
  7. Спасибо, поэксперементирую ещё. Надо же его всё таки включать когда то.
  8. Не стал заморачиваться с неработающим у меня WinAvr 20071221. Поставил назад старый. Перебрал варианты, содрал _delay_ms() из библиотеки - задержка то вроде работает, но всё равно единственное что делает экранчик - так это горит при подаче питания. Может переписать как то заново? Надоел уже мне этот экранчик порядком, обидно тратить столько времини для того чтобы привести к жизни этот противный кусочек железа, выполняющий не такую уж важную роль. Спасибо за участие.
  9. Скачал новый WinAvr20071221 и опять проблемы начались: - он не запускается почему то - раньше я bat файл запускал который компилил проэкт, а затем переоткрывал его в AvrStudio, там видимо с makefile несоответствие Я видел что люди WinAvr плагином к AvrStudio прикручивают, как мне сделать так же и как переправить makefile. :wassat:
  10. Здравствуйте попытаюсь оправдаться. Пользовался рекомендациями отсюда, потому именно такой порядок инициализации а не другой, вот только задержки не в микро- а в миллиекундах. Пользуюсь WinAvr, но к сожалению не обнаружил ни util/delay.h(у меня таких библиотек не оказалось) ни других полезных функций для задержки, кроме тех которые описаны в avr/delay.h, то есть я увидил там только _delay_loop2() и _delay_loop1(), мне они показались непонятными и я содрал свою функцию с какого то обсуждения(к стати у меня их уже 3 и у всех разная реализация, даже не знаю кому верить).Поэтому хотел бы узнать где можно взять эти и другие полезные библиотечки. Частота кварца по идее должна стоять 4, точно не уверен, но по моему там по умолчанию так стоит. Полубиты решил записать функциями исключительно ради того чтоб меньше текста вылаживать на форум, до этого всё было тупо по порядку написано и без циклов, мне так же показалось это неудобным- вот и переписал немного. Попробовал поправить цикл: 1)обьявил ms как volatile цыкл работает вечено 2)__asm__ __volatile__ ("nop" : : ); - компилятор почему то не знает 3)поставил asm("nop"); - компилятр не ругался но цыкл опять же работает вечно 4)"переход в 4 битный режим, повтор" - убрал, но скорее всего из за задержек пока это результата не дало Я так понимаю нужно для начала найти цивилизованную delay_ms и delay_us(), которыми все успешно пользуются, подскажите где можно взять, а то почему то в моём WinAvr их нет.
  11. Здравствуйте! Понимаю что до дыр затёртая тема, но всё же прочитав подобные темы не смог применить к своей инициализации. У меня Atmega 128, с ней портом С подсоединён двустрочный LCD основаный на HD44780. Провожу всеми описываемую инициализацию, но результата нет. Если не сильно надоело отвечать на подобные вопросы подскажите пожалуйста как быть. Имеется вот такой вот примитивчик инициализации... void delay_ms(unsigned short ms) { unsigned short outer1, outer2; outer1 = 200; while (outer1) { outer2 = 1000; while (outer2) { while ( ms ) ms--; outer2--; } outer1--; } } //------------------------------------------------------------------------------------- //инициализация дисплея //------------------------------------------------------------------------------------- //VLED - PC0 //RS - PC1 //R/W - PC2 //E - PC3 //DB4..DB7 - PC4..PC7 //N - line number (2) //F - font type (5x8) //DL - data length (4 bit) //D - display //C - cursor //B - blink void Write_8Bit(int value, int pause) { PORTC=value; sbi(PORTC,3); cbi(PORTC,3); PORTC=0xF1;/установить DB4-DB7 в HI delay_ms(pause); } void Write_4Bit(int hi, int low, int pause) { PORTC=hi;//старший полубайт sbi(PORTC,3); cbi(PORTC,3); PORTC=low;//младший полубайт sbi(PORTC,3); cbi(PORTC,3); PORTC=0xF1;//установить DB4-DB7 в HI delay_ms(pause); } void disp_init(void) { DDRC=0xFF;// порт С на выход PORTC=0x01;// включить питание delay_ms(40); //пауза после включения питания for(int c=0; c<3; c++) //3 раза устанавливается 8 битный режим { Write_8Bit(0x31, 40); } Write_4Bit(0x21,0x01,40); // переход в 4 битный режим Write_4Bit(0x21,0x81,40); //переход в 4 битный режим, повтор Write_4Bit(0x01,0x81,40); //выключить дисплей Write_4Bit(0x01,0x61,40); //установить направление сдвига курсора Write_4Bit(0x01,0xF1,40); //включить индикатор и разрешить курсор, установить его тип Write_4Bit(0x01,0x11,40); //очистить индикатор и курсор домой } На дисплее ничего не происходит , кроме того что он светится при подаче на него питания. При посылке битов всегда добавляю 1 для того чтобы питание не пропало, потому как оно физически подсоеденено к PC0. Подскажите что у меня не так. Заранее спасибо.
  12. Хоть и с опозданием, но всё же спешу сказать всем спасибо за помощь. Как и все предидущие горимыки я кричу ура, когда вижу что прога работает правильно после снятия этого злосчастного M103C. Теперь можно заняться собственно логикой программы а не копатся в глюках. Особая благодарность Вам Сергей Борщ, так как именно после ваших слов: ...отключите совместимость с ATmega103 и не теряйте свое время понапрасну. RAM по другим адресам расположена. Я понял что действительно теряю время и нужно всего то поствить галочку и забыть.
  13. Извините за глупые вопросы, просто вообще впервые начал работать с мк и средствами разработки для них, но все же не понимаю причём фьюз совместимости M103C если функции и локальные переменные не работают в принципе. Если в такой функции как... void something (void) { int rez; int a =2; int b=3; rez=a+b; } ...a и b имеют постоянное значение 0 и зависает на последней строчке, то есть нет возможности пользоваться функциями, и прога зависает при отладке. Пытался по совету выводить значения, например в порт С, чтобы посмотреть что туда выводится из локальных переменных void naf(void) { unsigned int i; unsigned char pr; pr=3; i=10; DDRC=0x0F; PORTC=pr; PORTC=0x03; PORTC=i; pr=2; PORTC=pr; } во всех строках, кроме PORTC=0x03 в порт выводится значение 59, хотя в вотче переменные i и pr всегда равны 15163. Запустил в седующий раз в порт нет присвоения вообще,хотя значение у них так же 15163, кроме опять же строки PORTC=0x03. Где логика. Не вижу закономерности в поведении и поэтому нет возможности разобраться самостоятельно в чем же загвоздка. Всем признателен за помощь.
  14. 2 aesok Вы имеете в виду совместимость с мега103, если так то как это может повлиять на работу программы?
  15. Здравствуйте дорогие знатоки, очень надеюсь на ваш совет. Недавно начал делать проект с Mega128 пишу на Си, компилирую WinAvr, затем открываю в AvrStudio 4, мега соединяется по JtagIce mkII, для пошаговой отладки жму F11 или F10. Сразу же столкнулся с проблемой, а именно: 1) локальные переменные не изменяются, а всегда равны 0 или 13107(касательно типа int), то есть любой цикл с ними виснет по той причине что переменная всегда постоянна 2)вызов функции приводит к зависанию программы. Это выглядит так - перемещаясь по телу функции её переменные не изменяются, параметр остаётся неизвестным (об этом сообщает watch), и дойдя до последней строчки прога зависает и через несколько секунд возвращается на точку входа, то есть на main(). То есть не понятно почему локальные переменные никак не реагируют на любые манипуляции с ними, ещё больше удивляет что параметры не передаются в функцию. Подскажите в чём я не прав и что там возможно в настройках не проставил, возможно надо поставить SP4), потому что никогда не встречался с такой немыслимой и глупой ошибкой, а победить её не могу. Заранее спасибо.
×
×
  • Создать...