| Автор |
Съобщение |
|
peast
Ранг: Минаващ
Регистриран на: Сря Юли 04, 2012 1:51 pm Мнения: 44 Местоположение: София
|
 PIC16F1829 IR приемник полудях
Търся помощ за програмката долу. Тя работи отлично, когато се пусне на PICKIT 3, пали съответните пинове на PORTC (даже с волтметър съм ги мерил), но когато се опитам да я кача на контролера,отказва да реагира. Цяла неделя... Предполагам, че греша някъде из конфигурацията. Ако някой помогне, предлагам почерпка според предпочитанията. Най-общо: направил съм едно IR трансмитерче с 4 бутона, което излъчва съкратен SONY код за натиснатия бутон. Долуописаният приемник трябва да приеме кода, да разбере кой е бутона и да запали суответния пин на PORTC. Всичко става перфектно, до момента, в който трябва програмата да се качи на чипа. Там няма никаква реакция.
#include "pic16f1829.h"
// CONFIG1 #pragma config FOSC = INTOSC // #pragma config WDTE = OFF // #pragma config PWRTE = OFF // #pragma config MCLRE = ON // #pragma config CP = OFF // #pragma config CPD = OFF // #pragma config BOREN = ON // #pragma config CLKOUTEN = OFF // #pragma config IESO = ON // #pragma config FCMEN = ON // // CONFIG2 #pragma config WRT = OFF // #pragma config PLLEN = ON // #pragma config STVREN = ON // #pragma config BORV = LO // #pragma config LVP = OFF //
#include <xc.h>
int i, j, PulseLength = 0; unsigned int id_but = 0, test = 1, rez = 0;
void Init(void) {
OSCCON = 0b11110010; //8 MHz, INTOSC PORTA = 0; LATA = 0; TRISA = 0; ANSELA = 0; WPUA = 0; PORTC = 0; LATC = 0; TRISC = 0; ANSELC = 0; PORTB = 0; //PORTB init TRISB = 0b01000000; // Port B bit 6 is input LATB = 0; ANSELB = 0; TRISB = 0b01000000; nWPUEN = 0; // Enabled Weak Pull Up's TMR0CS = 0; // TIMER CHOOSED,NOT COUNTER WPUB6 = 1; // -"- TMR0CS = 0; // Timer increments on instruction clock INTCON = 0; //DISAB interrupt OPTION_REGbits.INTEDG = 1; //rising edge trigger the interrupt PSA = 0; // PRESCALER ASSIGNED TO TIMER0 PS2 = 0; PS1 = 1; // PRESCALER RATE = 1:8, 4 MS FOR cycle TMR0 PS0 = 0;
}
void Puls(void){ TMR0 = 0; while (!RB6) {} PulseLength = TMR0; while(RB6){} PulseLength = TMR0; if ( PulseLength >85){ for (j=0; j <= i; j++)test = test*2; // id_but = id_but | test; // Ако дължината на импулса е повече от 1200 мкс, съответния бит на id_but става 1 } }
void main() { Init(); while (1) { PulseLength = 0; id_but = 0; test = 1; while (RB6) {} //StartPuls length; TMR0 = 0; // while (!RB6) {} // while(RB6){} // PulseLength = TMR0; // rez = 1; // if(PulseLength <10) { // No good pulse rez = 0; // continue; // again } if (rez == 1)break; } // If here, it is start pulse. Wait for the next pulse for (i = 1; i <9; i++){ Puls();
} switch (id_but){ case 32832: {LATC = 1; break;} case 260: {LATC = 2; break;} case 520: {LATC = 4; break;} case 2084: {LATC = 8; break;} } i = 0; }
_________________ Бай Цветан
|
| Пет Май 20, 2016 10:48 am |
|
 |
|
peast
Ранг: Минаващ
Регистриран на: Сря Юли 04, 2012 1:51 pm Мнения: 44 Местоположение: София
|
 Re: PIC16F1829 IR приемник полудях
В бързината съм пуснал програмата неформатирана. Тук е по-четлива
#include "pic16f1829.h"
// CONFIG1 #pragma config FOSC = INTOSC // #pragma config WDTE = OFF // #pragma config PWRTE = OFF // #pragma config MCLRE = ON // #pragma config CP = OFF // #pragma config CPD = OFF // #pragma config BOREN = ON // #pragma config CLKOUTEN = OFF // #pragma config IESO = ON // #pragma config FCMEN = ON // // CONFIG2 #pragma config WRT = OFF // #pragma config PLLEN = ON // #pragma config STVREN = ON // #pragma config BORV = LO // #pragma config LVP = OFF //
#include <xc.h>
int i, j, PulseLength = 0; unsigned int id_but = 0, test = 1, rez = 0;
void Init(void) {
OSCCON = 0b11110010; //8 MHz, INTOSC PORTA = 0; LATA = 0; TRISA = 0; ANSELA = 0; WPUA = 0; PORTC = 0; LATC = 0; TRISC = 0; ANSELC = 0; PORTB = 0; //PORTB init TRISB = 0b01000000; // Port B bit 6 is input LATB = 0; ANSELB = 0; TRISB = 0b01000000; nWPUEN = 0; // Enabled Weak Pull Up's TMR0CS = 0; // TIMER CHOOSED,NOT COUNTER WPUB6 = 1; // -"- TMR0CS = 0; // Timer increments on instruction clock INTCON = 0; //DISAB interrupt OPTION_REGbits.INTEDG = 1; //rising edge trigger the interrupt PSA = 0; // PRESCALER ASSIGNED TO TIMER0 PS2 = 0; PS1 = 1; // PRESCALER RATE = 1:8, 4 MS FOR cycle TMR0 PS0 = 0; }
void Puls(void){ TMR0 = 0; while (!RB6) {} PulseLength = TMR0; while(RB6){} PulseLength = TMR0; if ( PulseLength >85){ for (j=0; j <= i; j++)test = test*2; // id_but = id_but | test; // Ако дължината на импулса е повече от 1200 мкс, съответния бит на id_but става 1 } }
void main() { Init(); while (1) { PulseLength = 0; id_but = 0; test = 1; while (RB6) {} //StartPuls length; TMR0 = 0; // while (!RB6) {} // while(RB6){} // PulseLength = TMR0; // rez = 1; // if(PulseLength <10) { // No good pulse rez = 0; // continue; // again } if (rez == 1)break; } // If here, it is start pulse. Wait for the next pulse for (i = 1; i <9; i++){ Puls(); } switch (id_but){ case 32832: {LATC = 1; break;} case 260: {LATC = 2; break;} case 520: {LATC = 4; break;} case 2084: {LATC = 8; break;} } }
_________________ Бай Цветан
|
| Пет Май 20, 2016 11:05 am |
|
 |
|
slav4o.com
Ранг: Форумен бог
Регистриран на: Нед Яну 01, 2012 8:04 pm Мнения: 2663 Местоположение: София / Велико Търново
|
 Re: PIC16F1829 IR приемник полудях
Как я пускаш на PICKit3 ? Пробвай първо да запишеш програма само за включване на пинове (светване на светодиоди). Подкарай поетапно нещата. такива while (RB6) или while (!RB6) са малко рисковани. Няма никакъв таймаут. Разчита се единсвено на превключване на входа. Ако IR приемника ти е в покой (не излъчваш от дистанционното) програмата ще стои там. TRISB гледам че два пъти си го задавал, по принцип не е проблем, гледам че са еднакви стойностите.
|
| Пет Май 20, 2016 11:40 am |
|
 |
|
tolstolob
Ранг: Ориентиран
Регистриран на: Вто Фев 06, 2007 2:45 am Мнения: 263
|
 Re: PIC16F1829 IR приемник полудях
На ресет пина какво има? Ако няма нищо (външен ресет чип / пулъп / RC верига): #pragma config MCLRE = OFF
Това също трябва да го има (заедно с кавичките): #pragma config "DEBUG" = OFF
|
| Пет Май 20, 2016 12:07 pm |
|
 |
|
peast
Ранг: Минаващ
Регистриран на: Сря Юли 04, 2012 1:51 pm Мнения: 44 Местоположение: София
|
 Re: PIC16F1829 IR приемник полудях
Пускам я на PICKIT, като сложа breakpoint на последния ред на цикъла.Като натисна бутон, се изчитат последователно стойностите на TMR0, запомнят се в id_but, според неговата стойност накрая се зарежда PORTC и спира в брекпоинта. Прочитам стойностите на регистрите, измервам напреженията на крачетата - това е равносилно на поставянето насветодиоди. После - отново Run и се чака натискането на нов бутон
_________________ Бай Цветан
|
| Пет Май 20, 2016 12:32 pm |
|
 |
|
peast
Ранг: Минаващ
Регистриран на: Сря Юли 04, 2012 1:51 pm Мнения: 44 Местоположение: София
|
 Re: PIC16F1829 IR приемник полудях
Забравих да напиша, че ресета го ползвам само за дебъгера. Не знам трябва ли да го изключвам
_________________ Бай Цветан
|
| Пет Май 20, 2016 12:34 pm |
|
 |
|
slav4o.com
Ранг: Форумен бог
Регистриран на: Нед Яну 01, 2012 8:04 pm Мнения: 2663 Местоположение: София / Велико Търново
|
 Re: PIC16F1829 IR приемник полудях
Еми да, той ти го е писал tolstolob. За да може да работи контролера ако е пуснат ресета, трябва да имаш 5 V там.
|
| Пет Май 20, 2016 12:41 pm |
|
 |
|
peast
Ранг: Минаващ
Регистриран на: Сря Юли 04, 2012 1:51 pm Мнения: 44 Местоположение: София
|
 Re: PIC16F1829 IR приемник полудях
Вярно,Славчо. Сетих се, че съм го чел преди. Изключих ресета, но за съжаление грешката е другаде - не ще...
_________________ Бай Цветан
|
| Пет Май 20, 2016 2:11 pm |
|
 |
|
slav4o.com
Ранг: Форумен бог
Регистриран на: Нед Яну 01, 2012 8:04 pm Мнения: 2663 Местоположение: София / Велико Търново
|
 Re: PIC16F1829 IR приемник полудях
Сложи един светодиод на свободен пин. Задай го да светва на определено място в програмата. Ако светне, значи е стигнала дотам. Ако не светне, не е. Местиш мястото където светва в програмата и виждаш къде забива..
|
| Пет Май 20, 2016 2:21 pm |
|
 |
|
slav4o.com
Ранг: Форумен бог
Регистриран на: Нед Яну 01, 2012 8:04 pm Мнения: 2663 Местоположение: София / Велико Търново
|
 Re: PIC16F1829 IR приемник полудях
Пс. Сега се сетих че конфигурациоонните думи, може да не се използват, ако са зададени в MPLAB. Мисля че имаше настройка да ги пренебрегва и да гледа тези в MPLAB които са зададени
|
| Пет Май 20, 2016 2:24 pm |
|
 |
|
tolstolob
Ранг: Ориентиран
Регистриран на: Вто Фев 06, 2007 2:45 am Мнения: 263
|
 Re: PIC16F1829 IR приемник полудях
A пробва ли да билднеш и флашнеш release версия? (#pragma config "DEBUG" = OFF) Edit: кода ти е сбъркан - стигнах до излизането от безкрайния луп и нататък не ми се чете.
|
| Пет Май 20, 2016 2:32 pm |
|
 |
|
peast
Ранг: Минаващ
Регистриран на: Сря Юли 04, 2012 1:51 pm Мнения: 44 Местоположение: София
|
 Re: PIC16F1829 IR приемник полудях
Последната версия на програмата е долу. Предишната е една от безкрайните промени. MPLABX отказва да приеме думите #pragma config "DEBUG" = OFF .
/* * File: dcVel3.c * Author: tsetso * * Created on Maj 20, 2016, 1.40 PM */
#include "pic16f1829.h"
// CONFIG1 #pragma config FOSC = HS // Oscillator Selection (ECH, External Clock, High Power Mode (4-32 MHz): device clock supplied to CLKIN pin) #pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled) #pragma config MCLRE = OFF // MCLR Pin Function Select (MCLR/VPP pin function is MCLR) #pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled) #pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled) #pragma config BOREN = ON // Brown-out Reset Enable (Brown-out Reset enabled) #pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin) #pragma config IESO = ON // Internal/External Switchover (Internal/External Switchover mode is enabled) #pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled) //#pragma config "DEBUG" = OFF // CONFIG2 #pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off) #pragma config PLLEN = OFF // PLL Enable (4x PLL enabled) #pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset) #pragma config BORV = HI // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.) #pragma config LVP = OFF // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming)
#include <xc.h>
int err = 0, i, j, PulseLength = 0; unsigned int id_but = 0, test = 1, rez = 0;
void Init(void) { // OSCCON = PORTA = 0; PORTB = 0; PORTC = 0; LATA = 0; LATB = 0; LATC = 0; TRISA = 0; TRISB = 0b01000000; // Port B bit 6 is input TRISC = 0; ANSELA = 0; ANSELB = 0; ANSELC = 0; nWPUEN = 0; // Enabled Weak Pull Up's WPUA = 0; WPUB6 = 1; // TMR0CS = 0; //Timer choosed, not counter INTCON = 0; INTEDG = 1; //rising edge trigger the interrupt PSA = 0; // PRESCALER ASSIGNED TO TIMER0 PS2 = 0; PS1 = 1; // 1:8 PRESCALER RATE PS0 = 0; }
void Puls(void){ TMR0 = 0; while (!RB6) {} PulseLength = TMR0; while(RB6){} PulseLength = TMR0; if ( PulseLength >85){ for (j=0; j <= i; j++)test = test*2; id_but = id_but | test; } }
void main() { Init(); while(1){ while (1) { PulseLength = 0; id_but = 0; test = 1; while (RB6) {} //StartPuls TMR0 = 0; while (!RB6) {} PulseLength = TMR0; while(RB6){} rez = 1; if(PulseLength <80) { rez = 0; continue; } if (rez == 1)break; } // If here, it is start pulse. Wait for the next pulse for (i = 1; i <9; i++){ Puls(); } switch (id_but){ case 32832: {LATC = 1; break;} case 260: {LATC = 2; break;} case 520: {LATC = 4; break;} case 2084: {LATC = 8; break;} } i = 0; } }
_________________ Бай Цветан
|
| Пет Май 20, 2016 3:21 pm |
|
 |
|
itso.t
Ранг: Форумен бог
Регистриран на: Чет Фев 03, 2005 2:21 am Мнения: 12764 Местоположение: София
|
 Re: PIC16F1829 IR приемник полудях
Има бутон за вмъкване на код, с който сорса остава прегледен...
|
| Пет Май 20, 2016 3:24 pm |
|
 |
|
tolstolob
Ранг: Ориентиран
Регистриран на: Вто Фев 06, 2007 2:45 am Мнения: 263
|
 Re: PIC16F1829 IR приемник полудях
Още греди: - с този прескалер (1:8) и на тази честота можеш да измериш максимум 1023 us. - не следиш таймера за препълване - и т.н. Що не кажеш какви импулси се очакват за четирите бутона, може и код да сглобим 
|
| Пет Май 20, 2016 3:35 pm |
|
 |
|
peast
Ранг: Минаващ
Регистриран на: Сря Юли 04, 2012 1:51 pm Мнения: 44 Местоположение: София
|
 Re: PIC16F1829 IR приемник полудях
Ицо, не можах да разбера къде да видя кода за форматиран код. Съжалявам за безумния вид на програмата. Ако искаш, дай ориентация. Драги Толстолоб, имам да мисля по твоите думи. Отначало започнах с прекъсвания, но се оплетох и започнах да гледам от един асемблерски файл и да го превеждам на С. Не ми се ще да работя на Асемблер - малко е бавно, макар че е красиво. Ще опитам пак с прекъсвания. След някой ден може пак да се появя.
_________________ Бай Цветан
|
| Пет Май 20, 2016 3:52 pm |
|
|