Forum: Mikrocontroller und Digitale Elektronik Beispiel - Portansteuerung PIC16f877A


von Martin H. (maddin4711)


Lesenswert?

Hallo.

Ich sitze hier und versuche krampfhaft nem PIC16f877A leben 
einzuhauchen. Leider ist jeder meiner Lösungsansätze zum scheitern 
verurteilt und ich bald fertig mit den Nerven...

Ich benutze MPLAB und den Compiler CC5X. Das ganze soll über ICSP mit 
dem Brenner 5 von Sprut gebrannt werden.

Der Pic macht aber irgendwie gar nichts. Das Programm besteht nur aus 
ner Portansteuerung, die impulsweise angeschaltet wird. Ich kann aber an 
den Ausgängen nichts messen - auch wenn die Ausgänge dauerhaft 
angeschaltet werden. Das ganze habe ich schon mit so ziemlich allen 
ausgängen ausprobiert.

Weiß jetzt nicht ob's an der Programmierung oder an der ICSP-Übertragung 
liegt.

Hier mein UP zur Portansteuerung:

void LED0() {        // UP LED0
  PORTD=0b.0000.1000;    // RD3 high
  TRISD=0b.0000.0000;
  }

Kann mir jemand helfen?? viele Grüße, Martin

von Martin H. (maddin4711)


Lesenswert?

Anmerkung:

TRISD ist eigentlich auch high. Hab nur zwischendurch was ausprobiert - 
deshalb ist er hier auf low...

von tastendrücker (Gast)


Lesenswert?

> TRISD ist eigentlich auch high.

Na, wenn du PORTD als Ausgang konfigurieren willst, damm muss in TRISD 
'0' stehen. ('0' = Ausgang, '1' = Eingang). Vielleicht solltest du mal 
etwas mehr Code posten und evtl. deinen Hardwareaufbau beschreiben.

von franz (Gast)


Lesenswert?

Ich würde erst die Richtung bestimmen und dann die Werte ausgeben:

void LED0() {            // UP LED0
  TRISD=0b.0000.0000;    // all outputs
  PORTD=0b.1111.1111;    // all high
  }

franz

von tastendrücker (Gast)


Lesenswert?

> Ich würde erst die Richtung bestimmen und dann die Werte ausgeben:

ist an sich egal, ich würde es allerdings eher so machen:

:
TRISD=0b.0000.0000;    // all outputs
:
:
void LED0() {            // UP LED0
  PORTD=0b.1111.1111;    // all high
  }

von reinraus (Gast)


Lesenswert?

so sollte es eigentlich gehen geht aber nicht

von Martin H. (maddin4711)


Lesenswert?

Hier mal der gesamte Code:

#pragma config=0b.00.0000.0000.0100

// =============================================
// ---- UNTERPROGRAMME -------------------------
// =============================================


void LEDOff() {        // alle LEDS aus
  PORTD=0b.0000.0000;
  TRISD=0b.0011.1111;
  }

void LED0() {        // UP LED0
  PORTD=0b.0011.1111;    // RD3 high
  TRISD=0b.0000.0000;
  }

void warten(unsigned long z){            // Unterprogramm warten // mit 
Parameterübergabe
  long i;              // 16 Bit Indexvariable
  for(i=0; i<z; i++) nop();  // Warteschleife
  }


void langewarten() {
    warten(65000);
    warten(65000);
    warten(65000);
    }

void ganzlangewarten(){
    langewarten();
    langewarten();
    langewarten();
    langewarten();
    langewarten();
    langewarten();
    langewarten();
}

// =============================================
// ---- HAUPTPROGRAMM --------------------------
// =============================================

void main() {

  while(1){

    LED0();        // Aufruf des Unterprogramms LED0

    langewarten();
    LEDOff();
    langewarten();

    LED0();
    langewarten();
    LEDOff();
    langewarten();

  }// end while

}  // end main

Entschuldigt bitte meine unprofessionellen Warteschleifen - hab nur 
versucht das Programm so einfach wie möglich zu halten...

Ich vermute, es könnte eventuell daran liegen, dass die Ports nicht als 
digitale deklariert sind. Beim 16F684 ging das mit ansel...
- Kann mir jemand sagen wie das beim 16F877 gemacht wird?

was die Hardware angeht:

Der Pic bekommt drei digitale Eingangssignale (von ner SPS) an RD0, RD1 
und RD2.
RD3, RD4 und RD5 sind digitalte Ausgänge und gehen Ebenfalls auf die 
SPS. Das ganze läuft über Optokoppler und ist mit Pull-Down's 
festgelegt.

Des weiteren soll ein LCD-Display angesteuert werden (RA, RB und RE).

Das mit dem Display ist erstmal sekundär - will lediglich erstmal die 
Optokoppler beschalten...

danke schon mal!!!!!!!!!!!!

von tastendrücker (Gast)


Lesenswert?

Martin hahn wrote:

> was die Hardware angeht:

> Der Pic bekommt drei digitale Eingangssignale (von ner SPS) an RD0, RD1
> und RD2.
> RD3, RD4 und RD5 sind digitalte Ausgänge und gehen Ebenfalls auf die
> SPS.

Und was soll dann das Hin- und Hergeschalte der Portrichtung? TRISD 
sollte nur einmal (beim Initialisieren/Programmstart) gesetzt werden:

  TRISD=0b.0000.0111   ; RD0..RD2=Eingang, RD3..RD7=Ausgang

Wie sind den deine LED ngeschlossen (HI oder LOW-Aktiv???)

von holger (Gast)


Lesenswert?

Setz mal dein Configuration Word richtig.
Oder wolltest du LP Oscillator und Watchdog aktiv ?

von Martin H. (maddin4711)


Lesenswert?

die LED's sind High-Aktiv.

Die Portrichtungen sollen eigentlich nicht umgeschaltet werden. Die sind 
nur alle angeschaltet, damit ich die Ports durchmessen kann. Aber leider 
hab ich an den Ausgängen gar kein Signal...

von Martin H. (maddin4711)


Lesenswert?

Hallo Holger.

Wie muss ich das Configuration Word deiner Meinung nach setzen?
Wo bekomme ich heraus wie welche Funktionen mit eingebunden werden??

viele Grüße, Martin

von Schoasch (Gast)


Lesenswert?

Hi

>>Wie muss ich das Configuration Word deiner Meinung nach setzen?
Das hängt von deiner Hardware ab. Um dir da helfen zu können, müssten 
wir die Hardware näher kennen. Aber schalte mal den Watchdog aus.. und 
setz die Quarzeinstellung auf HS.

mfg Schoasch

von holger (Gast)


Lesenswert?

>Wo bekomme ich heraus wie welche Funktionen mit eingebunden werden??

Datenblatt zum PIC im Kapitel: "SPECIAL FEATURES OF THE CPU"
Ziemlich weit hinten.

Welche Einstellungen du brauchst weisst im Moment nur DU.
Ich denke auch das du HS oder XT als Oscillator nehmen musst.
Watchdog abschalten.

von Martin H. (maddin4711)


Lesenswert?

moin!

das configuration word sieht bei mir jetz folgendermaßen aus:
#pragma config=0b.00.0000.0000.1011

kann mir jemand sagen wie ich die ports als digitale deklarieren kann??

von Martin H. (maddin4711)


Lesenswert?

hab den Oszillator doch noch mal umgestellt...

#pragma config=0b.00.0000.0000.1001

also jetzt auf xt

geht aber trotzdem nix.

von holger (Gast)


Lesenswert?

>kann mir jemand sagen wie ich die ports als digitale deklarieren kann??

PORTD ist immer digital. Für PORTA und PORTE geht das so:

 ADCON1=0x06;       //Alle Analogeingänge auf digital


Vieleicht hast du ja ein Problem mit dem Parallel Slave Port Modus
auf PORTD. Schau dir mal an was in TRISE (ja , TRISE !) steht.

von tastendrücker (Gast)


Lesenswert?

Martin Hahn wrote:

> kann mir jemand sagen wie ich die ports als digitale deklarieren kann??

Nicht jemand, sondern das PIC Datenblatt und/oder Compilerhandbuch!

Ich glaube, du solltest mehr darin lesen. In der Regel wird man als faul 
angesehen, wenn man fragen stellt, deren Antwort eigentlich im 
Datenblatt oder in Handbüchern zu finden ist.  Silltest du 
Verständnisschwierigkeiten mit dortigen Formulierungen haben, kannst Du 
natürlich um Hilfe bitten.

Evtl. helfen dir Internetseiten weiter, auf denen PIC Beispielprogramme 
in 'C' zu finden sind, wie z.B. www.michrochipc.com (->verwendet aber 
nicht CC5X sondern HI-TECH compiler, glaube ich).

