Vizitator dorianetegan Postat Iunie 24, 2012 Partajează Postat Iunie 24, 2012 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
Liviu M Postat Iunie 24, 2012 Partajează Postat Iunie 24, 2012 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 Postat Iunie 24, 2012 Partajează Postat Iunie 24, 2012 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
Liviu M Postat Iunie 24, 2012 Partajează Postat Iunie 24, 2012 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 MHzDupa 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 Postat Iunie 24, 2012 Partajează Postat Iunie 24, 2012 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
Liviu M Postat Iunie 25, 2012 Partajează Postat Iunie 25, 2012 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 Postat Iunie 25, 2012 Partajează Postat Iunie 25, 2012 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. Link spre comentariu
Liviu M Postat Iunie 25, 2012 Partajează Postat Iunie 25, 2012 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 Postat Iunie 25, 2012 Partajează Postat Iunie 25, 2012 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 Postat Iunie 25, 2012 Partajează Postat Iunie 25, 2012 Nu am libraria pic.h poti sa o trimiti te rog mult Scuze! am rezolvat problema cu delays Link spre comentariu
Liviu M Postat Iunie 26, 2012 Partajează Postat Iunie 26, 2012 Pana la urma iti mai trebuie biblioteca aia?E pentru versiunea 9.82, e dintr-o instalare de Linux, da' cred ca merge. Link spre comentariu
Vizitator dorianetegan Postat Iunie 26, 2012 Partajează Postat Iunie 26, 2012 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
costi002 Postat Iunie 26, 2012 Partajează Postat Iunie 26, 2012 trebuie sa vedem codul sursa Link spre comentariu
Vizitator dorianetegan Postat Iunie 26, 2012 Partajează Postat Iunie 26, 2012 trebuie sa vedem codul sursaDe 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);#endifLCD.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
Liviu M Postat Iunie 26, 2012 Partajează Postat Iunie 26, 2012 rutinele respective de delay sunt pentru PICCPRO, cum eu am liteDiferenta 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
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum