Sari la conținut
ELFORUM - Forumul electronistilor

probleme programare pic16F723 si pic18F452


Vizitator dorianetegan

Postări Recomandate

Vizitator dorianetegan

programare pic16f723 : pinul RA3 primeste semnal(bit 1 - de la pic18F452) pentru a putea comanda pinul RA1. Pinul RA1 - trimite un semnal de trigger(tensiune 5V) ; Pinii RA5 si CCCP1(RC2) sunt folositi pentru determinarea distantei. Dupa determinarea valorii aceasta trebuie trimisa inapoi catre pic18f452 cu ajutorul pinul RA3: - cum trimit semnalul de trigger (LATAbits.LATA1=0/1 imi da eroare in MPLAB) - cum trimit valoarea distantei - send_value(unsigned int val)- stiu ca trebuie sa modific pinul RA3 inapoi in output pin dar cum fac conversia valoare-tensiune? sau altfel? - am facut bine delay-urile de ms si us?#include #include #include "bit.h" // macros#include #include #include #pragma config WDT = OFF #pragma config OSC = HS #pragma config PWRT = ON #pragma config LVP = OFF#use delay(clock=4000000)void init(void);void init_ports(void);void enable_interrupts(void);void disable_interrupts(void);void delay_ms(unsigned int duration);int send_val(unsigned int val);void delay_us(unsigned int duration);unsigned char ch;char a[17], *tc;long tlong;unsigned int T1_O = 0; // timer1 overflow updated in interrupt routine.unsigned short gCapInt = 0; // captured something in interrupt routine.unsigned short gfCapOn = 1; // control capture only capture 1st value.unsigned int t_capL = 0; // timer 1 low.unsigned int t_capH = 0; // timer 1 high.unsigned int t_capO = 0; // timer 1 overflow.unsigned int gCapVal = 0; // captured value.void init(void){OPTION_REG = 0xD7;TMR0 = 0;CCP1CON = 0x05; // set CCP to capture mode every rising edge.T1CON = (1< - cum fac afisarea a 3 valori pe un LCD POWERTIP cu pinii RD7-0 si RB0-RS;RB1-E; RB2-R/W?

New Text Document.txt

Link spre comentariu
  • Răspunsuri 14
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Liviu M

    6

  • costi002

    1

Top autori în acest subiect

Imagini postate

Ce compilator ai folosit?Vad ca vrei sa folosesti intreruperi. Care-i functia care se ocupa de tratarea lor?De ce trebuie sa transmiti datele inapoi la 452 pe acelasi pin?LE Seria 16F nu are registrii LAT, asa ca LATxbits.LATx nu exista. Foloseste tot PORTxbits.Rx ca la citire.

Link spre comentariu
Vizitator dorianetegan

pentru pic16f723 folosesc Hi-TECH-PICC(V.9.83)iar pentru pic18F452 folosesc C18(v. 3.4)asa am facut circuitul picului 16f723 :Dnu stiu care este functia care se preocupa de perturbatii :( pe alt program aveam delays.h insa acum pe mplabul nou nu merge aceasta librarie(bine pe pic18f merge libraria pe 16f nu merge)

Link spre comentariu

In picc, pentru tratarea intreruperilor trebuie sa definesti o functie cu interrupt in nume, ca functia de mai jos.

void interrupt isr(void){    if(INTCONbits.RBIE && INTCONbits.RBIF)    {        //RB4-RB5 - rotary encoder                INTCONbits.RBIE = 0;        ucEncNewVal = PORTB; // read the RB port to clear the missmatch condition        INTCONbits.RBIF = 0;        ucEncNewVal = PORTB; // read the RB port to clear the missmatch condition        INTCONbits.RBIF = 0;        bEnc0 = PORTBbits.RB4;        bEnc1 = PORTBbits.RB5;        bNewEncData = 1;    }}
Compilatorul stie mai departe ce sa faca cu ea.

Tot picc are mai nou macrourile (cred), __delay_us() si __delay_ms() pentru temporizari.

Ca sa mearga trebuie sa definesti frecventa ceasului de sistem

#define _XTAL_FREQ 20000000 // 20 MHz
Dupa cum exista deja functiile ei() si di() pentru activare/dezactivare intreruperi.

Si tot pentru picc e recomandat sa incluzi , nu fisierele pentru microcontroller

#include <htc.h>
nu

#include <pic16f723.h>

Da' cel mai bine citesti manualul care se gaseste in directorul \docs\ si se porneste din mplab cu F11 (parca).

Si daca tot incepi cu compilatorul picc pentru seria 16F, eu as continua cu el si pentru seria 18F (picc18), ca sunt destul de asemanatoare (si destul de diferite de C18).

Link spre comentariu
Vizitator dorianetegan

void interrupt isr(void)

{

if(INTCONbits.RBIE && INTCONbits.RBIF)

{

//RB4-RB5 - rotary encoder

 

INTCONbits.RBIE = 0;

ucEncNewVal = PORTB; // read the RB port to clear the missmatch condition

imi da eroare pe ucEncNewVAL

INTCONbits.RBIF = 0;

ucEncNewVal = PORTB; // read the RB port to clear the missmatch condition

INTCONbits.RBIF = 0;

 

bEnc0 = PORTBbits.RB4; // si la benc0 imi da eroare nu cunoaste valorile

bEnc1 = PORTBbits.RB5;

bNewEncData = 1;

}

}

[code=auto:0]

 

 

In alta ordine de idei cum as putea sa transmit o valoare pe pinul RA3? catre celalalt microcontroler?

si daca am configurat OSC ca fiind egal cu 4mhz de la cuartul extern de ce mai trebuie sa definesc frecventa?

iar macrourile _delay_ms() si _delay_us() nu merg :( ar fi fost frumos sa mearga sa nu fiu nevoit sa fac cele 2 functii de delay care nu cred ca imi creeaza delayul corect...dupa calculele mele :|

Link spre comentariu

Exemplul ala n-are cum sa-ti mearga, e dintr-un proiect de-al meu. L-am pus sa vezi cam cum se face.La __delay_ms() si __delay_us() sunt 2 _ la inceput.De _XTAL_FREQ ai nevoie pentru functiile __delay_xs() nu pentru functionarea controllerului.Ca sa transmiti datele pe un pin care nu suporta asta in hard, trebuie sa implementezi in software un protocol serial de comunicatie.Asta pana la urma e un proiect pentru scoala?

Link spre comentariu
Vizitator dorianetegan

Exemplul ala n-are cum sa-ti mearga, e dintr-un proiect de-al meu. L-am pus sa vezi cam cum se face.La __delay_ms() si __delay_us() sunt 2 _ la inceput.De _XTAL_FREQ ai nevoie pentru functiile __delay_xs() nu pentru functionarea controllerului.Ca sa transmiti datele pe un pin care nu suporta asta in hard, trebuie sa implementezi in software un protocol serial de comunicatie.Asta pana la urma e un proiect pentru scoala?

da stiu ca sunt 2__ si tot nu imi merge :Pdap este un proiect de scoala. insa nu am cum sa fac transmisie seriala: cu un RS232... pentru ca nu am hard care sa suporte RS232.

post-67310-139829454419_thumb.jpg

Link spre comentariu

Daca nu poti schimba hardware-ul (incearca, poate te lasa, ambele PICuri au porturi seriale (RS232, i2c si SPI) implementate hard), trebuie implementat un protocol software (schimbi RA3 in iesire si shiftui bitii valorii prin el). Va trebui sa implementezi si receptia in mod corespunzator in capatul celalalt. Sau cauti pe internet rutine de transmisie seriala soft si le adaptezi le tine.Referitor la __delay_xs(), ai inclus htc.h asa cum ti-am zis intr-un post anterior?M-am uitat acum si delay-urile sunt definite in pic.h, fisier inclus automat de htc.h. Poti sa te uiti in fisierul ala sa vezi daca si cum sunt definite (la mine sunt in ../picc/9.82/include/pic.h).

Link spre comentariu
Vizitator dorianetegan

da am inclus libraria htc.h nu stiu de ce nu merge oricum faza cu transmisie seriala hard nu se poate nu am proiectat placutele cu transmisie seriala iar transmisie prin soft chiar nu stiu sa fac ; din cate am inteles ar mai fi o transmisie seriala Tx/Rx pe 2 pini+masa doar ca pinii trebuie sa fie ssp dar nici pe aceasta nu stiu sa o fac :(( o sa ma uit poate gasesc ceva

Link spre comentariu
Vizitator dorianetegan

rutinele respective de delay sunt pentru PICCPRO, cum eu am lite nu pot sa le folosesc asa ca am incercat sa le copiez direct in program si pe pic16 nu-mi face probleme dar pe pic18 imi da ceva erori.Cum modific o rutina pentru afisare?Am LCD 2x16 caractere: programare biti: PORTD 0-7PORTB 0-2(RS-RB0;E-RB1;R/W-RB2)Ce trebuie sa-mi afiseze este in felul urmator:Pe prima linie : "Distanta in m:" Iar pe a 2-a linie : valoarea distantei. - numai aceasta linie se modifica mereu.

Link spre comentariu
Vizitator dorianetegan

trebuie sa vedem codul sursa

De exemplu fisierele pe care le-am atasat. Sunt din demo sample ale HI-TECH-PICC18LCD.h
#ifndef _LCD_H_#define _LCD_H_/* *	LCD interface header file *//* 	Defining CHECKBUSY will check if the LCD is busy. The RW bit of the  * 	LCD must connected to a port of the processor for the check busy * 	process to work. *  * 	If CHECKBUSY is not defined it will instead use a delay loop. * 	The RW bit of the LCD does not need to connected in this case. */// #define CHECKBUSY	1#ifdef CHECKBUSY	#define	LCD_WAIT lcd_check_busy()#else	#define LCD_WAIT DelayMs(5)#endif#define MESSAGE_LINE		0x0#define LCD_RS	LA3#define LCD_EN	LA1#define LCD_RW	LA2 #define LCD_DATA	LATD#define LCD_DATA_PORT	PORTD #define LCD_RS_TRIS	TRISA3#define LCD_EN_TRIS	TRISA1#define LCD_RW_TRIS	TRISA2 #define LCD_DATA_TRIS	TRISD#define FOURBIT_MODE	0x0#define EIGHTBIT_MODE	0x1#define OUTPUT_PIN      0x0	#define INPUT_PIN       0x1	#define OUTPUT_DATA     0x0	#define INPUT_DATA      0x0F	#define LCD_STROBE()	LCD_EN = 1; asm("nop"); asm("nop"); LCD_EN = 0#define LCD_STROBE_READ(value)	LCD_EN = 1; \				asm("nop"); asm("nop"); \				value=LCD_DATA_PORT; \				LCD_EN = 0; #define	lcd_cursor(x)			lcd_cmd(((x)&0x7F)|0x80)#define lcd_clear()			lcd_cmd(0x1)#define lcd_putch(x)			lcd_data(x)#define lcd_goto(x)			lcd_cmd(0x80+(x));#define lcd_cursor_right()		lcd_cmd(0x14)#define lcd_cursor_left()		lcd_cmd(0x10)#define lcd_display_shift()		lcd_cmd(0x1C)#define lcd_home()			lcd_cmd(0x2)extern void lcd_cmd(unsigned char);extern void lcd_data(unsigned char);extern void lcd_puts(const char * s);extern void lcd_init(unsigned char);#endif
LCD.c
/* *	LCD interface example *	Uses routines from delay.c *	This code will interface to a standard LCD controller *	like the Hitachi HD44780. It uses it in 4 or 8 bit mode *	 */#include	<htc.h>#include	"lcd.h"#include	"delay.h" static bit fourbit;		// four or eight bit mode?#ifdef CHECKBUSYunsigned char lcd_read_cmd_nowait(void) {	unsigned char c, readc;	LCD_DATA_TRIS	 = INPUT_DATA;	LCD_RW = 1; // Read LCD	asm("nop"); // short propagation delay	asm("nop"); // short propagation delay	if (fourbit) {		LCD_STROBE_READ(readc); // Read high nibble		// Move 4 bits to high nibble while zeroing low nibble		c = ( ( readc << 4 ) & 0xF0 ); 		LCD_STROBE_READ(readc); // Read low nibble    	c |= ( readc & 0x0F ); // Or in 4 more bits to low nibble	} else {		LCD_STROBE_READ(readc); 		c = readc;	}	LCD_RW = 0; // Return to default mode of writing LCD	LCD_DATA_TRIS	 = OUTPUT_DATA; // Return to default mode of writing LCD	return(c);}// Return when the LCD is no longer busy, or we've waiting long enough!voidlcd_check_busy(void) {	// To avoid hanging forever in event there's a bad or 	// missing LCD on hardware.  Will just run SLOW, but still run.	unsigned int retry; 	unsigned char c;	for (retry=1000; retry-- > 0; ) {		c = lcd_read_cmd_nowait();		if (0==(c&0x80)) break; // Check busy bit.  If zero, no longer busy	}}#endif/* send a command to the LCD */voidlcd_cmd(unsigned char c){	LCD_WAIT; // may check LCD busy flag, or just delay a little, depending on lcd.h	if (fourbit) {		LCD_DATA = ( ( c >> 4 ) & 0x0F );		LCD_STROBE();    		LCD_DATA = ( c & 0x0F );		LCD_STROBE();	} else {		LCD_DATA = c;		LCD_STROBE();	}}/* send data to the LCD */voidlcd_data(unsigned char c) {	LCD_WAIT; // may check LCD busy flag, or just delay a little, depending on lcd.h	LCD_DATA = 0;	LCD_RS = 1;	if (fourbit) {    	LCD_DATA |= ( ( c >> 4 ) & 0x0F );      		LCD_STROBE();		LCD_DATA &= 0xF0;		LCD_DATA |= ( c & 0x0F ); 		LCD_STROBE();	} else {		LCD_DATA = c;		LCD_STROBE();	}	LCD_RS = 0;}/* write a string of chars to the LCD */voidlcd_puts(const char * s) {	while(*s)		lcd_data(*s++);}/* initialize the LCD */voidlcd_init(unsigned char mode) {	char init_value;	fourbit		= 0;	if (mode == FOURBIT_MODE){		fourbit = 1;		init_value = 0x3;	}else{		init_value = 0x3F;	}	LCD_RS = 0;	LCD_EN = 0;	LCD_RW = 0;	LCD_RS_TRIS	 = OUTPUT_PIN;	LCD_EN_TRIS	 = OUTPUT_PIN;	LCD_RW_TRIS	 = OUTPUT_PIN;	LCD_DATA_TRIS	 = OUTPUT_DATA;	DelayMs(15);	LCD_DATA	 = init_value;	LCD_STROBE();	DelayMs(5);	LCD_DATA	 = init_value;	LCD_STROBE();	DelayUs(200);	LCD_DATA	 = init_value;	LCD_STROBE();		if (fourbit){		LCD_WAIT; //may check LCD busy flag, or just delay a little, depending on lcd.h		LCD_DATA = 0x2; // Set 4-bit mode		LCD_STROBE();		lcd_cmd(0x28); // Function Set	}else{		lcd_cmd(0x38);	}	lcd_cmd(0xF); //Display On, Cursor On, Cursor Blink	lcd_cmd(0x1); //Display Clear	lcd_cmd(0x6); //Entry Mode	lcd_cmd(0x80); //Initialize DDRAM address to zero}
Link spre comentariu

rutinele respective de delay sunt pentru PICCPRO, cum eu am lite

Diferenta intre pro si lite e optimizarea. Eu folosesc tot variantele lite ale picc si-mi merg foarte bine.

 

Referitor la LCD, cum spunea si costi002, arata-ne ce ai facut deja si noi te corectam/indrumam in continuare. Ce ne-ai aratat tu sunt niste rutine generale, care trebuiesc adaptate la schema/configuratia ta. Dupa ce faci modificarile/adaptarile necesare, daca ai probleme, posteaza-le aici.

Nu stiu daca e cazul sa astepti ca cineva de pe forum sa faca treaba in locul tau.

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări