mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Beispiel - Portansteuerung PIC16f877A


Autor: Martin Hahn (maddin4711)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin Hahn (maddin4711)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anmerkung:

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

Autor: tastendrücker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: franz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: tastendrücker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
  }

Autor: reinraus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so sollte es eigentlich gehen geht aber nicht

Autor: Martin Hahn (maddin4711)
Datum:

Bewertung
0 lesenswert
nicht 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!!!!!!!!!!!!

Autor: tastendrücker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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???)

Autor: holger (Gast)
Datum:

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

Autor: Martin Hahn (maddin4711)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Martin Hahn (maddin4711)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Schoasch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Martin Hahn (maddin4711)
Datum:

Bewertung
0 lesenswert
nicht 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??

Autor: Martin Hahn (maddin4711)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab den Oszillator doch noch mal umgestellt...

#pragma config=0b.00.0000.0000.1001

also jetzt auf xt

geht aber trotzdem nix.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: tastendrücker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Martin Hahn (maddin4711)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Schoasch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin Hahn (maddin4711)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie denn dein Resetpin beschaltet ?

Autor: Martin Hahn (maddin4711)
Datum:

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

gruß, martin

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wie ist der Pegel am Resetpin ? Ich glaub da
fehlt ein Pullup !

Autor: Martin Hahn (maddin4711)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uuuuups!

klar. setz mich gleich mal dran...

vielen dank erstmal!!!

Autor: Martin Hahn (maddin4711)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.