Alex@ndr
Участник-
Постов
20 -
Зарегистрирован
-
Посещение
Репутация
0 ОбычныйИнформация о Alex@ndr
-
Звание
Участник
- День рождения 06.12.1984
Контакты
-
Сайт
Array
-
AVR и Siemens M55
Alex@ndr ответил dexter_khm тема в AVR
Не могли бы Вы выложить исходники программы, или добавить возможность созданя бОльших шрифтов(100х100) и разворот на 90градусов? -
AVR и Siemens M55
Alex@ndr ответил dexter_khm тема в AVR
Какраз щас играюсь с таким, пока ничего сложного вывод текста и картинок. Ориентацию меняю програмно, очень не хватает описания регистров..... А вам удалось в 8 бит цвет переключить?? LCD.rar -
Действительно, дело было в SS, назначил его выходом и всё заработало. Спасибо за помощь!
-
Не помогло, всё равно виснет. Определил где именно, на ожидании завершения работы SPI. Причем, то в WriteConfig, то в ReadConfig void WriteConfig(char adres, char value) { adres = ((adres << 1) & 0x3F) | 0x01; PORTD |= (1 << 5); PORTD &= ~(1 << 4); SPDR=adres; while(!(SPSR & (1 << SPIF))); SPDR=value; while(!(SPSR & (1 << SPIF))); //ЗАВИСАЕТ ЗДЕСЬ adres = SPDR; PORTD |= (1 << 4); } char ReadConfig(char adres) { char value = 0; PORTD |= (1 << 5); adres = ((adres << 1) & 0x7F) | 0x41; PORTD &= ~(1 << 4); SPDR=adres; while(!(SPSR & (1 << SPIF))); // ЗАВИСАЕТ ЗДЕСЬ value = SPDR; PORTD |= (1 << 4); return value; }
-
Доброго времени суток, Есть такая проблемка, подключаю трансивер DP1205 к AtMega8 и при обращении по SPI, Mega зависает. Зависание происходит абсолютно непредсказуемо, иногда сразу после включения, иногда после нескольких минут работы. Программу(WinAVR) максимально упростил, читаю и пишу в один из регистров, но всё равно виснет. может SPI неправильно настроен? Помогите разобраться плиз #include <avr/io.h> #include <util/delay.h> void init(void) //инициализация { DDRC |= (1 << 5); //сделать выходом DDRD |= (1 << 4); //сделать выходом DDRD |= (1 << 5); //сделать выходом PORTD |= (1 << 4); //установка в 1 NSS_CONFIG PORTD |= (1 << 5); //установка в 1 NSS_DATA DDRB |= (1 << 3); //MOSI сделать выходом DDRB |= (1 << 5); //SCK сделать выходом SPCR = (1 << SPE)|(1 << MSTR)|(1 << SPR0); } void WriteConfig(char adres, char value) { adres = ((adres << 1) & 0x3F) | 0x01; PORTD |= (1 << 5); //установка в 1 NSS_DATA PORTD &= ~(1 << 4); //активация NSS_CONFIG SPDR=adres; while(!(SPSR & (1 << SPIF))); SPDR=value; while(!(SPSR & (1 << SPIF))); PORTD |= (1 << 4); //деактивация NSS_CONFIG } char ReadConfig(char adres) { char value = 0; PORTD |= (1 << 5); //установка в 1 NSS_DATA adres = ((adres << 1) & 0x7F) | 0x41; PORTD &= ~(1 << 4); //активация NSS_CONFIG SPDR=adres; while(!(SPSR & (1 << SPIF))); value = SPDR; PORTD |= (1 << 4); //деактивация NSS_CONFIG return value; } void main (void) { char Data; init(); while(1) { _delay_ms(100); Data = ReadConfig(4); if (Data > 0) { WriteConfig(4, 0x00); PORTC |= (1 << 5); } else { WriteConfig(4, 0x01); PORTC &= ~(1 << 5); }; }; //конец цикла } //конец P.S. На PORTC 5 подключён светодиод, при зависании перестаёт моргать
-
Во, вот этот вариант ещё лутше - позволил повыкидывать printf и сэкономить почти 1кб памяти! А переменная HEXtable обязательно должна быть static const ?
-
А бедный USART причем? Ну хоть ЧУТЬ-ЧУТЬ-ЧУТЬ о формате ....printf() ну НАДО ПОЧИТАТЬ!!!!!! printf( "%04X", а ); Спасибо, то что нужно. Тема закрыта.
-
Здравствуйте, есть маленький вопрос по USART. Мне нужно передавать по USART некую переменную int a (изменяется от 0 до 20000) в формате hex, причём так, чтобы длинна пакета передачи в любом случае оставалась неизменной. Тоесть при передаче числа a=18654 должна быть посылка 48DE, при а=3578 ->0DFA, при a=12 ->000C, при a=0 -> 0000. Первое что пришло в голову это вывод вот таким образом, дописывая недостающие ноли: if (а/256<16)printf("0"); printf("%X",а/256); if (а%256<16)printf("0"); printf("%X",а%256); Работает, но мне самому это жутко ненравится, наверняка для решения такой задачи есть способы поизящнее. Подскажите пожалуста как мне правильно выводить hex- значения. Компилятор CodeVision.
-
Спасибо за ответы, но мож кто пример программы подкинет, как эти самые локи считать? И ещё, неохота с загрузчиком связыватся, может можно произвести чтение фьюзов или локов из основной программы?
-
Так если поставить защиту кодом + защиту по калибровочной константе + проверку контрольной суммы(чтоб прошивку труднее править было) +ещё чё нибудь придумать, это сколько головной боли будет у того кто захочет такую программу ломать. Думаю будет проще написать собственную программу, чем с такою разбиратся. Только надо ещё чтоб реализация всего этого была достаточно простой, ато защита программы получится сложнее самой программы.
-
Спасибо, щас буду смотреть. См. первое сообщение. Прошивка будет неработоспособна без моего кода, единственный вариант -считать ЕЕРRОМ с уже разблокированного МК(с обеими кодами) и шить его в остальные.
-
Вон чё в даташите на AtMega16 нарыл: Насколько я ничего не понимаю в английском, это значит что всётаки можно прочитать фьюзы и локи самим контроллером!!!Только как, для меня пока остаётся загадкой...
-
Генерировать случайные числа буду через АЦП, например так: провёл 1000 замеров, три младших разряда суммы результатов -трёхзначное случайное число. Защёт погрешности АЦП результат будет абсолютно непредсказуемый и случайный. Ну больше подходящих вариантов я невижу, а так хоть какаято защита. И ещё очень легко организуема, вызовет зависание: ... while (OSCCAL!=0x6A) { }; ... Кстати, я надеюсь калибровочную константу МК изменить нельзя?
-
C константой калибровочного бита CLC разобрался, беру в регистре OSCCAL. Буду попробовать, может и фьюзы защиты найду где брать...
-
С SIM-карты защита точно не получится.Там два кода, IMSI-ничем незащищён(его даже через мобильный можно посмотреть),KI-защищён, но у тех карт которые не клонируются, его вычислить невозможно. Ладно, я так понял нормальной защиты всё равно неполучится, ну мне хотябы защититу от простого копирования прошивки в другой МК. Вот мне идея понравилась проверять заводскую константу CLC. Может кто-нибудь дать пример кода, как считать эту константу?