|
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. Впрочем Керниган и Ричи написали это задолго до меня и в более доступной для понимания форме
|
|
|
|
|
Apr 17 2007, 21:12
|
Частый гость
 
Группа: Новичок
Сообщений: 79
Регистрация: 1-11-06
Пользователь №: 21 868

|
Цитата(WHALE @ Apr 17 2007, 07:24)  2 rezident -я неочень большой знаток С,но мне казалось,что NULL-это некое абстрактное число,не равное ничему.А строка в С заканчивается обычным нулем. Как правило: #define NULL ((void *)0) И к ASCII коду отношения особого не имеет, а обозначает указатель, "не указывающий ни на что". А то что в символах - называется нулевым символом, и равно совершенно обычному нулю, хотя может быть записано и по модному, типа такого: '\0' или '\x00'. Но '\0' == 0 всегда.
|
|
|
|
|
Apr 18 2007, 12:00
|
Участник

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

|
Я написал простинькую програмку ,камень оказался целым , программатор значит тоже. Похоже действительно sprintf виновата , я думал что библиотечные функции рабочии и на них можно расчитывать а тут ... Как лучше описать подобную функцию я раньше к примеру делал так в числе 0x34 , обнулял 3 и делал сравнение на четверку , затем делал битовый сдвиг вправо ни четыре позиции ,и опять сравнение. А какой механизм можно сделать попрощще?
|
|
|
|
|
Apr 18 2007, 12:52
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(Чип-Хрум @ Apr 18 2007, 13:00)  Похоже действительно sprintf виновата , я думал что библиотечные функции рабочии и на них можно расчитывать а тут ... Функция sprintf рабочая. Для общего развития попробуйте поргнать через симулятор програмку и обьяснить результат. Код #include <stdio.h>
signed char dat0 = 0xFF; unsigned char dat1 = 0xFF;
char buffer0[10],buffer1[10];
int main(void) { sprintf(buffer0,"%02x",dat0); sprintf(buffer1,"%02x",dat1);
for (;;); } Анатолий.
|
|
|
|
|
Apr 19 2007, 11:40
|

Знающий
   
Группа: Свой
Сообщений: 521
Регистрация: 10-02-05
Пользователь №: 2 544

|
Цитата В Си NULL определен как ((void*)0) и используется как значение указателя, который никуда не указывает. Т.е. это не интегральная константа, а указатель. А вот так NULL определен в библиотеке stdio.h от EWAVR #ifndef NULL #define NULL (0) #endif это как расценить?
|
|
|
|
|
Apr 19 2007, 14:30
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(WHALE) Я считаю неприличным не сделав ни малейшей попытки что-либо "асилить" самостоятельно выходить на форум с вопросами,излагаемых в куче литературы. Ваше предыдущее сообщение Цитата(WHALE) А просто книжку почитать по Си-вам такая мысль никогда в голову не приходила? формулируется гораздо короче - RTFM!  Поэтому без указания раздела FM это выглядит неубедительно  C другой стороны я был бы сильно удивлен, если бы за мое сообщение со ссылкой на K&R мне вынесли бы предупреждение.
|
|
|
|
|
Apr 19 2007, 15:17
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(Igor26 @ Apr 19 2007, 15:40)  А вот так NULL определен в библиотеке stdio.h от EWAVR
#ifndef NULL #define NULL (0) #endif
это как расценить? Наверное, как самодеятельность (если там не применен какой-нить хитрый финт ушами). Цитата ISO/IEC 9899:1999 (E)
7.17 Commonde?nitions<stddef.h> ...
3 The macros are NULL which expands to an implementation-defined null pointer constant; ... Для чего им в stdio потребовалось этот макрос переоределлять к нулю, не понятно. Был бы это С++, было бы понятно, но в С... Не знаю.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Apr 19 2007, 19:24
|
Участник

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

|
Ув. WHALE выяснять отношения иди на другой форум твои замечания не по теме. Дело в том что функция sprintf переводит любое шестнадцатеричное число в массив в виде кода( это удобно для жк индикации для отображения переменных в десятичном представлении ). Из-за этого я ее и использовал , как сделать что-то подобное я не знаю, Подскажите кто силен ,хотя-бы дайте наброски ! Я не прошу за меня делать всю работу мне нужен хотя-бы примерный алгоритм.
|
|
|
|
|
Apr 19 2007, 20:13
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Чип-Хрум @ Apr 19 2007, 19:24)  ...Из-за этого я ее и использовал , как сделать что-то подобное я не знаю, Подскажите кто силен ,хотя-бы дайте наброски ! Я не прошу за меня делать всю работу мне нужен хотя-бы примерный алгоритм. Вам же уже указали - нужно увеличить размер буфера для sprintf. Пробовали? вариант второй - табличное преобразование char tab[16]={'0', ..'9','A'..'F'}; char byte_to_display; //вывод display(tab[byte_to_display>>4]); display(tab[byte_to_display&0x0f]);
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Apr 19 2007, 22:27
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(Чип-Хрум @ Apr 19 2007, 20:24)  Из-за этого я ее и использовал , как сделать что-то подобное я не знаю, Подскажите кто силен ,хотя-бы дайте наброски ! Так бы сразу и ниписали... а то софт голимый ... благодарности автору книги ... Подсказки я вам давал, смотрите посты #10, #13 и №21. Если же вы не хотите сами разбираться то, я нашел 2 ошибки в вашей программе: unsigned char dat0=0,dat1=0; char buffer0[ 3],buffer1[ 3]; Анатолий.
Сообщение отредактировал aesok - Apr 19 2007, 22:34
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|