- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 8 von 8

Thema: pic programm am 16f84a

  1. #1

    pic programm am 16f84a

    Anzeige

    Praxistest und DIY Projekte
    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

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.10.2004
    Ort
    Nordschwarzwald
    Alter
    41
    Beiträge
    506
    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

  3. #3
    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

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.10.2004
    Ort
    Nordschwarzwald
    Alter
    41
    Beiträge
    506
    Mit welchem C-Compiler schaffst du denn?
    Wie du dort einzelne Pins ausliest, musst du im Handbuch schaun, aber eigentlich sollte das gehen...

  5. #5
    Gast
    hi,
    ich benutze cc5. werde heute abend mal 2 codestuecke reinstellen. irgendwie scheint er mit while schleifen probleme zu haben.

    danke.
    msp

  6. #6
    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

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.10.2004
    Ort
    Nordschwarzwald
    Alter
    41
    Beiträge
    506
    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...

  8. #8
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test