Отговори на тема  [ 22 мнения ]  Отиди на страница 1, 2  Следваща
PIC16F1829 IR приемник полудях 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Юли 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
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Юли 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
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Яну 01, 2012 8:04 pm
Мнения: 2663
Местоположение: София / Велико Търново
Мнение Re: PIC16F1829 IR приемник полудях
Как я пускаш на PICKit3 ?
Пробвай първо да запишеш програма само за включване на пинове (светване на светодиоди). Подкарай поетапно нещата.
такива while (RB6) или while (!RB6) са малко рисковани. Няма никакъв таймаут. Разчита се единсвено на превключване на входа. Ако IR приемника ти е в покой (не излъчваш от дистанционното) програмата ще стои там.
TRISB гледам че два пъти си го задавал, по принцип не е проблем, гледам че са еднакви стойностите.

_________________
https://github.com/slav4ocom/


Пет Май 20, 2016 11:40 am
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Вто Фев 06, 2007 2:45 am
Мнения: 263
Мнение Re: PIC16F1829 IR приемник полудях
На ресет пина какво има? Ако няма нищо (външен ресет чип / пулъп / RC верига):
#pragma config MCLRE = OFF

Това също трябва да го има (заедно с кавичките):
#pragma config "DEBUG" = OFF


Пет Май 20, 2016 12:07 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Юли 04, 2012 1:51 pm
Мнения: 44
Местоположение: София
Мнение Re: PIC16F1829 IR приемник полудях
Пускам я на PICKIT, като сложа breakpoint на последния ред на цикъла.Като натисна бутон, се изчитат последователно стойностите на TMR0, запомнят се в id_but, според неговата стойност накрая се зарежда PORTC и спира в брекпоинта. Прочитам стойностите на регистрите, измервам напреженията на крачетата - това е равносилно на поставянето насветодиоди. После - отново Run и се чака натискането на нов бутон

_________________
Бай Цветан


Пет Май 20, 2016 12:32 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Юли 04, 2012 1:51 pm
Мнения: 44
Местоположение: София
Мнение Re: PIC16F1829 IR приемник полудях
Забравих да напиша, че ресета го ползвам само за дебъгера. Не знам трябва ли да го изключвам

_________________
Бай Цветан


Пет Май 20, 2016 12:34 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Яну 01, 2012 8:04 pm
Мнения: 2663
Местоположение: София / Велико Търново
Мнение Re: PIC16F1829 IR приемник полудях
Еми да, той ти го е писал tolstolob. За да може да работи контролера ако е пуснат ресета, трябва да имаш 5 V там.

_________________
https://github.com/slav4ocom/


Пет Май 20, 2016 12:41 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Юли 04, 2012 1:51 pm
Мнения: 44
Местоположение: София
Мнение Re: PIC16F1829 IR приемник полудях
Вярно,Славчо. Сетих се, че съм го чел преди. Изключих ресета, но за съжаление грешката е другаде - не ще...

_________________
Бай Цветан


Пет Май 20, 2016 2:11 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Яну 01, 2012 8:04 pm
Мнения: 2663
Местоположение: София / Велико Търново
Мнение Re: PIC16F1829 IR приемник полудях
Сложи един светодиод на свободен пин. Задай го да светва на определено място в програмата. Ако светне, значи е стигнала дотам. Ако не светне, не е. Местиш мястото където светва в програмата и виждаш къде забива..

_________________
https://github.com/slav4ocom/


Пет Май 20, 2016 2:21 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Яну 01, 2012 8:04 pm
Мнения: 2663
Местоположение: София / Велико Търново
Мнение Re: PIC16F1829 IR приемник полудях
Пс. Сега се сетих че конфигурациоонните думи, може да не се използват, ако са зададени в MPLAB. Мисля че имаше настройка да ги пренебрегва и да гледа тези в MPLAB които са зададени

_________________
https://github.com/slav4ocom/


Пет Май 20, 2016 2:24 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Вто Фев 06, 2007 2:45 am
Мнения: 263
Мнение Re: PIC16F1829 IR приемник полудях
A пробва ли да билднеш и флашнеш release версия? (#pragma config "DEBUG" = OFF)
Edit: кода ти е сбъркан - стигнах до излизането от безкрайния луп и нататък не ми се чете.


Пет Май 20, 2016 2:32 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Юли 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
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 03, 2005 2:21 am
Мнения: 12765
Местоположение: София
Мнение Re: PIC16F1829 IR приемник полудях
Има бутон за вмъкване на код, с който сорса остава прегледен...
Код:
те т'ва


Пет Май 20, 2016 3:24 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Вто Фев 06, 2007 2:45 am
Мнения: 263
Мнение Re: PIC16F1829 IR приемник полудях
Още греди:
- с този прескалер (1:8) и на тази честота можеш да измериш максимум 1023 us.
- не следиш таймера за препълване
- и т.н.
Що не кажеш какви импулси се очакват за четирите бутона, може и код да сглобим :)


Пет Май 20, 2016 3:35 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Юли 04, 2012 1:51 pm
Мнения: 44
Местоположение: София
Мнение Re: PIC16F1829 IR приемник полудях
Ицо, не можах да разбера къде да видя кода за форматиран код. Съжалявам за безумния вид на програмата. Ако искаш, дай ориентация.
Драги Толстолоб, имам да мисля по твоите думи. Отначало започнах с прекъсвания, но се оплетох и започнах да гледам от един асемблерски файл и да го превеждам на С. Не ми се ще да работя на Асемблер - малко е бавно, макар че е красиво. Ще опитам пак с прекъсвания. След някой ден може пак да се появя.

_________________
Бай Цветан


Пет Май 20, 2016 3:52 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 22 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 0 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни