|
mega32l, Врагу такого не пожелаю !!! |
|
|
|
Apr 16 2007, 13:28
|
Участник

Группа: Новичок
Сообщений: 33
Регистрация: 1-04-07
Пользователь №: 26 675

|
Незнаю уже на что грешить . Короче : п.о. 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 микроконтроллеров Ю.А. Шпак) Автор не упомяну ничего о софте каторый дается в приложении что он нихира не рабочий , глючный , и еще галимый. А также механизм прерываний описан неправильно!!! Я уже не говорю про те жыдкие программные примеры для микроконтроллеров каторые этот чудак на букву МММ дает. У меня ВСЕ! Добрые люди !!!Подскажите ламеру где он не прав !!!
|
|
|
|
|
Apr 16 2007, 13:53
|
Участник

Группа: Новичок
Сообщений: 33
Регистрация: 1-04-07
Пользователь №: 26 675

|
Я это прекрасно понимаю! На ассемблере я си просматривал ,в программе проблемм нет, при отладке проблемм нет, они появляются только когда чип сидит в седле и начинает мне показывать то что я не просил. Я прошу советы по существу!!! Где я не прав там не прав , а где прав там уж извините!
Сообщение отредактировал Чип-Хрум - Apr 16 2007, 13:54
|
|
|
|
|
Apr 16 2007, 13:56
|

Частый гость
 
Группа: Свой
Сообщений: 175
Регистрация: 16-03-07
Из: Москва
Пользователь №: 26 228

|
Цитата(Чип-Хрум @ Apr 16 2007, 14:53)  Я это прекрасно понимаю! На ассемблере я си просматривал ,в программе проблемм нет, при отладке проблемм нет, они появляются только когда чип сидит в седле и начинает мне показывать то что я не просил. Я прошу советы по существу!!! Где я не прав там не прав , а где прав там уж извините! Хорошо бы поглядеть участок кода, который не работает и схемку, по которой он должен работать
--------------------
Быстро, Дёшево, Качественно-выбери любые 2 пункта
|
|
|
|
|
Apr 16 2007, 15:15
|
Участник

Группа: Новичок
Сообщений: 33
Регистрация: 1-04-07
Пользователь №: 26 675

|
серия 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); }
|
|
|
|
|
Apr 16 2007, 18:45
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
То Чип-Хрум: Это немного упрощеный вариант вашей программы, найдите ошибку. Код #include <stdio.h>
char dat1 = 0xFF; char buffer0[2],buffer1[2];
int main(void) { sprintf(buffer0,"%02x",dat1);
for (;;); } Анатолий.
Сообщение отредактировал aesok - Apr 16 2007, 18:55
|
|
|
|
|
Apr 17 2007, 00:22
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(rezident @ Apr 16 2007, 23:56)  aesok, зачем глумиться над человеком, ткнули бы сразу пальцем. Он ведь наверняка самостоятельно не поймет намека и примет ваше сообщение за насмешку. Чип-Хрум, функция sprintf при вашем использовании выводит ТРИ символа в выделенный вами массив размером ДВА байта. Третим является завершающий строку преобразования символ NULL (0x00). Потомучто найдя ответ на этот вопрос человек чемуто научиться бы. И еще, результатом функции "sprintf" будет строка "FFFF" если программа откомпилированна без ключа "-funsigned-char", и "FF" если с ним. Анатолий.
Сообщение отредактировал aesok - Apr 17 2007, 00:28
|
|
|
|
|
Apr 17 2007, 07:48
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(WHALE @ Apr 17 2007, 10:24)  2 rezident -я неочень большой знаток С,но мне казалось,что NULL-это некое абстрактное число,не равное ничему.А строка в С заканчивается обычным нулем. Я тоже не очень большой знаток, но в ASCII NULL имеет значение 0. Хотя конечно никто не мешает переопределить этот символ. ОК, скорректирую свое сообщение. sprintf формирует строку символов, в конце которой будет символ со значением 0. И, например, 'A' не то же самое, что "A". Т.к. 'A' это символ, имеющий значение 0x41, а "A" это строка из двух символов 0x41 и 0x00. Впрочем Керниган и Ричи написали это задолго до меня и в более доступной для понимания форме
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|