Forum: Mikrocontroller und Digitale Elektronik Erste Gehversuche mit PIC18F


von Chris H. (xkris)


Lesenswert?

Hallo,

ich habe mir eine Platine gebastelt mit einem PIC18F458 drauf. Jetzt 
wollte ich einfach nur ein paar IO-pins auf H setzen, als Test 
sozusagen. Hier mein Programm:
1
#include <p18cxxx.h>
2
3
#pragma config OSC = ECIO  
4
#pragma config WDT = ON
5
6
void main (void)
7
{
8
      TRISA = 0;   /*set port A as output */
9
      PORTA = 1;
10
      //LATA = 1;
11
      while (1);
12
}

Wird sauber compiliert (MPLAB IDE 8.10) und geschrieben (PICkit2).
Aber ich messe an den Pins von Port A trotzdem keine H-Signal.
Ob ich den Port über den PORTA oder LATA Befehl setze sollte doch keine 
Rolle spielen, oder?

Muss man das Programm irgendwie manuell starten, durch Reset oder so, 
oder reicht es, die Power aus und wieder einzuschalten.

Ist die While-Schleife notwendig? Was machen die Ports, wenn das 
Porgramm abgelaufen ist?

Gruß
Kristian

von Der M. (steinadler)


Lesenswert?

Hallo Kristian,

schau mal im DB, ob der PORT A zufällig auch für die Analogeingänge 
verwendet wird.
Wenn ja, sind diese standardmäßig aktiviert. Du musst also erst die 
ADC-Kanäle deaktivieren.

Die PORT-Anweisung nutzt man nur für Lese-Vorgänge.
Zum Schreiben korrekterweise das LATch.

Ansonsten setzt du mit
LATA = 1;

ja nur das Bit0 auf high.
Für den ganzen Port müsstest du schreiben
LATA = 0xFF;

von Frank H. (gepard)


Lesenswert?

Auf PortA liegen auch die AD-Eingänge. Die müssen vorher deaktiviert 
werden.

Den WatchDogTimer kannst du deaktivieren.

Ohne die Whileschleife müsste das Programm wieder zur Adresse 0x00 
springen. Das Programm wird also nochmal komplett von Vorne ausgeführt.

zum Schreiben besser das LAT Register verwenden.

Wie sieht deine Resetbeschaltung aus (MCLR-Pin)?
Wie erhält der PIC seinen Takt?

von Michael H. (morph1)


Lesenswert?

die mehrzahl irritiert mich.

PORTA oder besser LATA = 1; würde nur PORTA.0 auf high setzen.

ganz allgemein, gehört der WDT in deinem fall mal sicher auf off.

von Chris H. (xkris)


Lesenswert?

Hallo und zunächst mal vielen Dank für eure Antworten.

Ich habe den Code jetzt ein wenig geändert:
1
#include <p18cxxx.h>
2
3
//#pragma config is used to set config bits for initial programming
4
#pragma config OSC = ECIO   //external Clock, OSC2 als digital IO   
5
#pragma config PWRT = ON    //Powerup-timer enabled
6
#pragma config BOR = OFF
7
#pragma config WDT = OFF    //Watchdog Timer off
8
#pragma config LVP = OFF    //Low Voltage ICSP 
9
10
void main (void)
11
{
12
  
13
  //ADCON1 = 0x07;
14
  PCFG3:PCFG1 = 011;   // alle A/D inputs als digital IO konfigurieren
15
  
16
  TRISA = 0x00;   //set port A as output
17
  LATA = 0x0F;    //setzt RA0...RA3 auf H
18
  while (1);
19
    
20
    
21
}


Ich konfiguriere sämtliche A/D Eingänge als IO-Pins. Definiere 
anschliessend den gesamten Port A als output und setzte dann die Pins 
RA0...RA3 auf H. Trotzdem messe ich dort 0V. Hat vielleicht noch jemand 
ne Idee?

Achso, als Clock benutze ich einen externen 40Mhz Oszillator. Den MCLR 
hab ich fest auf VDD gelegt. Ich gehe davon aus, dass das Programm 
startet, sobald ich Power aus- und wieder einschalte.

Wenn der PIC hardware technisch nicht korrekt eingebunden wäre würde ich 
erwarten, das er sich gar nicht erst programmieren ließe, oder?

von Meister E. (edson)


Lesenswert?

Hallo xkris,

>Achso, als Clock benutze ich einen externen 40Mhz Oszillator.

wenn du den PIC nicht außerhalb der Spezifikationen betreiben willst, 
solltest du extern nicht mehr als 25MHz anlegen (steht im Datenblatt). 
Um auf 40MHz Fosc zu kommen, ist ein externer 10MHz Quarz mit der x4 PLL 
des PIC zu verwenden.

Gruß,
Edson

von Chris H. (xkris)


Lesenswert?

Nein, der Controller kann laut Datenblatt bei externer Clock (EC,ECIO) 
mit bis zu 40MHz betrieben werden. Das was du erwähnst ist nur eine 
zusätzliche Option um die externe Clock möglichst niedrig zu halten und 
intern trotzdem eine möglichst hohe Taktfrequenz zu erhalten, speziell 
in EMV kritischen Anwendungen

von Meister E. (edson)


Lesenswert?

>>wenn du den PIC nicht außerhalb der Spezifikationen betreiben willst,
>>solltest du extern nicht mehr als 25MHz anlegen (steht im Datenblatt)

>Nein, der Controller kann laut Datenblatt bei externer Clock (EC,ECIO)
>mit bis zu 40MHz betrieben werden.

Hast recht, was ich meinte bezieht sich auf Verwendung eines Quarzes.

Gruß.
Edson

von Ich (Gast)


Lesenswert?

>void main (void)
>{
>      TRISA = 0;   /*set port A as output */
>      PORTA = 1;
>      //LATA = 1;
>      while (1);
>}

>Ist die While-Schleife notwendig? Was machen die Ports, wenn das
>Porgramm abgelaufen ist?


Ohne While-Schleife seht da nur:

  TRISA = 0;   /*set port A as output */
  PORTA = 1;

Der Controller würde einfach den Inhalt der nächsten Speicherstelle 
(nach PORTA=1) lesen und als Befehl interpretieren. Da du nicht weisst, 
was da steht, kann auch nicht gesagt werden, wass passiert.

Das While(1) sorgt dafür, dass der Controller in einen definierten 
Zustand geht (Endlosschleife).

von Sven P. (Gast)


Lesenswert?

Ein guter C-Compiler sollte aber schon in der Lage sein, hinter das 
Programm einen Aufhänger à la "for (;;);" anzufügen... macht der GCC 
doch auch.

von Ich (Gast)


Lesenswert?

>Ein guter C-Compiler sollte aber schon in der Lage sein, hinter das
>Programm einen Aufhänger à la "for (;;);" anzufügen... macht der GCC
>doch auch.

Ein guter C-Compiler übersetzt kompiliert genau das, was der 
Programmierer programmiert hat - vielleicht mit ein paar Optimierungen. 
Hinzufügen von Code gehört für mich nicht dazu. Vielleicht will ich gar 
keine Endlosschleife am Ende...

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.