Forum: Mikrocontroller und Digitale Elektronik Einfaches PIC18 Programm läuft nicht


von Bernd (Gast)


Lesenswert?

Hallo Leute,

habe als erstes PIC Programm folgendes geschrieben und wunder mich wieso 
es nicht funktioniert.
1
#include <pic18.h>
2
3
__CONFIG(1, INTIO & FCMDIS & IESODIS);
4
__CONFIG(2, PWRTEN & BORDIS & WDTDIS);
5
__CONFIG(3, PBDIGITAL & LPT1DIS & MCLREN);
6
__CONFIG(4, LVPDIS & DEBUGEN);
7
8
void main (void) {
9
  long i;
10
  LATA = 0x00;  
11
    TRISA = 0xFE; 
12
13
     LATA1 = 1; 
14
     LATA1 = 0; 
15
}

Ich verwende zum debuggen den MPLAB ICD2 In-Circuit Debugger (Microchip) 
und als Compiler den HI-TECH PICC-18 C-Compiler.

__CONFIG(n, x) ist ein Makro wobei x die Nummer des 
Konfigurationsregisters angibt und n die Bits die gesetzt, bzw. 
rückgesetzt werden sollen.

Betrachte ich nun beim debuggen LATA und PORTA ändert sich dort nichts. 
obwohl ein anderer als der gewünschte Wert drin steht. Auch die 
angeschlossenen LED's bestätigen dies...

Hat jemand eine idee woran das liegen könnte? Ist im Code etwas falsch?

von Bernd (Gast)


Lesenswert?

Ach habe ich vergessen. Es handelt sich dabei um einen PIC18F2580...

MPLAB IDE ist so eingestellt das die Config Bits im Code gesetzt 
werden...

von Der S. (schubi)


Lesenswert?

Der uC macht das nur einmal.
Du musst eine While-Schleife (while(1) bla...) um
1
LATA1 = 1;
2
LATA1 = 0;
machen.

von Bernd (Gast)


Lesenswert?

Ja das ist mir klar aber beim Schrittweisen debuggen müsste ich ja 
trotzdem sehen das sich LATA ändert was es aber nicht tut...

von breitfuss (Gast)


Lesenswert?

ist nicht port A standartmäßig ein analoger eingang?
eventuell comparator auschalten (CMCON..oder sowas)

mfg

von Sascha F. (sascha_focus) Benutzerseite


Lesenswert?

__CONFIG(3, PBDIGITAL & LPT1DIS & MCLREN);

Soll PBDIGITAL den Port A als digitalen Port einstellen?
Weil, PBADEN: PORTB A/D Enable bit sollte 0 sein.

Gruß Sascha

PS: Kenne den HITECH nicht

von Bernd (Gast)


Lesenswert?

Mit dem analogen bin ich mir jetzt nicht ganz sicher und finde auf die 
schnelle auch nichts eindeutiges. Habe das jetzt einfach mal kurz auf 
Port C umgeschrieben und das Problem ist immernoch das selbe...

Scheint also nicht am Port zu liegen...

von Bernd (Gast)


Lesenswert?

Es fängt ja schon damit an, dass nach dem Befehl LATA = 0x00; nicht 0 in 
LATA steht sondern der selbe von 0 unterschiedliche Wert wie vorher. Er 
scheint hier auf LATA also garnicht zu schreiben...

von Gerhard. (Gast)


Lesenswert?

Hallo Bernd,

bei mir funktioniert das Program auch nicht solange die ADCON1 PCFG bits 
nicht als digitale Pins gesetzt sind.

Wenn man ADCON1 nicht konfiguriert geht es bei mir auch nicht.

Bei mir funktioniert Dein Program nachdem ADCON1 konfigurtiert wird:

MFG
Gerhard

#include "18F4620.h"

#use delay(clock=16000000, RESTART_WDT)
#fuses HS, NOPROTECT, NOPUT, BROWNOUT, NOLVP

#byte   LATE  = 0xF8D
#byte   TRISE = 0xF96
#byte   PORTE = 0xF84
#byte   ADCON0 = 0xFC2
#byte   ADCON1 = 0xFC1

