Erste Gehversuche mit PIC18F

OP #990159
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
#990171
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;
#990180
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?
OP #991338
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?
#991561
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
OP #991625
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
#992101
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
Gast #992342
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).
Gast #992696
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren