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
PIC16F887 programiranje
Moderators: pedja089, stojke369, [eDo], trax
Re: PIC16F887 programiranje
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.
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.
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
}
Cezare, star sam i nemoćan, ali poslušaj moj savjet ....
-
- Posts: 7
- Joined: 02-04-2013, 16:54
Re: PIC16F887 programiranje
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);
}
}
Re: PIC16F887 programiranje
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...
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
-
- Posts: 7
- Joined: 02-04-2013, 16:54
Re: PIC16F887 programiranje
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
-
- Posts: 7
- Joined: 02-04-2013, 16:54
Re: PIC16F887 programiranje
Moze li mi netko pomoci sa ovim jer stvarno kako god pokusam nece da radi
Re: PIC16F887 programiranje
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.
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.
Re: PIC16F887 programiranje
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.
Cezare, star sam i nemoćan, ali poslušaj moj savjet ....