void main(void)
{
  ADCON1 = 0x0F;  // PIN E2 = All analogs are digital pins
  LATE |= 0x04;  // PIN E2 = 1
  TRISE = 0xFB;  // PIN E2 = OUTPUT

  for(;;)
  {
    LATE |= 0x04;  // Bit E2 Hochsetzen
    LATE &= 0xFB;  // Bit E2 niedersetzen
  }
}

von Bernd (Gast)


Lesenswert?

Also bei mir geht es immer noch nicht... Komischerweise funktionieren 
die in Assembler geschriebenen Programme auf anhieb. Sobald ich aber ein 
in C geschriebenes Programm auf den PIC schreibe is es mit der Funktion 
vorbei...

Scheint also nicht am Code zuliegen sondern viel mehr an der Software. 
Hat jemand eine Idee wie man da ansetzten kann?

von Gerhard. (Gast)


Lesenswert?

Hallo Bernd,

versuche mal zwischen den beiden SETZ/RUECKSETZ ein delay_ms(1) oder NOP 
einzufuegen. Oft wird gewarnt einen PIN mit der naechsten Instruktion 
gleich wieder zurrueckzusetzen. Ich kann zwar im Datenblatt allerdings 
nichts diesbezuegliches zur Bekraeftigung finden. (Vielleicht ist das 
nur bei AVRs ein Problem)

Ich vergass zu erwaehnen das ich bei mir den CCS Compiler verwende.

Poste noch einmal den exakten Source. Vielleicht wurde doch irgendwas 
uebersehen. Das muss einfach funktionieren;-)

MFG
Gerhard

von Gerhard. (Gast)


Lesenswert?

Hallo Bernd,

Vielleicht stimmt was nicht in der Weise das Bit A1 angesprochen wird.
LATEA1 - Es ist moeglich der Hund liegt begraben?

Versuche es genau wie bei mir das Bit zu setzen und zurueckzustellen:

ADCON1 = 0x0F; // Alle Analog Pins auf Digital Pin umschalten

LATEA |= 0b00000001; // Pin setzten

LATEA &= 0b11111110; // Ruecksetzen

// Fuer PIN A0

Gerhard

von Bernd (Gast)


Lesenswert?

hier mal mein aktueller Code:

[c#include <pic18.h>

__CONFIG(1, INTIO & FCMDIS & IESODIS);
__CONFIG(2, PWRTEN & BORDIS & WDTDIS);
__CONFIG(3, PBDIGITAL & LPT1DIS & MCLREN);
__CONFIG(4, LVPDIS & DEBUGEN);

void main (void) {
  long i;

  ADCON1 = 0x0F;

  LATA = 0x00;
    TRISA = 0xFE;

  while (1) {
    for(i=0;i<10;i++);
    LATA |= 0b00000001;
    for(i=0;i<10;i++);
    LATA &= 0b11111110;
  }
}[/c]

Funktioniert leider immer noch nicht. Beim debuggen bleibt er immer in 
einer x-beliebigen Zeile hängen und läuft nicht mehr weiter. Gucke mir 
alle sinnvollen Register im Watch Fenster an und bei keinem Befehl tut 
sich dort etwas (ADCON1, LATA)...

Ich habe es auch schon über die Ports B und C versucht, ist aber das 
selbe verhalten...

von Pete K. (pete77)


Lesenswert?

Sind die Optimierungen des Compilers eingeschaltet ?

von Bernd (Gast)


Lesenswert?

Die Optimierung ist ausgeschaltet...

von Bernd (Gast)


Lesenswert?

Es läuft endlich, der HI-TECH Compiler war nicht richtig eingerichtet. 
Echt nicht gerade Benutzerfreundlich das Ding.

Keine Fehlermeldung, garnichts...

Schönes Osterwochenende, Bernd

von Sascha F. (sascha_focus) Benutzerseite


Lesenswert?

Dann nutze doch den C18 Student Edition :)

Gruß Sascha

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.