Жора 0 16 апреля, 2007 Опубликовано 16 апреля, 2007 · Жалоба Незнаю уже на что грешить . Короче : п.о. AVR Ssutio 4.12. s.p.-4 build 498 , чипы кодирую на autoprog программаторе hex файлом. Чип прошивается нормально без проблемм, запускается mega32 тоже нормально инициирует жк индикатор мт-16s2r. Выводит на индикатор все правильно . А теперь самое интересное настраиваю портB на ввод информации. записываю DDRB= 0xb0; а он зараза оказывается 0xff (инфа высвечивается на индикаторе) Я пролистал всю программу в ассемблере под astudio ни одного обращения к DDRB. Оказалось что если в DDRB записать 0xb0 то там окажется 0xff то бишь перенаправить выводы не удастся а в книге писалось об обратном. (Микроконроллеры AVR семейств Tiny и Mega автор Евстифеев) Это еще пол беды Шоу только начинается. Порт в оставляю на вывод и берусь за портА. Ставлю подтягивающие резисторы на 39кОм Настраиваю porta DDRA=0x00; PORTA=0x00; И тыркаюсь на каждый ввод сопротивлением 1 кОм подключенным на 5в. 7 вывод показал мне 0x7f. А остальные промолчали. Кстати тема приколов не последняя Особую Благодарность хочется высказать в пользу книги (Программирование на языке си для avr и pic микроконтроллеров Ю.А. Шпак) :maniac: Автор не упомяну ничего о софте каторый дается в приложении что он нихира не рабочий , глючный , и еще галимый. А также механизм прерываний описан неправильно!!! :maniac: Я уже не говорю про те жыдкие программные примеры для микроконтроллеров каторые этот чудак на букву МММ дает. У меня ВСЕ! Добрые люди !!!Подскажите ламеру где он не прав !!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 16 апреля, 2007 Опубликовано 16 апреля, 2007 · Жалоба 1. Если Вы смотрели в описании таблицу Register Summary, то могли увидеть, что DDRB доступен не только как регистр внутренней периферии, но и как ячейка памяти с адресом $37. Естественно, при записи в эту ячейку любого значения, оно же будет записано в регистр. 2. Тон сообщения желательно помягче, здесь не политический форум и не телесистемы. Подскажите ламеру где он не прав !!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 16 апреля, 2007 Опубликовано 16 апреля, 2007 · Жалоба 2 Чип-Хрум , я бы советовал бы вам сначала написать программку банального мигания лапками 0-1-0-1-... А потом уже подымать шум...С такими глюками не встречался - всё работало как часы..Скорее это ляп в программе или битый камень.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Жора 0 16 апреля, 2007 Опубликовано 16 апреля, 2007 (изменено) · Жалоба Я это прекрасно понимаю! На ассемблере я си просматривал ,в программе проблемм нет, при отладке проблемм нет, они появляются только когда чип сидит в седле и начинает мне показывать то что я не просил. Я прошу советы по существу!!! Где я не прав там не прав , а где прав там уж извините! Изменено 16 апреля, 2007 пользователем Чип-Хрум Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rumit2000 0 16 апреля, 2007 Опубликовано 16 апреля, 2007 · Жалоба Я это прекрасно понимаю! На ассемблере я си просматривал ,в программе проблемм нет, при отладке проблемм нет, они появляются только когда чип сидит в седле и начинает мне показывать то что я не просил. Я прошу советы по существу!!! Где я не прав там не прав , а где прав там уж извините! Хорошо бы поглядеть участок кода, который не работает и схемку, по которой он должен работать Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 16 апреля, 2007 Опубликовано 16 апреля, 2007 (изменено) · Жалоба 2 Чип-Хрум - ответ по существу - 1) попробуйте заменить камень 2) всё же написать программку мигания лапами и проверить камень таким образом, при чём на простой макетке - где всё в воздуже и есть только питание и земля - потыкать осцилографом, если в такой вариации всё будет работать, тогда ищите проблему не в меге.. Это конечно при условии что в программе ляпов нет :) (есть такая народная мудрость - семь раз отмерь 1 раз отреж...) Изменено 16 апреля, 2007 пользователем Kuzmi4 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 16 апреля, 2007 Опубликовано 16 апреля, 2007 · Жалоба жыдкие У Вас ошЫбка в программе "Жи Ши" пиши с буквой "И". Приводите тест программы и map файл. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Жора 0 16 апреля, 2007 Опубликовано 16 апреля, 2007 · Жалоба серия atmega32l 5L1808-5-355P6E 4-P0546 ез Все три камня этой серии. Возможность получить новые недели через 3. Народ на чем программируем чипы??? Я еще кошу на программатор. Кстати насчет семь раз отмерь а один отреж ,если табуретку делать по этому правилу, то она будет 3.5 метра высотой. Вот текст программы #include <inttypes.h> #include <avr/io.h> #include <avr/interrupt.h> #include <stdlib.h> #include <util/delay.h> #include <stdio.h> #include <avr/eeprom.h> void init_lcd(); void WriteCondition(unsigned char); void WriteData(char); void FontResticle(char); #define bitset(var,bitno) ((var) |= 1 << (bitno)) #define bitclr(var,bitno) ((var) &= ~(1 << (bitno))) #define set_cs() (PORTB |= (1 << PB4)) #define clr_cs() (PORTB &= ~(1 << PB4)) #define set_scl() (PORTB |= (1 << PB7)) #define clr_scl() (PORTB &= ~(1 << PB7)) char dat0=0,dat1=0; char buffer0[2],buffer1[2]; int result = 0; int main(void) { DDRA=0x00; PORTA=0xff; DDRD=0xff; DDRB=0xb0; PORTB=0x00; SPCR=0x00; init_lcd(); goro: //1 dat0 = PINA; dat1 = PORTA; sprintf(buffer0,"%02x",dat0); sprintf(buffer1,"%02x",dat1); FontResticle(0x80); // знакоместо _delay_loop_2(50000); WriteData(buffer0[0]); // запись данных WriteData(buffer0[1]); FontResticle(0x82); _delay_loop_2(50000); WriteData(buffer1[0]); WriteData(buffer1[1]); //2 dat0 = DDRA; dat1 = 0x34; // для проверки вывода данных на жк панель sprintf(buffer0,"%02x",dat0); sprintf(buffer1,"%02x",dat1); FontResticle(0x80); _delay_loop_2(50000); WriteData(buffer0[0]); WriteData(buffer0[1]); FontResticle(0x82); _delay_loop_2(50000); WriteData(buffer1[0]); WriteData(buffer1[1]); goto goro; return (0); } void init_lcd() { WriteCondition(0x03);//1 WriteCondition(0x03);//2 WriteCondition(0x03);//3 WriteCondition(0x02);//4 WriteCondition(0x02);//5 WriteCondition(0x08);//6 WriteCondition(0x00);//7 WriteCondition(0x08);//8 WriteCondition(0x00);//9 WriteCondition(0x01);//10 WriteCondition(0x00);//11 WriteCondition(0x06);//12 WriteCondition(0x00);//13 WriteCondition(0x0f);//14 } void WriteCondition(unsigned char data)// для настройки жк { data=data+0x20; PORTD=data; _delay_loop_2(50000); _delay_loop_2(50000); data=data-0x20; PORTD=data; _delay_loop_2(50000); _delay_loop_2(50000); } void FontResticle(char data)//знакоместо { char data2=data; data2=data2>>4; data2=data2&0x0f; data2=data2+0x20; PORTD=data2; _delay_loop_2(50000); data2=data2-0x20; PORTD=data2; _delay_loop_2(50000); data2=data; data2=data2&0x0f; data2=data2+0x20; PORTD=data2; _delay_loop_2(50000); data2=data2-0x20; PORTD=data2; _delay_loop_2(50000); } void WriteData(char data) //вывод данных { char data2=data; data2=data2>>4; data2=data2&0x0f; data2=data2+0x30; PORTD=data2; _delay_loop_2(50000); data2=data2-0x20; PORTD=data2; _delay_loop_2(50000); data2=data; data2=data2&0x0f; data2=data2+0x30; PORTD=data2; _delay_loop_2(50000); data2=data2-0x20; PORTD=data2; _delay_loop_2(50000); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 16 апреля, 2007 Опубликовано 16 апреля, 2007 · Жалоба Чип-Хрум, у Вас второе нарушение - длинные тексты следует аттачить к сообщению в виде файлов. По существу. Сразу бросилось в глаза обилие sprintf. Они, как известно, хорошо потребляют стек. Поэтому последуйте совету - напишите простенькую тестовую программу для проверки DDRB/PORTB без всяких наворотов. Или замените sprintf на собственную функцию попроще. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aesok 0 16 апреля, 2007 Опубликовано 16 апреля, 2007 (изменено) · Жалоба То Чип-Хрум: Это немного упрощеный вариант вашей программы, найдите ошибку. #include <stdio.h> char dat1 = 0xFF; char buffer0[2],buffer1[2]; int main(void) { sprintf(buffer0,"%02x",dat1); for (;;); } Анатолий. Изменено 16 апреля, 2007 пользователем aesok Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bzx 0 16 апреля, 2007 Опубликовано 16 апреля, 2007 · Жалоба 2 aesok Очень хороший прмер. Как и предполагал IgorKossak, именно в sprintf собака зарыта Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 16 апреля, 2007 Опубликовано 16 апреля, 2007 · Жалоба aesok, зачем глумиться над человеком, ткнули бы сразу пальцем. Он ведь наверняка самостоятельно не поймет намека и примет ваше сообщение за насмешку. Чип-Хрум, функция sprintf при вашем использовании выводит ТРИ символа в выделенный вами массив размером ДВА байта. Третим является завершающий строку преобразования символ NULL (0x00). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aesok 0 17 апреля, 2007 Опубликовано 17 апреля, 2007 (изменено) · Жалоба aesok, зачем глумиться над человеком, ткнули бы сразу пальцем. Он ведь наверняка самостоятельно не поймет намека и примет ваше сообщение за насмешку. Чип-Хрум, функция sprintf при вашем использовании выводит ТРИ символа в выделенный вами массив размером ДВА байта. Третим является завершающий строку преобразования символ NULL (0x00). Потомучто найдя ответ на этот вопрос человек чемуто научиться бы. И еще, результатом функции "sprintf" будет строка "FFFF" если программа откомпилированна без ключа "-funsigned-char", и "FF" если с ним. Анатолий. Изменено 17 апреля, 2007 пользователем aesok Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
WHILE 0 17 апреля, 2007 Опубликовано 17 апреля, 2007 · Жалоба Интересно,как это у аффтара,как он утверждает,это прога в студии работала?не настолько там плохой симулятор,такое симулируется без вопросов. 2 rezident -я неочень большой знаток С,но мне казалось,что NULL-это некое абстрактное число,не равное ничему.А строка в С заканчивается обычным нулем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 17 апреля, 2007 Опубликовано 17 апреля, 2007 · Жалоба 2 rezident -я неочень большой знаток С,но мне казалось,что NULL-это некое абстрактное число,не равное ничему.А строка в С заканчивается обычным нулем. Я тоже не очень большой знаток, но в ASCII NULL имеет значение 0. Хотя конечно никто не мешает переопределить этот символ. ОК, скорректирую свое сообщение. sprintf формирует строку символов, в конце которой будет символ со значением 0. И, например, 'A' не то же самое, что "A". Т.к. 'A' это символ, имеющий значение 0x41, а "A" это строка из двух символов 0x41 и 0x00. Впрочем Керниган и Ричи написали это задолго до меня и в более доступной для понимания форме :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться