Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 4 odgovora
  • 2.736 pregleda

Najnovija ↓

PIC16F877A Problem oko pristupa pojedinim pinovima 04.03.2008. u 01:49 · pre 227 meseci #1
Pozdrav,


Imam sljedeci problem, kao prvo dobio sam seminarski koji se sastoji u programiranju PIC-ova, a to nikad nisam radio, medjutim mene se nista ne pita :(

Dakle ev ja cu staviti cio code, inace ovaj code treba da upravlja liftom, nemojte se smijati greskama, ipak mi je prvi put da u ovome radim, jos samo da kazem da mi prilikom pokusaja da Build-am javlja sljedecu gresku:

Line/Column Message No Message Text
10:0 11 ';' expected but .2 found
10:0 12 Internal error
10:0 12 Internal error
10:0 12 Internal error
10:0 12 Internal error

Samo jos da kazem nakon sto stavim ; mjesto .2 (dakle ;2) dobijem sljedecu poruku u koloni Message Text: Assigning to non-lvalue [] (isto dobijem kada mjesto . stavim ,)
Ja mislim da je greska u tome sto ja ne znam kako da pristupim pojedinacnim pinovima (moze biti da nisam pravilno iskoristio ni switch), googlao sam ali stvarno nisam nista nasao u cem bih se snasao, ako ima neko ko moze pomoci molim ga. Ev jos samo da pokazem code (p.s. vjerovatno ce biti jos greskica, ali trenutno mi je ovo primarnoa, medjutim ako neko neku ugleda neka kaze)


//Deklaracija

int ts,vps;

//Funkcija za realizaciju paljenjea doda
void dioda(int sprat){
switch (sprat){

case 0:{
PORTD;2=0;
PORTD.3=1;
PORTC.4=0;
PORTC.5=0;
PORTD.4=0;
PORTD.5=0;}; break;
case 1:{
PORTD.2=0;
PORTD.3=0;
PORTC.4=1;
PORTC.5=0;
PORTD.4=0;
PORTD.5=0;}; break;
case 2:{
PORTD.2=0;
PORTD.3=0;
PORTC.4=0;
PORTC.5=1;
PORTD.4=0;
PORTD.5=0;}; break;
case 3:{
PORTD.2=0;
PORTD.3=0;
PORTC.4=0;
PORTC.5=0;
PORTD.4=1;
PORTD.5=0;}; break;
case 4:{
PORTD.2=0;
PORTD.3=0;
PORTC.4=0;
PORTC.5=0;
PORTD.4=0;
PORTD.5=1;}; break;
}
}
//******************************************************************************

//Funkcija za realizaciju prikazivanja sprata na 7seg display-u
void sedmoseg(int sprat){
switch (sprat){
case 0:{
PORTC.0=1;
PORTC.1=1;
PORTC.2=1;
PORTC.3=1;
PORTD.0=1;
PORTD.1=0;}; break;
case 1:{
PORTC.0=0;
PORTC.1=1;
PORTC.2=0;
PORTC.3=0;
PORTD.0=0;
PORTD.1=0;}; break;
case 2:{
PORTC.0=1;
PORTC.1=0;
PORTC.2=1;
PORTC.3=1;
PORTD.0=0;
PORTD.1=1;}; break;
case 3:{
PORTC.0=1;
PORTC.1=1;
PORTC.2=1;
PORTC.3=0;
PORTD.0=0;
PORTD.1=1;}; break;
case 4:{
PORTC.0=0;
PORTC.1=1;
PORTC.2=0;
PORTC.3=0;
PORTD.0=1;
PORTD.1=1;}; break;
}
}
//******************************************************************************

//Sekvence za step motor

void step(int br){
switch (br){
case 0:{
PORTD.7=1;
PORTD.6=0;
PORTB.0=0;
PORTB.1=0;}; break;
case 1:{
PORTD.7=0;
PORTD.6=1;
PORTB.0=0;
PORTB.1=0;}; break;
case 2:{
PORTD.7=0;
PORTD.6=0;
PORTB.0=1;
PORTB.1=0;}; break;
case 3:{
PORTD.7=0;
PORTD.6=0;
PORTB.0=0;
PORTB.1=1;}; break;
}
}
//******************************************************************************

//Glavni program
void main(){

TRISA = 0xFF;
TRISB = 0x3F;
TRISC = 0;
TRISD = 0;
TRISE = 0;

while (PORTB.2!=0){
PORTE.1=1;
PORTE.2=0;
}
PORTE.1=0;
PORTE.2=0;
ts=0;
dioda(0);
sedmoseg(0);
while (1){
//******************************************************************************
if (PORTA.0==1){ //Poziv na prizemlje
vps=0;
while (PORTB.3!=0){
PORTE.1=1;
PORTE.2=0;
}
}
//******************************************************************************
if (PORTA.1==1){ //Poziv na prvi sprat
vps=1;
while (PORTB.4!=0){
if (vps<ts){
PORTE.1=0;
PORTE.2=1;
}
else{
PORTE.1=1;
PORTE.2=0;
}
}
PORTE.1=0;
PORTE.2=0;
ts=vps;
dioda(ts);
sedmoseg(ts);
}
//******************************************************************************
if (PORTA.2==1){ //Poziv na drugi sprat
vps=2;
while (PORTB.5!=0){
if (vps<ts){
PORTE.1=0;
PORTE.2=1;
}
else{
PORTE.1=1;
PORTE.2=0;
}
}
PORTE.1=0;
PORTE.2=0;
ts=vps;
dioda(ts);
sedmoseg(ts);
}
//******************************************************************************
if (PORTA.1==1){ //Poziv na treci sprat
vps=3;
while (PORTB.6!=0){
if (vps<ts){
PORTE.1=0;
PORTE.2=1;
}
else{
PORTE.1=1;
PORTE.2=0;
}
}
PORTE.1=0;
PORTE.2=0;
ts=vps;
dioda(ts);
sedmoseg(ts);
}
//******************************************************************************
if (PORTA.1==1){ //Poziv na cetvrti sprat
vps=4;
while (PORTB.7!=0){
PORTE.1=0;
PORTE.2=1;
}
PORTE.1=0;
PORTE.2=0;
ts=vps;
dioda(ts);
sedmoseg(ts);
}
//******************************************************************************
if (PORTB.2=1){ //Alarm
PORTE.1=0; // Motor stani
PORTE.2=0; // Motor stani
PORTD.2=1; // Gori crvena dioda
PORTD.3=0; // Gori crvena dioda
PORTC.4=0; // Gori crvena dioda
PORTC.5=0; // Gori crvena dioda
PORTD.4=0; // Gori crvena dioda
PORTD.5=0; // Gori crvena dioda
PORTC.0=1; // Prikazi A na sedmoseg display-u
PORTC.1=1; // Prikazi A na sedmoseg display-u
PORTC.2=0; // Prikazi A na sedmoseg display-u
PORTC.3=1; // Prikazi A na sedmoseg display-u
PORTD.0=1; // Prikazi A na sedmoseg display-u
PORTD.1=1; // Prikazi A na sedmoseg display-u
}
//******************************************************************************
for (i=0,j=0;i<50;i++){ //Otvaranje vrata lifta
if (j<=3){
step(j);
j++;
}
else
j=0;
}
//******************************************************************************
for (i=0,j=3;i<50;i++){ //Zatvaranje vrata lifta
if (j>=0){
step(j);
j--;
}
else
j=3;
}
//******************************************************************************

}
}
Potpis
sve se vrti u krug
Re: PIC16F877A Problem oko pristupa pojedinim pinovima 04.03.2008. u 09:13 · pre 227 meseci
izmenjeno 1 put, poslednji put sander 04.03.2008. u 09:47
  1. sander04.03.2008. u 09:47zapis iz teksta poruke
#3
U zavisnosti od c kompajlera nazivi portova, registra, bitova u registrima su negde definisani kroz header fajlove (extenzija .h) a negde nisu pa ih je potrebno definisati.
Recimo pristupanje pinovima kontrolera u CCS C kompajleru se moze postici na dva nacina. Prvi je kroz ugradjene funkcije:

input(), output_low(), output_high(), output_bit(), output_x(), output_float()

ili kroz definisanje varijable koja zauzima memoriski prostor PORT ili TRIS registra:

#BYTE PORTA=0x05 (definisemo varijablu PORTA koja se mapira na lokaciju u RAM-u u registar PORTA (adresa 0x05))
#BYTE TRISA=0x85 (definisemo varijablu TRISA koja se mapira na lokaciju u RAM-u u registar TRISA (adresa 0x85))

ili za pristrup pojedinacnom pinu:

#bit T0IF = 0x0b.2 (pristupamo adresi u RAM 0x0b (INTCON) bitu 2 (T0IF))

i onda mozes da ih koristis u programu:

PORTA=123;
T0IF=0;

u tvom slucaju bi bilo:

ili

output_low(pin_e1); // za gasenje motora
output_high(pin_e1); // za paljenje motora

ili definises:

#bit MOTOR = 0x09.1 // porte bit 1

pa bi onda mogao da koristis

motor=0; // za gasenje motora
Re: PIC16F877A Problem oko pristupa pojedinim pinovima 04.03.2008. u 13:02 · pre 227 meseci #4
E raja puno hvala na pomoci, ja mislim da sam skontao i uspio rjesiti problem na sljedeci nacin, dakle kad hocu pristupiti pinu 2 porta B uradim sljedece

PORTB.F2=0; //nprj.

Jos jednom puno hvala sto ste u tako kratkom vremenskom preiodu reagirali.
Potpis
sve se vrti u krug
Re: PIC16F877A Problem oko pristupa pojedinim pinovima 05.03.2008. u 01:48 · pre 227 meseci #5
Ima jos jedan zgodan nacin za pristup portovima a to je preko strukture koja se mapira preko dela ram-a gde su PORT registri:

struct lcd_pin_map { // This structure is overlayed
int unused : 4; // B0-B3 unused
int data : 4; // B4-B7 LCD.DATA
BOOLEAN rs; // C0 - RS
BOOLEAN enable; // C1 - EN.
BOOLEAN unused1; // C2 unused
BOOLEAN unused2; // C3 unused
int unused3: 4; // C4-C7 unused
} lcd;

#locate lcd = 6

definise se struktura koja se potom locira na adresi 6 u ram-u i zauzima 2 bajta (PORTB i PORTC registre). Dati primer je za kontrolu
LCD2x16 displeja. I pristupom strukturi ustvari pristupamo pinovima pomenutih portova:

lcd.data=0xf;
lcd.rs=0;
lcd.enable=1;
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme