Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: mega32l
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Чип-Хрум
Незнаю уже на что грешить .
Короче : п.о. 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.gif
Автор не упомяну ничего о софте каторый дается в приложении что он
нихира не рабочий , глючный , и еще галимый.
А также механизм прерываний описан неправильно!!! maniac.gif
Я уже не говорю про те жыдкие программные примеры для микроконтроллеров
каторые этот чудак на букву МММ дает.
У меня ВСЕ!
Добрые люди !!!Подскажите ламеру где он не прав !!!
help.gif help.gif help.gif
IgorKossak
1. Если Вы смотрели в описании таблицу Register Summary, то могли увидеть, что DDRB доступен не только как регистр внутренней периферии, но и как ячейка памяти с адресом $37. Естественно, при записи в эту ячейку любого значения, оно же будет записано в регистр.
2. Тон сообщения желательно помягче, здесь не политический форум и не телесистемы.
Цитата
Подскажите ламеру где он не прав !!!
Kuzmi4
2 Чип-Хрум , я бы советовал бы вам сначала написать программку банального мигания лапками 0-1-0-1-...
А потом уже подымать шум...С такими глюками не встречался - всё работало как часы..Скорее это ляп в программе или битый камень..
Чип-Хрум
Я это прекрасно понимаю! На ассемблере я си просматривал ,в программе проблемм нет,
при отладке проблемм нет, они появляются только когда чип сидит в седле и
начинает мне показывать то что я не просил.
Я прошу советы по существу!!!
Где я не прав там не прав , а где прав там уж извините!
rumit2000
Цитата(Чип-Хрум @ Apr 16 2007, 14:53) *
Я это прекрасно понимаю! На ассемблере я си просматривал ,в программе проблемм нет,
при отладке проблемм нет, они появляются только когда чип сидит в седле и
начинает мне показывать то что я не просил.
Я прошу советы по существу!!!
Где я не прав там не прав , а где прав там уж извините!

Хорошо бы поглядеть участок кода, который не работает и схемку, по которой он должен работать
Kuzmi4
2 Чип-Хрум - ответ по существу -
1) попробуйте заменить камень
2) всё же написать программку мигания лапами и проверить камень таким образом, при чём на простой макетке - где всё в воздуже и есть только питание и земля - потыкать осцилографом, если в такой вариации всё будет работать, тогда ищите проблему не в меге..
Это конечно при условии что в программе ляпов нет smile.gif (есть такая народная мудрость - семь раз отмерь 1 раз отреж...)
defunct
Цитата
жыдкие

У Вас ошЫбка в программе "Жи Ши" пиши с буквой "И".
Приводите тест программы и map файл.
Чип-Хрум
серия 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
Чип-Хрум, у Вас второе нарушение - длинные тексты следует аттачить к сообщению в виде файлов.
По существу.
Сразу бросилось в глаза обилие sprintf. Они, как известно, хорошо потребляют стек.
Поэтому последуйте совету - напишите простенькую тестовую программу для проверки DDRB/PORTB без всяких наворотов. Или замените sprintf на собственную функцию попроще.
aesok
То Чип-Хрум:

Это немного упрощеный вариант вашей программы, найдите ошибку.

Код
#include <stdio.h>

char dat1 = 0xFF;
char buffer0[2],buffer1[2];

int main(void)
{
    sprintf(buffer0,"%02x",dat1);

    for (;;);
}


Анатолий.
bzx
2 aesok
Очень хороший прмер. Как и предполагал IgorKossak, именно в sprintf собака зарыта
rezident
aesok, зачем глумиться над человеком, ткнули бы сразу пальцем. Он ведь наверняка самостоятельно не поймет намека и примет ваше сообщение за насмешку.
Чип-Хрум, функция sprintf при вашем использовании выводит ТРИ символа в выделенный вами массив размером ДВА байта. Третим является завершающий строку преобразования символ NULL (0x00).
aesok
Цитата(rezident @ Apr 16 2007, 23:56) *
aesok, зачем глумиться над человеком, ткнули бы сразу пальцем. Он ведь наверняка самостоятельно не поймет намека и примет ваше сообщение за насмешку.
Чип-Хрум, функция sprintf при вашем использовании выводит ТРИ символа в выделенный вами массив размером ДВА байта. Третим является завершающий строку преобразования символ NULL (0x00).


Потомучто найдя ответ на этот вопрос человек чемуто научиться бы.

И еще, результатом функции "sprintf" будет строка "FFFF" если программа откомпилированна без ключа "-funsigned-char", и "FF" если с ним.

Анатолий.
WHALE
Интересно,как это у аффтара,как он утверждает,это прога в студии работала?не настолько там плохой
симулятор,такое симулируется без вопросов.
2 rezident -я неочень большой знаток С,но мне казалось,что NULL-это некое абстрактное число,не равное ничему.А строка в С заканчивается обычным нулем.
rezident
Цитата(WHALE @ Apr 17 2007, 10:24) *
2 rezident -я неочень большой знаток С,но мне казалось,что NULL-это некое абстрактное число,не равное ничему.А строка в С заканчивается обычным нулем.

Я тоже не очень большой знаток, но в ASCII NULL имеет значение 0. Хотя конечно никто не мешает переопределить этот символ. ОК, скорректирую свое сообщение. sprintf формирует строку символов, в конце которой будет символ со значением 0. И, например, 'A' не то же самое, что "A". Т.к. 'A' это символ, имеющий значение 0x41, а "A" это строка из двух символов 0x41 и 0x00. Впрочем Керниган и Ричи написали это задолго до меня и в более доступной для понимания форме smile.gif
slog
Насчет sprintf() и printf() в IAR.

Эти функции кроме требования большого стека еще и все инициализированные строки хранит в ОЗУ, в IAR так сделано. И при большом кол-ве строк, ОЗУ очень быстро кончается. В IAR желательно пользовать printf_P(). Строки будут храниться во флэше.

ps. ну а если все глючит, то это конечно же не программист, а AVR виноват :-)
Dog Pawlowa
Цитата(slog @ Apr 17 2007, 07:57) *
ps. ну а если все глючит, то это конечно же не программист, а AVR виноват :-)

А вот и неправда! Еще компилятор! laugh.gif
VladimirYU
Может ошибаюсь, но вроде для printf_P() надо не забыть putchar() прописать (для IAR).
boez
Цитата(WHALE @ Apr 17 2007, 07:24) *
2 rezident -я неочень большой знаток С,но мне казалось,что NULL-это некое абстрактное число,не равное ничему.А строка в С заканчивается обычным нулем.


Как правило:

#define NULL ((void *)0)

И к ASCII коду отношения особого не имеет, а обозначает указатель, "не указывающий ни на что". А то что в символах - называется нулевым символом, и равно совершенно обычному нулю, хотя может быть записано и по модному, типа такого: '\0' или '\x00'. Но '\0' == 0 всегда.
Чип-Хрум
Я написал простинькую програмку ,камень оказался целым , программатор значит тоже.
Похоже действительно sprintf виновата , я думал что библиотечные функции рабочии
и на них можно расчитывать а тут ...
Как лучше описать подобную функцию я раньше к примеру делал так
в числе 0x34 , обнулял 3 и делал сравнение на четверку ,
затем делал битовый сдвиг вправо ни четыре позиции ,и опять сравнение.
А какой механизм можно сделать попрощще?
aesok
Цитата(Чип-Хрум @ 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 (;;);
}


Анатолий.
WHALE
А просто книжку почитать по Си-вам такая мысль никогда в голову не приходила?
IgorKossak
Цитата(WHALE @ Apr 18 2007, 13:49) *
А просто книжку почитать по Си-вам такая мысль никогда в голову не приходила?

А Вам не приходило в голову, что тыкать человека носом в книжку не вполне прилично или Вас кто-то преподавателем назначил (с предупреждениями то)?
dxp
Цитата(WHALE @ Apr 17 2007, 11:24) *
2 rezident -я неочень большой знаток С,но мне казалось,что NULL-это некое абстрактное число,не равное ничему.А строка в С заканчивается обычным нулем.

В Си NULL определен как ((void*)0) и используется как значение указателя, который никуда не указывает. Т.е. это не интегральная константа, а указатель.
Igor26
Цитата
В Си NULL определен как ((void*)0) и используется как значение указателя, который никуда не указывает. Т.е. это не интегральная константа, а указатель.

А вот так NULL определен в библиотеке stdio.h от EWAVR

#ifndef NULL
#define NULL (0)
#endif

это как расценить?
WHALE
Я считаю неприличным не сделав ни малейшей попытки что-либо "асилить" самостоятельно выходить
на форум с вопросами,излагаемых в куче литературы.
ИМХО,предупреждение нужно выносить за такой стиль общения-я тут кой-чаво наковырял левой ногой,
почему-то не пашет,памажите кто может.
При этом еще вводя в заблуждение,заявляя,что на симуляторе это работает-чего не может быть.
Впрочем,модератор вы и решать вам.
rezident
Цитата(WHALE)
Я считаю неприличным не сделав ни малейшей попытки что-либо "асилить" самостоятельно выходить
на форум с вопросами,излагаемых в куче литературы.

Ваше предыдущее сообщение
Цитата(WHALE)
А просто книжку почитать по Си-вам такая мысль никогда в голову не приходила?

формулируется гораздо короче - RTFM! wink.gif Поэтому без указания раздела FM это выглядит неубедительно smile.gif C другой стороны я был бы сильно удивлен, если бы за мое сообщение со ссылкой на K&R мне вынесли бы предупреждение. blink.gif
dxp
Цитата(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 потребовалось этот макрос переоределлять к нулю, не понятно. Был бы это С++, было бы понятно, но в С... Не знаю.
Чип-Хрум
Ув. WHALE выяснять отношения иди на другой форум твои замечания не по теме.
Дело в том что функция sprintf переводит любое шестнадцатеричное
число в массив в виде кода( это удобно для жк индикации для отображения переменных
в десятичном представлении ).
Из-за этого я ее и использовал , как сделать что-то подобное я не знаю,
Подскажите кто силен ,хотя-бы дайте наброски !
Я не прошу за меня делать всю работу мне нужен хотя-бы примерный алгоритм.
Dog Pawlowa
Цитата(Чип-Хрум @ 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]);
aesok
Цитата(Чип-Хрум @ Apr 19 2007, 20:24) *
Из-за этого я ее и использовал , как сделать что-то подобное я не знаю,
Подскажите кто силен ,хотя-бы дайте наброски !


Так бы сразу и ниписали... а то софт голимый ... благодарности автору книги ...

Подсказки я вам давал, смотрите посты #10, #13 и №21.

Если же вы не хотите сами разбираться то, я нашел 2 ошибки в вашей программе:

unsigned char dat0=0,dat1=0;
char buffer0[3],buffer1[3];

Анатолий.
Чип-Хрум
Заменил signed на unsigned и все пошло работать.
Большое спасибо!!! a14.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.