PIC16F887 programiranje

Rasprava o PIC mikrokontrolerima, PIC projekti i drugo vezano za PIC-eve...

Moderators: pedja089, stojke369, [eDo], trax

Post Reply
lucatoni05
Posts: 7
Joined: 02-04-2013, 16:54

PIC16F887 programiranje

Post by lucatoni05 »

Pozdrav svima
Novi sam na forumu i posto sam poceo uciti programirati u MikroC-u ,i sad imam zadatak da uradim primjer radara za brzinu(misli se na radar koji je psoatvljen na ulicama)on bi radio na sljedecem principu (one trake koje se nalaze na cesti ,zamijenjene su sa dva tastera) stavimo neki delay od 100us i kad pritisnemo taster brojac treba da krene da broji i uvecava svoju vrijednost svakih 100us ,kad pritisnemo drugi taster brojac treba da stane sa brojanjem.i onda posto smo za primejr uzeli da je razmak izmedju onih traka na putu 1m,po proracunu sam dobio da je brzina jednaka speed=36000/i ( "i" sam koristio za brojanje).Sad kad sve ovo izracuna treba to da ispise na 7-segmentnom display-u(cetiri 7-segmenta displaya su povezana)pa zavisno od brzine ispisace se na jednom,dva ili mozda tri displaya. Ali meni je problem sto aj ne znam kako to da uradim ,ja sam dosad uradio ovu istu stvar samo sto je ispis bio na Lcd display-u i to sam zavrsio,ali na ovim ne znam ni kako bih poceo.
Evo sema kako su display-i spojeni sa mikrokontrolerom: http://s13.postimg.cc/nk3v2tk2f/Capture.png
User avatar
Kukinjos
Pravi forumaš
Pravi forumaš
Posts: 1724
Joined: 28-03-2012, 18:01
Location: Split

Re: PIC16F887 programiranje

Post by Kukinjos »

Imaš od mikroelektronike demo za baš takav 7-segmentni display, spojen upravo tako, sve je riješeno, samo ga trebaš adaptirat za tvoj slučaj, tj. uzmi dio za računanje brzine automobila iz koda kojeg već imaš, a dio za ispis iskoristi iz ovog primjera. Pogledaj samo main petlju kako je jednostavno upisat znamenke na display.

Code: Select all

/*
 * Project name:
     Seven Segment Display (The 'Hello World' example for the Seven Segment Display)
 * Copyright:
     (c) Mikroelektronika, 2011.
 * Revision History:
     20110929:
       - initial release (FJ);
 * Description:
     This code demonstrates how to display number on one 7-segment display
     (common cathode). Display is connected to PORTD (RD0..RD7, segment A to
     RD0, segment B to RD1, etc); common cathode is connected to the pin RA0 on
     PORTA. Number is incremented every 1s.
 * Test configuration:
     MCU:             PIC18F45K22
                      http://ww1.microchip.com/downloads/en/DeviceDoc/41412D.pdf
     Dev.Board:       EasyPIC7 - ac:7SEG
                      http://www.mikroe.com/eng/products/view/757/easypic-v7-development-system/
     Oscillator:      HS-PLL 32.0000 MHz, 8.0000 MHz Crystal
     Ext. Modules:    None.
     SW:              mikroC PRO for PIC
                      http://www.mikroe.com/eng/products/view/7/mikroc-pro-for-pic/
 * NOTES:
     - Turn on Seven Segment Display switches SW4.1, SW4.2, SW4.3 and SW4.4. (board specific)
 */

#include "Display_Utils.h"

unsigned short shifter, portd_index;
unsigned int   digit, number;
unsigned short portd_array[4];

void interrupt() {
  LATA = 0;                             // Turn off all 7seg displays
  LATD = portd_array[portd_index];      // bring appropriate value to PORTD
  LATA = shifter;                       // turn on appropriate 7seg. display

  // move shifter to next digit
  shifter <<= 1;
  if (shifter > 8u)
    shifter = 1;

  // increment portd_index
  portd_index++ ;
  if (portd_index > 3u)
    portd_index = 0;             // turn on 1st, turn off 2nd 7seg.
  TMR0L  =   0;                  // reset TIMER0 value
  TMR0IF_bit = 0;                // Clear TMR0IF
}

void main() {
  ANSELA = 0;                    // Configure PORTA pins as digital
  ANSELD = 0;                    // Configure PORTD pins as digital

  TRISA = 0;                     // Configure PORTA as output
  LATA  = 0;                     // Clear PORTA
  TRISD = 0;                     // Configure PORTD as output
  LATD  = 0;                     // Clear PORTD

  T0CON = 0xC4;                  // Set TMR0 in 8bit mode, assign prescaler to TMR0
  TMR0L = 0;                     // clear TMROL
  digit = 0;
  portd_index = 0;
  shifter = 1;

  number = 1234;                 // Initial number value
  GIE_bit = 1;
  TMR0IE_bit = 1;

  do {
    digit = number / 1000u ;             // extract thousands digit
    portd_array[3] = mask(digit);        // and store it to PORTD array
    digit = (number / 100u) % 10u;       // extract hundreds digit
    portd_array[2] = mask(digit);        // and store it to PORTD array
    digit = (number / 10u) % 10u;        // extract tens digit
    portd_array[1] = mask(digit);        // and store it to PORTD array
    digit = number % 10u;                // extract ones digit
    portd_array[0] = mask(digit);        // and store it to PORTD array

    Delay_ms(1000);                      // one second delay

    number++ ;                           // increment number
    if (number > 9999u)
      number = 0;

  } while(1);                            // endless loop
}
Istina ovdje se radi o drugom kontroleru, ali ti si već kod napisao za taj 887, pa ti neće bit problem vidjet razlike i što trebaš prilagodit iz ovog.
Cezare, star sam i nemoćan, ali poslušaj moj savjet ....
lucatoni05
Posts: 7
Joined: 02-04-2013, 16:54

Re: PIC16F887 programiranje

Post by lucatoni05 »

Meni ovo nikako ne ide,pa ako mi neko moze to sastaviti evo i ovaj moj prethodni kod koji imam za LCD :

Code: Select all

sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;


unsigned char overflow,overflow_old,speed;
char txt[4];
char txt2[]= "Km/h";
int i=0,i_old=0;


void main() {
TRISB = 0;
PORTB = 0;
TRISD0_bit = 1;
TRISD1_bit = 1;
ANSEL = 0;
ANSELH = 0;
Lcd_Init();                     // Initialize LCD
Lcd_Cmd(_LCD_CLEAR);            // Clear LCD display
Lcd_Cmd(_LCD_CURSOR_OFF);       // Turn cursor off
GIE_bit = 0;




       while(1) {
                if(Button(&PORTD,0,50,0)) {
                while(1) {
                Delay_us(100);
                i++;
                if(Button(&PORTD,1,50,0)) {
                i_old=i;
                i=0; 
                break;
                }
                }
                speed = 36000/i_old ;
                }
                ByteToStr(speed,txt);
                Lcd_Out(1,1,txt);
                Lcd_Out(1,5,txt2);




                }
                }
nermin_np
Pocetnik na forumu
Pocetnik na forumu
Posts: 30
Joined: 21-02-2013, 10:38

Re: PIC16F887 programiranje

Post by nermin_np »

Ne znam koliko sam tacno razumeo gore navedene zahteve koje aplikacija treba da odradi. Uradio sam neki primer u ISIS i MikroC, pa vidi valjal, osim sto prikazuje na display-u proracunatu brzinu, prikazuje se i trenutno stanje brojaca "i", tako da ces lakse videti jel ima gresaka u proracunu i iste prepraviti...
Sto se tice sedmosegmentnog display-a, lakse ti je da uzmes neki BCD konvertor tipa 4511, vezes ga za svaki od display-a i vrsis pobudu preko tranzistora svakog od njih u odredjenim vremenskim intervalima kao sto si i poslao gore na prvoj slici, na taj nacin zauzimas samo cetiri izlaza mikrokontrolera (ako se ne gledaju i izvodi za dovodjenje tranzistora u provodno stanje). Preporucio bih ti da radis sa LCD display-em, imas manje posla...
Attachments
brzina.zip
(56.63 KiB) Downloaded 347 times
lucatoni05
Posts: 7
Joined: 02-04-2013, 16:54

Re: PIC16F887 programiranje

Post by lucatoni05 »

Hvala za ovo sto si se potrudio,ali meni ne treba to,vec mi treba da ispisuje brzinu na 7-segmentnim displayima i na LCD displayu istovremeno.Evo vam sve ono sto sam ja dosad uradio pa ako mi mozete ikako pomoci
Attachments
Radar.zip
Ovdje je napisan kod za prikazivanje na LCD-u ,ako neko zna i zeli treba mi dodati na ovaj moj kod samo dio sa kojim ce se ovo isto ispisivati i na 7-segmentnim displayima.Ovdje u proteusu ima uradjena i sema kako su povezani
(51.69 KiB) Downloaded 392 times
lucatoni05
Posts: 7
Joined: 02-04-2013, 16:54

Re: PIC16F887 programiranje

Post by lucatoni05 »

Moze li mi netko pomoci sa ovim jer stvarno kako god pokusam nece da radi
Maki
Odlično uznapredovao
Odlično uznapredovao
Posts: 766
Joined: 02-07-2012, 12:54

Re: PIC16F887 programiranje

Post by Maki »

Spoji 7-segmentni displej ovako kao sto je na ovom linku (http://www.elektronika.ba/forum/viewtop ... 9&start=20) skroz sa zadnjeg posta (zadnja shema) . Posto nisam radio puno u c-u nadam se da znas izvuc desetice,jedinice,stotice i sl. iz nekog broja. Kad si to napravio napises nesto poput ovog samo malo u C obliku .
POCETAK:
PORTB= BROJ1 'postavljanje
prve vrednosti na port b
HIGH PORTB.7 'ukljucivanje
displeja
PAUSE 5 '
zadrzavanje prikaza
LOW PORTB.7
'iskljucivanje displeja
PORTB=BROJ2 'postavljanje
druge vrednosti....
HIGH PORTB.6
PAUSE 5
LOW PORTB.6
PORTB=BROJ3
HIGH PORTB.5
PAUSE 5
LOW PORTB.5
GOTO POCETAK
Kad si to malo promjenio ubacis taj dio tamo umjesto ispisa na lcd . Broj1 je varijabla u kojoj je spremljen najveci broj u ovom slucaju stotica . Pocetak i goto pocetak znaci samo ponavljanje te petlje . High znaci da postavi taj i taj pin u stanje 1, a low obratno. Pause je pauza u milisekundam . Ako sto nije jasno reci i da sjetio sam se da mozes izvlacit stotice , desetise i jedinice pomocu dijeljenja i modula-ostatak (%) . Npr. 54%10=4 . Modulo je niza operacija od dijeljenja (i sl. takvih) , ali izvodi se prije zbrajanja .
Samo da jos dodam da 7-seg displej moze biti na bilo kojem drugom portu koji je definiran kao izlazni. I daj je komplet posvecen samo 7-seg dispelju.
User avatar
Kukinjos
Pravi forumaš
Pravi forumaš
Posts: 1724
Joined: 28-03-2012, 18:01
Location: Split

Re: PIC16F887 programiranje

Post by Kukinjos »

Pokušao sam spojit dva programa, tvoj i onaj od mikroelektronike, kao što sam rekao u prethodnom postu. Simulacija preoptereti procesor i ne radi kako treba, pa bi trebao probat na pravom hardware-u. Proteus ima problem s interruptima. Pogledaj ideju i vidi je li ti to odgovara.
Radar.rar
(69.19 KiB) Downloaded 349 times
Cezare, star sam i nemoćan, ali poslušaj moj savjet ....
Post Reply