|
|
  |
Микроконтроллеры для начинающих, AVR, PIC, FUJITSU |
|
|
|
Nov 21 2011, 08:57
|
Группа: Новичок
Сообщений: 1
Регистрация: 21-11-11
Пользователь №: 68 422

|
Подскажите, как в TMR1 перенести число из int переменной ? из С в дизасемблере выглядит так : TMR1H:TMR1L=T_next;Код 00E7 0879 MOVF 0x79, W 00E8 008E MOVWF 0xe т.е переносится 1 байт. UPD. так что ли ?: TMR1L=T_next; TMR1H=T_next>>8;Код 144: TMR1L=T_next; 00E7 0879 MOVF 0x79, W 00E8 008E MOVWF 0xe 145: TMR1H=T_next>>8; 00E9 087A MOVF 0x7a, W 00EA 008F MOVWF 0xf
Сообщение отредактировал Игорь Кочет - Nov 21 2011, 08:58
|
|
|
|
|
Nov 25 2011, 05:20
|
Местный
  
Группа: Участник
Сообщений: 313
Регистрация: 2-07-11
Пользователь №: 66 023

|
Цитата(Игорь Кочет @ Nov 21 2011, 12:57)  TMR1H:TMR1L=T_next; Такого присваивания в языке C нет. Здесь получилось что TMR1H определилась как метка для оператора goto, а присваивание только TMR1L=T_next; Цитата(Игорь Кочет @ Nov 21 2011, 12:57)  TMR1L=T_next; TMR1H=T_next>>8; Да.
|
|
|
|
|
Dec 3 2011, 15:30
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 3-11-11
Пользователь №: 68 125

|
Уже во всем разобрался, пичаль с смыслом команд, использовал лоад вместо sts и наоборот =\
Сообщение отредактировал Araxnid - Dec 3 2011, 17:17
|
|
|
|
|
Jan 17 2012, 10:04
|
Группа: Новичок
Сообщений: 3
Регистрация: 17-01-12
Пользователь №: 69 612

|
Здравствуйте! Посмотрите пожалуйста пид регулятор. Написал его на микоС, этот язык только начал осваивать, раньше асм использовал. Пишу для PIC16877A. Я думаю с ПИДом может возникнуть много заморочек, прошу откликнуться. Ваши комментарии. //**************** PID ******************************************************* delta_0 = setpoint - Vout; // vi4islenie o6ibki = zadannoe zna4enie - tekuchee prop_res = delta_0 * Kp; // proporcion-ya sost-ya = o6ibka * Kp dif_res = (delta_1 - delta_0) * Kd; // prediduchaya o6ibka - tekuchaya o6ibka // mnozennoe na Kd eto est' diff-ya sost-ya delta_1 = delta_0; // teper' tekuchaja o6ibka v sledujuchem // cikle budet prediduchej o6ibkoj int_res += Ki * delta_0; // integral'naja sostavlyajuchaya summiruet // vse o6ibki, mnozennie na koefficient Ki if (int_res > int_max) // esli integr-ya sost-ya too big, togda ograni4ivaju int_res = int_max; // ee dal'nej6ij rost na urovne int_max else if (int_res < int_min) // esli integr-ya sost-ya too small, togda ograni4ivaju int_res = int_min; // ee dal'nej6ee umen'6enie na urovne int_min control = int_res + dif_res + prop_res; // control eto upravlyajuchee // vozdejst-e soderz i,d,p sost-e if (control > control_max) // esli control too big, togda ograni4ivaju control = control_max; // ego dal'nej6ij rost na urovne control_max else if (control < control_min) // esli control too small, togda ograni4ivaju control = control_min; // ego dal'nej6ee umen'6enie na urovne control_min // teper' peremenneya control soderzit upravlyajuchee vozdejstvie, kotoroe // trebuetsya otpravit' v module PWM. //****************************************************************************
|
|
|
|
|
Jan 21 2012, 08:43
|
Группа: Новичок
Сообщений: 3
Регистрация: 21-12-11
Из: Крым
Пользователь №: 69 005

|
Доброго времени суток. Не знаю куда постучаться, начну отсюда, а там куда вывезет ... Начал что-то делать с AVR-ами, у меня их целых (пока) 2 шт. tiny2313 и mega8, одна mega8 сгорела не выдержав directly подключения светодиодного индикатора, теперь - только через ограничивающие резисторы. Повторил несколько чужих конструкций, на стенде, громко сказал  , и в реале. Пора начать делать что-то своё. Вопросов несколько : 1.Как подружиться с AVR Studio 4.18.716 и WinAVR-20100110, не смог скомпилировать ни одного проекта - ошибка make: *** [termom8.o] Error -1073741819 когда есть синтаксические ошибки, всё выдает адекватно, а когда всё исправишь - ошибка. Работаю под WinXP, SET переменные установлены правильно, имена файлов/каталогов - 8.3 2.В CodeVisionAVR (пока работаю в нем) есть "волшебник", который делает базовую программу и инициализирует всё! на МК, а есть ли необходимость в такой инициализации, ведь МК как-то настроен "по-молчанию", достаточно только скорректировать то, что нужно для определенной работы, делал тестовый секундомер, настроил входы/выходы для индикатора и таймер для прерывания и работало. Меньше строк программы - меньше ошибок исправлять  Вот собственно вопрос - где-нибудь есть сводная информация как настроен МК "по-молчанию", т.е. с завода или после полного стирания ? Некоторые настройки сбивают fuses, когда разбирался с чужим проектом, семь потов сошло  Пока почерпнул только, что порты настроены на вход с отключенными подтягивающими резисторами, хотя тоже не уверен, потому как есть общее управление всеми резисторами сразу, внутренний генератор работает на 8MHz с делением на 8, т.е 1MHz - эти настройки и повторяет "волшебник" Что там с таймерами и прерываниями ещё "не въехал". С английским дружу через словарь, в документации много всего, а выудить нужное пока не смог. Сейчас есть желание сделать на tiny2313 многоточечный термометр (на DS18B20) с выводом на многострочный LCD, подобные конструкции есть, но они расходуют практически всю программную память МК, а мне нужно еще дополнить функциональности, потому нужно максимально оптимизировать программу, переходить на mega8 не хочется, 8 ножек даром болтаться будут
--------------------
Где она - ИСТИНА в последней инстанции ?
|
|
|
|
|
Feb 8 2012, 12:10
|

Местный
  
Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658

|
Цитата(nick60 @ Jan 21 2012, 11:43)  Вот собственно вопрос - где-нибудь есть сводная информация как настроен МК "по-молчанию", т.е. с завода или после полного стирания ? после сигнала сброс регистры МК переходят в начальное состояние которое вы можете узнать прочитав соответствующий раздел описания МК внизу под названием регистра(любого) и описания его битов есть строка Initial value. Тоже самое fuse bits описывается в графе Default value.
|
|
|
|
|
Mar 1 2012, 07:40
|
Группа: Новичок
Сообщений: 3
Регистрация: 21-12-11
Из: Крым
Пользователь №: 69 005

|
Я так понял, что систематизированной информации по предустановленому состоянию МК ни у кого нет. Ладно, будем копошиться в документации дальше самостоятельно. Эксперименты изучения МК и его программирования продолжаются ...  Удачи всем! C AVRStudio 4 подружился, оказалось, что дома и на работе у меня установлено что-то, что ломает компилятор. Потому на компьютере сделал виртуальную машину с помошью VMWare, поставил чистую XP от MS в пробном режиме, установил AVRStudio 4 и все работает. Почему не работало - копать не буду, потому как времени жалко и можно попасть на ситуацию, что нужный и полезный для работы софт окажется виновником нестыковки. Так что, выход есть и Слава Богу.
--------------------
Где она - ИСТИНА в последней инстанции ?
|
|
|
|
|
Mar 1 2012, 08:25
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (nick60 @ Mar 1 2012, 09:40)  Я так понял, что систематизированной информации по предустановленому состоянию МК ни у кого нет. Даташит. Систематезированнее некуда. Это во-первых. А во-вторых - лучше не полагаться на на значения по-умолчанию, а прописывать явно все регистры используемой периферии. В большинстве случаем это даже дает меньший код, чем наложение масок по "ИЛИ" и "И". QUOTE (nick60 @ Mar 1 2012, 09:40)  C AVRStudio 4 подружился, оказалось, что дома и на работе у меня установлено что-то, что ломает компилятор. Телепатируем: "ломает компилятор" - при попытке компиляции make ругается на команды в makefile. Версия: установлен один из проектов Борланда, поэтому при компиляции вызывается его make.exe, который совершенно несовместим по формату makefile c GNU make. Диагонстика: Start->Programs->Acessories->Command line prompt, в командной строке ввести make --version, убедиться, что вызывается make от Борланда. Когда надоест виртуальная машина - поставьте в path путь к WinAVR/utils на первое место, т.е. до пути к Борланду.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Mar 7 2012, 17:17
|
Группа: Новичок
Сообщений: 2
Регистрация: 6-03-12
Пользователь №: 70 658

|
Люди, помогите пожалуйста. У меня скоро ГОСы. И в вопросах присутствуют задания по программированию микроконтроллеров PIC на Ассемблере. Может кто-нибудь сможет помочь. Задания такие: 1) Составить алгоритм и программу на языке Ассемблер для МП типа PIC16C55, реализующую функцию логического И регистров 20h и 21h, и вызов подпрограммы PRG1, если результат равен нулю. 2) Составить алгоритм и программу на языке Ассемблер для МП типа PIC16C55, реализующую логическую функцию исключающего ИЛИ портов А и В и вывод результата в порт С, если он не равен нулю. 3) Составить алгоритм и программу на языке Ассемблер для МП типа PIC16C55, реализующую множественное ветвление программы по условию установки в единицу бит 0-3 регистра 20h, с приоритетом от младшего разряда к старшему. 4) Составить алгоритм и программу на языке Ассемблер, реализующую временную задержку t= 10 мкс. для МП типа PIC16C55 при тактовой частоте f = 20МГц. Я понимаю что все задания будет в лом писать. Но хотя бы одно. Заранее спасибо
|
|
|
|
|
Mar 7 2012, 18:45
|
Местный
  
Группа: Свой
Сообщений: 311
Регистрация: 12-01-11
Из: Калининград (Koenigsberg)
Пользователь №: 62 182

|
Цитата(Alex-sh @ Mar 7 2012, 20:17)  Люди, помогите пожалуйста. У меня скоро ГОСы. И в вопросах присутствуют задания по программированию микроконтроллеров PIC на Ассемблере. Может кто-нибудь сможет помочь. Задания такие: 1) Составить алгоритм и программу на языке Ассемблер для МП типа PIC16C55, реализующую функцию логического И регистров 20h и 21h, и вызов подпрограммы PRG1, если результат равен нулю. 2) Составить алгоритм и программу на языке Ассемблер для МП типа PIC16C55, реализующую логическую функцию исключающего ИЛИ портов А и В и вывод результата в порт С, если он не равен нулю. 3) Составить алгоритм и программу на языке Ассемблер для МП типа PIC16C55, реализующую множественное ветвление программы по условию установки в единицу бит 0-3 регистра 20h, с приоритетом от младшего разряда к старшему. 4) Составить алгоритм и программу на языке Ассемблер, реализующую временную задержку t= 10 мкс. для МП типа PIC16C55 при тактовой частоте f = 20МГц. Я понимаю что все задания будет в лом писать. Но хотя бы одно. Заранее спасибо #1 Код list p=16c55 #include <p16c55.inc> __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
reg1 EQU 0x20 reg2 EQU 0x21
ORG 0x000 goto main
main movf reg1, 0 andwf !!!Чтобы увидеть продолжение отправь смс с текстом "я обещаю никогда не пытаться устроиться на работу по специальности в дипломе" на номер 1234
Сообщение отредактировал Cosmojam - Mar 7 2012, 18:47
--------------------
typedef enum { no, yes, maybe } bool; | блог тут
|
|
|
|
|
Apr 7 2012, 07:34
|
Группа: Новичок
Сообщений: 1
Регистрация: 6-04-12
Пользователь №: 71 220

|
Здравствуйте. Недавно начал изучать AVR, почти сразу понадобилось практическое применение. Вот такой вот таймер для мини-оранжереи:  Собственно должен выполняться алгоритм:  Единственная проблема с кодом, это то, как сделать такие большие задержки. Проще всего думаю пропускать нужное количество тактов за час, то есть если частота мк 1МГц, восемь часов ожидания будут выглядить так: Код __delay_cycles(3600000000); __delay_cycles(3600000000); __delay_cycles(3600000000); __delay_cycles(3600000000); __delay_cycles(3600000000); __delay_cycles(3600000000); __delay_cycles(3600000000); __delay_cycles(3600000000); Но наверное это глупо и нецелесообразно. Подскажите, как это можно реализовать на таймерах мк, и насколько большая погрешность у внутреннего генератора мк. Заранее спасибо.
|
|
|
|
|
Apr 7 2012, 12:05
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(paperplane @ Apr 7 2012, 10:34)  Но наверное это глупо и нецелесообразно. Да. Нецелесообразно. Код #define FREQUENCY 11059200 unsigned short MilliSeconds; unsigned short Seconds; unsigned char Hour; #pragma vector=TIMER0_OVF_vect __interrupt void timer_1khz_isr(void) { if (++Milliseconds>=1000) { Milliseconds=0; if (++Seconds>=3600) { Hour++; } } } void timer1_init(void) /* TIMER1 initialize - prescale:1 WGM: 4) CTC, TOP=OCRnA desired value: 9996Hz actual value: 9999,277Hz (0,0%) */ { TCCR1B = 0x00; //stop TCNT1H = 0xFB; //setup TCNT1L = 0xAF; OCR1AH = 0x04; OCR1AL = 0x51; OCR1BH = 0x04; OCR1BL = 0x51; OCR1CH = 0x04; OCR1CL = 0x51; ICR1H = 0x04; ICR1L = 0x51; TCCR1A = 0x00; TCCR1B = 0x09; //start Timer TIMSK |= (1 << OCIE1A); } int main() { timer1_init(); __enable_interrupt(); while (1) { } } Цитата(paperplane @ Apr 7 2012, 10:34)  насколько большая погрешность у внутреннего генератора мк. Навеное единицы процентов. Смотрите в datasheet.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|