von Martin H. (maddin4711)


Lesenswert?

hallo.

ja, das datenblatt hab ich auch schon durchgesucht - allerdings habe ich 
etwas schwierigkeiten das ganze in c umzusetzen.
Compilerhandbuch habe ich nicht - werde ich aber anschaffen.
Danke für die Info.

@holger:
Ist es schlimm wenn man die sache mit dem PSP-Mode außen vor lässt?
Was das TRISE register angeht ist doch normalerweise alles LOW - oder 
nicht?

weiß auch um ehrlich zu sein nicht richtig wie ich das umsetzen soll. 
hab hier das datenblatt vor mir liegen.

könnte ich das vielleicht so zurücksetzen?

TRISE=0b.0000.0000;

danke für eure hilfe!

von holger (Gast)


Lesenswert?

>Was das TRISE register angeht ist doch normalerweise alles LOW - oder
>nicht?

Nicht alles, aber die wichtigen Bits. Auch Datenblätter können
manchmal lügen.

>könnte ich das vielleicht so zurücksetzen?
>TRISE=0b.0000.0000;

Ja (,obwohl ich diese komische binärschreibweise nicht kenne).

Ich denke aber da stimmt was mit dem Oscillator nicht.
Der schwingt einfach nicht. Schaltung falsch oder Config Word
nicht richtig gebrannt. Vieleicht übernimmt Spruts Brenner
das Config Word nicht aus der HEX-Datei und du musst es dort
richtig einstellen, aber keine Ahnung ich hab sein Proggi
noch nie benutzt. Oder du musst das Config Word in MPlab
auch nochmal richtig einstellen. Ich meine damit hatte
ich früher mal Ärger (bis ich Mplab völlig gelöscht habe :)

Zu Schaltung oder Oscillatorwert lässt du uns ja auch
völlig im dunkeln.

von Schoasch (Gast)


Lesenswert?

Hi

Setzt mal im Programm von Sprut die ganzen Fuses so wie du sie haben 
willst und nimm nicht die aus deinem Hex-File.
dazu musst du nur das Häcken bei" Use config-Word from Hex-file" oder 
wie das schnel heisst, abhacken.

mfg SChoasch

von Martin H. (maddin4711)


Lesenswert?

hallo.

erstmal vielen dank für eure hilfe!

@holger:

sorry. also was schaltung und oszillator angeht - folgendes:

habe ein externen 4MHz Oszillator an OSC1 und OSC2 bzw. über zwei 22pF 
kondensatoren an masse (also wie es im datenblatt und bei sprut steht)

hab das ganze auch eben nochmal mit dem Oszi kontrolliert - habe ne 
saubere 4MHz sinusschwingung.


@schoasch & holger:

habe mal mein configuration word komplett aus dem programm entfernt und 
die ganzen einstellungen was oszillator, watchdog und power-up-timer 
angeht über die brennereinstellung vorgenommen - geht auch net.
das ganze auch mit verschiedenen oszillatoreinstellungen (mit hs, xp).

hab mir auch mal eine hex-file aus nem basic-programm für den 16f877 
geben lassen und gebrannt - ging auch net (also für die gleichen 
funktionen - ausgänge auf high schalten..)

weiß nicht mehr weiter.

von holger (Gast)


Lesenswert?

Wie denn dein Resetpin beschaltet ?

von Martin H. (maddin4711)


Lesenswert?

Der Reset ist überhaupt nicht beschaltet. der hängt nur an der 
icsp-schnittstelle.

gruß, martin

von holger (Gast)


Lesenswert?

Und wie ist der Pegel am Resetpin ? Ich glaub da
fehlt ein Pullup !

von Martin H. (maddin4711)


Lesenswert?

uuuuups!

klar. setz mich gleich mal dran...

vielen dank erstmal!!!

von Martin H. (maddin4711)


Lesenswert?

Hallo.

So. Hab das jetzt zum laufen bekommen. Es lag wie holger bereits 
vermutet hat am Reset-Pin (MCLR). Der MCLR hing war nur an der ICSP 
angeschlossen und hing somit in der luft. Hab nen 20k pull-up 
drangelötet - und schon läuft die kiste.

ich danke euch vielmals für eure hilfe (vor allem holger!) - hätte das 
sonst warscheinlich nicht oder erst viel später hinbekommen.

Danke!

viele grüße, martin

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.