Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
![]() |
||
![]() |
Программирование микроконтролеров,ремонт аудио/видео/бытовой техники,полезные устройства для дома,телефония, обсуждение статей журнала Радио |
![]() |
|
Опции темы |
![]() |
#601 |
Форумец
Сообщений: 36
Регистрация: 19.10.2010
Возраст: 57
![]() |
Спасибо конечно... Я знаю что работает порт 3 ТОЛЬКО на ввод... Но во первых в даташите написано что он работает на ввод независимо от конфигурации TRISIO, во вторых я его не использую.. и самое ГЛАВНОЕ что у меня нет никаких проблем с ассемблером...
Мой вопрос заключается в том чтоб корректно это все написать в микроси... А ассемблерный код я привел просто для иллюстрации ... |
![]() |
![]() |
![]() |
#602 |
КваДраНутыЙ
Сообщений: 1,435
Регистрация: 29.05.2010
![]() |
|
![]() |
![]() |
![]() |
#603 | |||||
Форумец
|
Ничего себе опус. Если Вы занимаетесь этим время от времени и у Вас нет времени ПЫчитать (???) оригиналы от производителя, прислушайтесь хотя бы к тем кто их читает. Вот теперь проехали.
По делу. Цитата:
Цитата:
Или, жмем кнопки на GPIO , а они на десятый раз не срабатывают? Кто виноват? Конечно кнопки, их же китайцы делали! Если такое возможно, то может лучше так не делать? Вы сами все уже написали, прямо как в DS: Цитата:
Цитата:
Может так? Код:
void main() { init(); do { } while(1); } Цитата:
|
|||||
![]() |
![]() |
![]() |
#604 |
Форумец
|
Какой народ? Какие отзывы?
Си - это стандарт. Поэтому засады не в Си, а в реализациях компиляторов для МК, разработчики которых пытаются втиснуть всю мощь стандарта Си в ограниченные возможности микроконтроллеров. А что в ассемблере нет засад? Пожалуйста, вот одна - ОС Linux и Windows писаны на Си и (ИМХО) на данный момент уже никто в мире не в состоянии написать ОС подобного уровня на чистом ассемблере. |
![]() |
![]() |
![]() |
#605 | |
КваДраНутыЙ
Сообщений: 1,435
Регистрация: 29.05.2010
![]() |
Цитата:
processor 12F675 #include <P12F675.INC> __CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT errorlevel -302 ;********************************************* ;регистры для посылок ;********************************************* #define fix11_K 0x20 #define hop14_K 0x21 #define hop13_K 0x22 #define hop12_K 0x23 #define hop11_K 0x24 #define but_K 0x25 #define fix23_K 0x26 #define fix22_K 0x27 #define fix21_K 0x28 #define hop24_K 0x29 #define hop23_K 0x2a #define hop22_K 0x2b #define hop21_K 0x2c ;************************************************* * ; буфер для отправки ;************************************************* * #define but_out 0x2d #define fix3_out 0x2e #define fix2_out 0x2f #define fix1_out 0x30 #define hop4_out 0x31 #define hop3_out 0x32 #define hop2_out 0x33 #define hop1_out 0x34 ;********************************************* ;регистры для посылок ;********************************************* #define fix3_S 0x35 #define fix2_S 0x36 #define fix1_S 0x37 #define hop4_S 0x38 #define hop3_S 0x39 #define hop2_S 0x3a #define hop1_S 0x3b #define but_S 0x3c #define fix3_S2 0x3d #define fix2_S2 0x3e #define fix1_S2 0x3f #define hop4_S2 0x40 #define hop3_S2 0x41 #define hop2_S2 0x42 #define hop1_S2 0x43 ;************************************************* ; временные регистры ;************************************************* #define Reg_0 0x44 #define Reg_1 0x45 #define Reg_2 0x46 #define Reg_3 0x47 #define Reg_4 0x48 #define Reg_5 0x49 #define Reg_6 0x4a #define registr_STATUS 0x4b ;********************************************* ; обзываем выводы ;********************************************* #define P1 1 ;Светодиод #define P2 0 ;Светодиод #define TX 2 ;Выход #define RX 3 ;Вход #define TX_ON 4 ;Светодиод #define BUT 5 ;Кнопка ;********************************************* #define bank0 bcf STATUS,RP0 #define bank1 bsf STATUS,RP0 ;************************************************* ****************************************** ;************************************************* ****************************************** ;************************************************* ****************************************** ORG 0x0000 ;************************************************* ****************************** BSF STATUS,RP0 ; переносим из последней ячейки установку для call 3FFh ; внутреннего генератора movwf OSCCAL BCF STATUS,RP0 ;************************************************* ****************************** start bsf STATUS,RP0 clrf ANSEL ;выключаем АЦП bcf STATUS,RP0 movlw 0x07 movwf CMCON ; Настраиваем все пины как цифровые входы-выходы clrf GPIO bsf STATUS,RP0 movlw b'00101000' ;Настроить GPIO,RX: GP0,GP2,GP4,GP5-выход, GP1,GP3 -вход. ; 0-выход 1-вход movwf TRISIO movlw b'00100000' movwf WPU bcf STATUS,RP0 clrf GPIO ;************************************************* *************** ;************************************************* ******************** ; СТАРТ и банально по моргать диодом (что бы в нем посмотреть уже знакомое)наверное так легче будет понять что,да как. |
|
![]() |
![]() |
![]() |
#606 | |
Форумец
|
Цитата:
Код:
void main() { asm { bsf STATUS, RP0; call 0x3FF; movwf OSCCAL; bcf STATUS, RP0; } ANSEL = 0; // все выводы цифровые I/O CMCON = 0x07; // компаратор отключен NOT_GPPU_bit = 0; // разрешить подтяжку входов внутренними резисторами WPU1_bit = 1; // GP1 - будет подтянут внутренним резистором (даже без этого оператора) GPIO = 0; TRISIO = 0x02; // GP3, GP1 - входы for(;;) { // выходы GP0, GP2, GP4, GP5 моргают GPIO = ~GPIO; delay_ms(500); GPIO = ~GPIO; delay_ms(500); } } |
|
![]() |
![]() |
![]() |
#607 |
Форумец
Сообщений: 36
Регистрация: 19.10.2010
Возраст: 57
![]() |
.... Ну не знаю не знаю...Например... подобный алгоритм довольно часто применяется в различных схемах импульсно-фазового управления- например тиристорами или симисторами.. где скажем напряжение сети или какой либо иной задающий импульсный сигнал постоянной частоты и длительности подается на один из входов контроллера и там отслеживается прерывание по изменению уровня на этом входе, то есть происходит синхронизация с сетью.. а затем формируется импульс управления тиристором(если нужна задержка- то применяется прерывание от таймера..)Насколько я знаю подобный алгоритм применен в устройствах выпускаемых промышленно- например-wwwточкаshetale.ru/protectточкаhtm
Если это скажем синхронизация с сетью- то как Вы уже я надеюсь догадались- там изменение уровня происходит с частотой полупериода сети. А загонять каждые 10 миллисекунд контроллер в sleep .... не знаю.. лично я такого не совсем понимаю..Sleep режим хорош скажем для опроса клавиатуры какого нибудь домофона... когда его там нажимают раз в час или даже реже (если конечно к этому домофону не крестный ход в день святого Валентина)))) |
![]() |
![]() |
![]() |
#608 | |
КваДраНутыЙ
Сообщений: 1,435
Регистрация: 29.05.2010
![]() |
Цитата:
![]() |
|
![]() |
![]() |
![]() |
#609 | ||
Форумец
|
Цитата:
А теперь главное - такая фигня с IOC присуща не всем контроллерам. В 1997 г. Microchip выпустила AN566 про IOC, где нет упоминании про Q2. В книге Ульриха (моя 2002 г) упоминается про Q2 только в контексте PIC16C71/73/74/773/774. А вот DS41190G на PIC12F629 (собственно про него мы и говорим) в котором это упоминается имеет редакцию 2010 г. И мне кажется такая штука с Q2 у всех PIC12 и обычных PIC16F. А вот у PIC18 такого уже нет, этот узел там сделан немного иначе и все равно для них в DS (PIC18F4550) пишут: Цитата:
|
||
![]() |
![]() |
![]() |
#610 |
Форумец
|
Проект для MikroC PRO. Распакуйте в корень диска С. В железе не глядел, если будут проблемы посмотрю.
|
![]() |
![]() |
![]() |
#612 | |
Форумец
Сообщений: 36
Регистрация: 19.10.2010
Возраст: 57
![]() |
Цитата:
Правда никто не запрещает сделать например так- if(INTCON.INTF){ ........................ INTCON.INTF = 0; OPTION_REG.INTEDG =~ OPTION_REG.INTEDG; } ..хотя я лично подобную конструкцию в железе не проверял...и будет ли она работать надежней IOCB? |
|
![]() |
![]() |
![]() |
#613 |
Форумец
Сообщений: 36
Регистрация: 19.10.2010
Возраст: 57
![]() |
Господа.. я вот кстати смотрю тут многие любители конструирования различных термостатов и тому подобной техники..
А кто нибудь может поделиться ссылочкой на проект или схемку несложного термостата только не на DS18B20, а на термопаре? |
![]() |
![]() |
![]() |
#614 | |
Форумец
|
Цитата:
P.S. Если вставляете код, используйте, пожалуйста, ТЕГИ. |
|
![]() |
![]() |
![]() |
#615 |
Registered User
Сообщений: 391
Регистрация: 16.11.2008
![]() |
видел но на AVR , а чем вам не нравится цифровой
|
![]() |
![]() |
![]() |
#617 | |
Форумец
Сообщений: 36
Регистрация: 19.10.2010
Возраст: 57
![]() |
Цитата:
|
|
![]() |
![]() |
![]() |
#618 |
Форумец
|
|
![]() |
![]() |
![]() |
#621 |
Форумец
Сообщений: 7
Регистрация: 09.11.2010
![]() |
Тогда попытаюсь описать свою проблему.
Стандартная процедура цифрового термометра на DS1820.Я решил добавить в него режим термостата.То есть при достижении например температуры +35 гр. на ножке 20 порта D появляеться "1".Сделал проект в ПРОТЕУСЕ. На ножку подключил светодиодик.Теперь при достижении температуры больше чем +35 градусов начинает мигать светодиод. А должен гореть постоянно. Вот эта и есть моя проблема.Почему мигает а не горит постояно.Не могу понять в чем дело.Если температура меньше +35 то светодиод перестает мигать. Листинг программы: Procedure TERM(var m:Word); //Процедура счета Температуры var i, j1, j2 : byte; text : array[10] of char; tmp_sign : byte; t1,t2 :word; begin text := 'TEMP'; Lcd_Out(3, 1, text); Lcd_Chr(3, 10, 223); // 'degree' character Ow_Reset(PORTA, 4); // onewire reset signal Ow_Write(PORTA, 4, $CC); // issue SKIP ROM command to DS1820 Ow_Write(PORTA, 4, $44); // issue CONVERT T command to DS1820 Delay_us(120); i := Ow_Reset(PORTA, 4); Ow_Write(PORTA,4, $CC); // issue SKIP ROM command to DS1820 Ow_Write(PORTA,4, $BE); // issue READ SCRATCHPAD command to DS1820 j1 := Ow_Read(PORTA, 4); // get result j2 := Ow_Read(PORTA, 4); // get result if j2 = $FF then begin tmp_sign := '-'; // temperature sign j1 := j1 or $FF; // complement of two j1 := j1 + $01; end else tmp_sign := '+'; j2 := (j1 and $01)*5; // get decimal value j1 := j1 shr 1; // get temp value ByteToStr(j1, text); // whole number Lcd_Chr(3, 5, tmp_sign); Lcd_Chr(3, 6, text[1]); Lcd_Chr(3, 7, text[2]); Lcd_Chr(3, 8, '.'); if j1>35 then // ВОТ СДЕСЬ УСЛОВИЕ НА ВКЛЮЧЕНИЕ ВЕНТИЛЯТОРА portd:=$02; ByteToStr(j2, text); // decimal Lcd_Chr(3, 9, text[2]); Delay_ms(500); end; Буду рад если поможете с этой проблемой |
![]() |
![]() |
![]() |
#622 | |
Форумец
|
Цитата:
|
|
![]() |
![]() |
![]() |
#623 |
Форумец
Сообщений: 7
Регистрация: 09.11.2010
![]() |
Контроллер PIC16F877
Остальная часть программы тут не причем.На порт D выводиться сигнал только из процедуры ТЕРМОМЕТРА ничего ольше к порту D необращаеться.Единствено привожу конфигурацию порта D может сдесь неправильно сконфигурировал. ADCON1 := $01; //Готовим Порт А как аналоговый с внешней опоркой TRISA := $FF; //Порт А назначаем как входной PORTA := 0; //Очищаем его TRISB := $00; //Порт Б назначаем как выходной PORTB := 0; //чистим его TRISC := $F0; //Порт С назначаем как выходной C0 PORTC := 0; //чистим его TRISE := $07; //конфигурирум порт E и порт D PORTE := 0; //Очищаем его TRISD := $00; //Порт D назначаем как PORTD := 0; INTCON := 0; //сброс всех прерываний |
![]() |
![]() |
![]() |
#624 |
Форумец
Сообщений: 7
Регистрация: 09.11.2010
![]() |
PETRD спасибо.
Вы действительно были правы.Была еще одна команда обращения к порту D в основном теле программы, я за неё забыл.Посколько веду отладку программы по процедурам.Проблема устранена.Теперь все работает как положенно. Теперь осталось написать условие на выключение. |
![]() |
![]() |
![]() |
#625 |
Форумец
Сообщений: 7
Регистрация: 09.11.2010
![]() |
Вот еще одна проблема.
Есть строковая константа название месяцев.В зависимости от нажатия кнопок выводиться текстовая константа которая соответствует порядковомуи номеру "J" На дисплей выводится буква "F" независимо от значения "J" Еслия вместо instance[j] напишу instance[2] то все выводиться правильно и на дисплее пишется "МАР" Почему программа не воспринимает значение "J" не могу понять, может кто подскажет. const //объявление констант instance: array [0..11] of string [4] =('ЯНВ','ФЕВ','МАР','АПР','МАЙ','ИЮН','ИЮЛ','АВГ', 'СЕН','ОКТ','НОЯ','ДЕК'); Procedure MONTH; var J, : byte; //Объявление переменных в процедуре str: string[4]; begin J:=0; if (Button(PORTC,6,1,0))then //Проверяем кнопку ножка RA5 Если нажата, BEGIN Sound_Play(1000, 100); // Выводим звук j :=j-1; // end; if (Button(PORTC,7,1,0))then //Проверяем кнопку ножка RA4 Если нажата, BEGIN Sound_Play(1000, 100); // Выводим звук j :=j+1; // end; Lcd_out(2,6,instance[j]); end; |
![]() |
![]() |
![]() |
#626 |
Форумец
|
Всем кто в таком виде выкладывает код и Вам тоже говорю - отформатируйте свой код тегами! И аккуратнее с копипаст, а то кнопки одни, комментарии к ним другие, где правда-то? А вот с этим:
Код:
var J, : byte; Далее: 1. А есть разница между "j' и "J" ? 2. А кнопки нажимаются? Звук есть? 3. А может это - "область видимости и время жизни переменной"? В Си, например, на этот случай может пригодиться волшебное слово static. |
![]() |
![]() |
![]() |
#627 |
Форумец
Сообщений: 7
Регистрация: 09.11.2010
![]() |
[QUOTE='petrd;13213550']
отформатируйте свой код тегами! И аккуратнее с копипаст, а то кнопки одни, комментарии к ним другие, где правда-то? Я не профи поэтому не понимаю ваш лексикон.Что такое теги.И скопирарованием кусков кода у меня тоже все в порядке. Не понял вас насчет кнопок. Кнопки разные!!!. И подключены к разным ножкам порта и коментарии соответственно разные. Откуда вы взяли что кнопки одни и тежи. 1. Разницы между "j' и "J" никакой. Я пишу код малыми буквами а микропаскаль иногда сам их переименовыевает в заглавные. 2.Кнопки нажамаються и звук есть. 3. var J, : byte; - этот код компилироваться не будет.Сдесь была еще обьявлена одна переменная я ее удалил а запятую забыл, что бы не загружать вас лишними переменными.Так получилось потому что код копировал из программы а на форуме уже его редактировал. 4. В микропаскале я такой команды не знаю - static Я так и не понял где моя ощибка в программе- если не брать ошибки в синтаксисе в.Ведь компилятор никакой ошибки не выдает. |
![]() |
![]() |
![]() |
#628 |
Форумец
|
Это не про профи, это про культуру и уважение, здесь - http://bvf.ru/forum/misc.php?do=bbcode. Когда пишете сообщение для удобства пользования тегами сверху есть быстрые кнопки.
А вот это: Код:
if (Button(PORTC,6,1,0))then //Проверяем кнопку ножка RA5 .... if (Button(PORTC,7,1,0))then //Проверяем кнопку ножка RA4 Исходя из того, что j и J одна и таже переменная и объявлена она только в одном месте - в процедуре MONTH, то по идее эта переменная может принимать только 3 значения - 0 (не нажато), 255 (нажата RC6), 1(нажата RC7). Попробуйте сделать ее глобальной. |
![]() |
![]() |
![]() |
#629 |
Форумец
Сообщений: 7
Регистрация: 09.11.2010
![]() |
Да не думал что кто то будет обращать на коментированный текст.
Просил помощи в решении определенной задачи а мне тут указывают на то что написано в коментарии. Прощу прощения что побеспокоил и тихо ухожу из этого форума. |
![]() |
![]() |
![]() |
#630 |
Форумец
|
|
![]() |
![]() |