PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : pic programm am 16f84a



msp
20.03.2005, 18:40
hi leute,
ich komme einfach nicht weiter. ich habe an die parallele schnittstelle meines pc's den pic 16f84a angeschlossen. an ra0 und ra1 sind datenleitung 0und datenleitung 1 angeschlossen. ra1 soll dem pic bescheid sagen, wenn daten an ra0 anliegen bzw er ra1 auslesen soll. mein programm dafuer sieht folgendermassen aus:

void main(void){

bit TAKT @ PORTA.1;
bit DATEN @ PORTA.0;

int bit0=0,bit1=0,bit2=0;

while(1==1){

// empfang bit0
while(!TAKT);
if(DATEN) bit0=1;
else bit0=0;
while(TAKT);

// empfang bit1
while(!TAKT);
if(DATEN) bit1=1;
else bit1=0;
while(TAKT);

// empfang bit2
while(!TAKT);
if(DATEN) bit2=1;
else bit2=0;
while(TAKT);

}
}


ich habe noch ein programm geschrieben mit dem ich daten auf die parallele schnittstelle selber geben kann. also zb
1 bedeutet das d0 aktiv ist,
2 bedeutet das d1 aktiv ist,
3 bedeutet d0 und d1 sind aktiv

aber es passiert nicht das was ich will. wenn ich immer nur eine 2 sende wird trotzdem bit0 bis bit2 geaendert. wieso ist das so? hat jemand ne idee???

danke.
msp

stegr
21.03.2005, 22:49
Die einzelnen Pins der parallelen Schnittstelle werden mittels Pullups hochgezogen, daher musst du die explizit setzen.

Was ich noch nicht ganz verstanden habe:
Du gibst die Zahlen 1-3 auf dem Parallelport aus, oder?
Macht er auch wirklich das, was du ihm sagst?

Und sind die Pins auch als digitale Eingänge definiert?

MfG
Stefan

msp
22.03.2005, 00:05
hi,
also die parallele schnittstelle gibt die werte exakt aus, das habe ich gecheckt mit einem anderen interface wo led's den stand anzeigen. gemessen hab ich auch zusaetzlich noch. also daran sollte es nicht liegen. ich habe noch ein programm geschrieben, welches die werte von PORT nach PORTB direkt rueberschreibt.

auszug:

while(1==1){
PORTB=PORTA;
}

auszug ende.

damit funktioniert alles wunderbar. wenn an ra0 eine 1 anliegt liegt auch an rb0 eine 1 an, wenn an ra1 eine 1 anliegt liegt auch an rb1 eine 1 an und wenn an ra0 und ra1 eine 1 anliegt liegt auch an rb0 und rb1 eine 1 an.

vielleicht ist auch ein bitvergleich falsch, vielleicht sollte man ein ganzes register vergleichen, d.h nicht nur (PORTA.1==1) sondern (PORTA==0b.0000.0010). vielleicht ist das besser.

PORTA ist wie ich gelesen habe im datasheet immer am anfang schon als input definiert, also braucht man es nicht setzen. sonst muesste man doch TRISA=0b.0000.0011 setzen oder?

danke.
msp

stegr
23.03.2005, 23:45
Mit welchem C-Compiler schaffst du denn?
Wie du dort einzelne Pins ausliest, musst du im Handbuch schaun, aber eigentlich sollte das gehen...

24.03.2005, 09:15
hi,
ich benutze cc5. werde heute abend mal 2 codestuecke reinstellen. irgendwie scheint er mit while schleifen probleme zu haben.

danke.
msp

msp
25.03.2005, 16:21
hi leute,
mal ein neuer versuch von mir:
wenn dieses programm auf meinem pic ausgefuehrt wird soll eigentlich an portb.0 eine angeschlossene led leuchten wenn an porta.0 5v anliegen. ich uebergebe ueber die parallele schnittstelle den wert 0v oder 5v mit einem programm welches alle 100 ms den zustand von 0v nach 5v oder von 5v nach 0v aendert. bei einigen umschaltungen wird aber die led nicht geaendert und ich weiss nicht wieso es so ist, d.h. der zustand der led aendert sich nicht immer wie er sollte. manchmal macht er genau das was er soll.
hier mal mein code:


#include "../16f84.h"
#pragma config |= 0b.1111.1111.0010

void main(void)
{
TRISB=0b.0000.0000;
PORTB=0b.0000.0000;
TRISA=0b.0000.0011;
PORTA=0;

int i;


while (1==1)
{
if(PORTA.0) PORTB.0=1;
else PORTB.0=0;

schleife:
if(PORTA.0) goto schleife;

PORTB.0=0;
}
}

gruss
msp

stegr
26.03.2005, 20:10
Mögliches Problem:
Du hast eine Race-Condition geschaffen, nämlich wenn ein Wechsel erfolgt.
Bsp: Programm arbeitet grade die while-Schleife ab. Dann kommt die erste if-Abfrage->PortA.0 ist false, daher wird PortB.0 nicht gesetzt.
Jetzt kommt asynchron dein PC und setzt PortA.0 auf High (->true).
Dein Programm arbeitet weiter und kommt an die if-Schleife "schleife". Dort bleibt es drinnen hängen, weil ja nun PortA.0 true ist. -> Dein Programm tut nicht, was es soll...

Das bringt mich aber auf das eigentliche Problem: was soll bei dir der untere Programmteil?
Dein Programm setzt im oberen Teil immer PortB.0 entsprechend PortA.0, soweit ok. Dann aber kommt deine "schleife". Nur was bringt die dir?
Hättest du die Schleife nicht, würde das Programm wieder mit der ersten If-Abfrage weitermachen und würde zum gleichen Ergebnis führen, allerdings ohne das Problem...

MfG
Stefan

PS: kleiner Tipp am Rande - es gibt einen Simulator in MPLAB drinnen. Der ist richtig gut und damit kannst du dein Programm sehr genau unter die Lupe nehmen und mit Testdaten füttern... Schau dir den mal an...

msp
28.03.2005, 23:24
hi,

die 2. if bedingung ist eigentlich eine weiterfuehrende idee. eigentlich wollte ich an porta.1 daten anlegen, seriell. wenn dort ein bit abgeholt werden soll wird porta.0 auf 1 gesetzt, d.h. porta.1 auslesen und in eine variable schrieben (1 od. 0). es sollten 12 bit so uebertragen werden. die 2. if schleife soll eigentlich nur als warteschlange gelten. hier hast du natuerlich recht, hier ist es falsch. aber deine idee hatte ich auch schon, ohne diese if-schleife geht es aber trotzdem nicht vernuenftig. und einen simulator habe ich auch schon, dort laeuft das programm so wie ich es will, nur nicht im pic. wenn ich noch ideen haette haette ich die noch ausprobiert und nicht hier hilfe geholt.
aber trotzdem danke.

gruss
msp