Einfaches PIC18 Programm läuft nicht

Gast #816711
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?
Gast #816826
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...
Gast #816828
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...
Gast #816837
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
  }
}
Gast #816887
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?
Gast #816943
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
Gast #816972
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
Gast #817001
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...

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