Forum: Mikrocontroller und Digitale Elektronik PIC18F2580 RB2 kein Output


von David N. (dave_nidda)


Lesenswert?

Hi,

ich bin der David un bin neu hier,
Zurzeit bin ich an einem Projekt mit einem PIC18F2580 dran. Leider habe 
ich ein Problem mit einem Pin.

Zuvor habe ich den Vorgänger vom 2580, den 258 verwendet. Da Dieser aber 
nicht mehr produziert wird, ändere ich das Programm für den neuen µC um.
Es ist alles eingerichtet, die Config Bits sind gesetzt und die alte 
Funktion ist auch gegeben. Nur ein Pin macht Probleme.
RB2 sollte als Ausgang gesetzt sein, aber leider tut sich hier nichts.
Meiner Meinung nach sind ADCON*, TRISB richtig gesetzt. RB1, RB3, usw- 
schalten alle, wie sie sollen.

Hat von euch jemand schon mal von diesem Problem gehört?
Ich habe schon vieles probiert. Den Ausgang mittels LATB, PORTB zu 
setzen, aber alles ohne Erfolg.

#pragma config PBADEN = OFF

Die Pins <0:4> habe ich auf digitale I/O gesetzt.

PORTBbits.RB2 = 0; als Output, so wie auch RB1 und RB3.

Was übersehe ich noch?

Das setzen will nicht funktionieren, obwohl ich genau dasselbe mit den 
anderen Pins mache.
Ich denke nicht, dass der Ausgang kaputt ist, da ich den µC schon 2x 
ausgetauscht habe. Die Last ist ein Transistor, welcher auch an anderen 
Pins liegt.

Ich weiß langsam nicht mehr, was man noch ausprobieren könnte...

von Witkatz :. (wit)


Lesenswert?

David N. schrieb:
> PORTBbits.RB2 = 0; als Output, so wie auch RB1 und RB3.

Meintest du vielleicht
1
TRISBbits.RB2 = 0;

von Ste N. (steno)


Lesenswert?

Hast Du zufällig oder ausversehen das CAN-Modul eingeschalten?

von David N. (dave_nidda)


Lesenswert?

Tris habe ich auch auf 0. Habe falsch geschrieben, sorry.

Und ans CAN Modul habe ich auch schon gedacht, aber ich habe im 
Datenblatt nicht ganz durchgeblickt, wie ich dieses deaktivieren kann. 
Kannst du mir da bitte weiterhelfen?

von Volker S. (vloki)


Lesenswert?

David N. schrieb:
> Zuvor habe ich den Vorgänger vom 2580, den 258 verwendet

Warum jetzt nicht gleich den K80?

von picfan (Gast)


Lesenswert?

Hallo,
#pragma config PBADEN = OFF   !!!!!!!!!
ist ziemlich gemein....
Gruss picfan

von picfan (Gast)


Lesenswert?

sorry, hast du ja schon gemacht.

von Ste N. (steno)


Lesenswert?

Versuch es mal mit

CANCON = 0x20;

oder

CANCONbits.REQOP = 1;

Nachtrag:

Also das obige ganz zum Anfang und danach dann mit TRISB deine 
Richtungsregister setzen.

: Bearbeitet durch User
von Volker S. (vloki)


Lesenswert?

picfan schrieb:
> #pragma config PBADEN = OFF   !!!!!!!!!
> ist ziemlich gemein....

Betrifft auch nur Eingänge!

: Bearbeitet durch User
von David N. (dave_nidda)


Lesenswert?

Danke!
Ich probiere es morgen mal aus und melde mich dann wieder! Thx :)

von David N. (dave_nidda)


Lesenswert?

Leider kein Erfolg. Es ändert sich nichts... :/

von GHD (Gast)


Lesenswert?

David N. schrieb:
> PORTBbits.RB2 = 0; als Output, so wie auch RB1 und RB3.

Du versuchst nicht zufällig so den Ausgang zu setzen oder ?
(LATB verwenden.)

Funktioniert denn ein Minimalbeispiel (Deine Config & Initialisierung 
und dann nur den Pin toggeln)?

Kannst du deinen Code hochladen?

von David N. (dave_nidda)


Lesenswert?

Ich habe beides ausprobiert. Mittels PORTB und LATB. Es tut sich bei 
beiden Varianten komischerweise nichts.

Ein Minimalbeispiel habe ich noch nicht ausprobiert, ist aber eine Gute 
Idee.
Leider ist das Projekt etwas vertraulich (Arbeitgeber :/ )
Ich schaue mal, was sich machen lässt, damit ich einen Code hochladen 
kann. Zum Beispiel, wenn nicht mal das Min.Bsp. funktionieren will.

Config Bits vom Pic, CAN Modul ausschalten, Port Richtungen mit TRIS 
definieren, und dann mit LAT die Pins toggeln. Sollte eigentlich genug 
sein, oder?

Danke für die Hilfe!

von skorpionx (Gast)


Lesenswert?

Etwas von meinem Projekt(PCFG !!):

#define ADFM 0b10000000    //0-Ergebnis links justieren, 1-0-Ergebnis 
links justieren
    #define ADCS 0b00000010     //FOSC/32
    #define ACQT 0b00001000     //Acquisitions Time
    #define ADCON2_InitWert (ADFM + ACQT + ADCS)


    #define VCFG 0b00000000      //Vss - Vdd als Referenz
    #define PCFG 0b1101         //nur PORTA Kanal 0 und 1 als Analog 
Ein, alles andere und auch PORTB als digital
    #define ADCON1_InitWert (VCFG + PCFG)

            ADCON2 = ADCON2_InitWert;
            ADCON1 = ADCON1_InitWert;
            ADCON0 = ADCON0_InitWertAN0;

von Franky77 (Gast)


Lesenswert?

Setz doch in der Software einen Breakpoint direkt vor der Ausgabe über 
RB2 und schaue Dir dann alle Register an, die diesen Port irgendwie 
beeinflussen.

von David N. (dave_nidda)


Lesenswert?

Jetzt habe ich den Übeltäter gefunden...

Eine Verständnisfrage habe ich allerdings immer noch, da ich nicht genau 
verstehe, wie der Fehler zustande kommt.

Mein Vorgänger hat in der Initialisierung, vor dem Setzen der 
Port-Richtungen eine Methode zum Löschen vom RAM aufgerufen.

Wenn ich diese Methode zum Löschen des RAM nicht ausführe, dann 
funktioniert alles einwandfrei..
Kann mir wer sagen, was diese Zeilen genau machen? Ich blicke nicht ganz 
durch, woher diese Magic numbers kommen bzw. was das welche Auswirkung 
hat.

void RamClear(void) //Clear RAM Values
{
    // Set FSR to 0 // Zero GPR's for all banks
    FSR0 = 0x00;
    while( FSR0++ != 0x05ff )
    {
            INDF0 = 0;
    }

    FSR0 = 0x0f00;
    while( FSR0++ != 0x0f76 )
    {
            INDF0 = 0;
    }
}

von David N. (dave_nidda)


Lesenswert?

Das interessante ist, dass dies der erste Befehl beim Power Up vom Pic 
ist und erst danach wieder alle Register gesetzt werden.
Vielleicht ist es, dass beim 2580 ein kleinerer RAM als beim 258 ist und 
deshalb irgendwas überschrieben wird, was nicht mit Registern gesetzt 
werden kann.
Ich verstehe es nicht ganz :D
Aber normalerweise sollte es eigentlich keinen Unterschied machen. Der 
RAM ist eh schon leer, sobald der PIC gestartet wird, sodass ich auf 
diese Methode verzichten kann...

von Volker S. (vloki)


Lesenswert?

David N. schrieb:
> Ich verstehe es nicht ganz :D

Schau doch einfach mal ins DataSheet. (Data Memory Organisation)
Dann werden dir vielleicht auch die "Magic Numbers" nicht mehr ganz so 
magisch vorkommen.

Der 2580 braucht mehr RAM für die SFRs und hat deshalb weniger für die 
GPRs übrig. Bei der Verwendung der gleichen/falschen Routine wird also 
ein Teil der SFRs gelöscht, die ja mit sinnvollen Werten vorbelegt sein 
sollten.

ALLERDINGS sieht die Routine so aus, als wäre sie nicht für einen 18F258 
geschrieben worden, sondern z.B. für einen 18F252. Bei dem fängt der 
Bereich für die SFRs bei 0xF80 an. Davor könnte noch ein kleiner Bereich 
sein, der zum Debuggen benötigt wird. Darum vielleicht Löschen bis 
0xF76.

Warum wird eigentlich ein "TEURER" CAN PIC benutzt, wenn CAN anscheinend 
gar nicht verwendet wird? Und nochmal die Frage: "Warum beim Umstieg 
nicht gleich ein K Typ?" (wesentlich billiger, mehr Features, mehr 
Leistung)

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

David N. schrieb:
> Mein Vorgänger hat in der Initialisierung, vor dem Setzen der
> Port-Richtungen eine Methode zum Löschen vom RAM aufgerufen.

Was ist der Grund, dem Compiler ins Handwerk zu pfuschen?
Der Compiler initialisiert doch automatisch alle benutzten Variablen.

Schau mal ins Assemblerlisting. Da sollte bereits eine Routine drin 
sein, die den RAM lädt. In der Regel wird auch der unbenutzte RAM 
gelöscht.

von Volker S. (vloki)


Lesenswert?

Peter D. schrieb:
> Der Compiler initialisiert doch automatisch alle benutzten Variablen.

Nicht unbedingt. Hier könnte der C18 Compiler benutzt worden sein.
Da ist das optional. Kleiner Ausschnitt aus dem User Guide:

########################################################################
Whether the startup code initializes idata sections is determined by 
which startup code module is linked with the application. The c018i.o 
and c018i_e.o modules perform the initialization, while the c018.o and 
c018_e.o modules do not. The default linker scripts provided by MPLAB 
C18 link with either the c018i.o or c018i_e.o module depending on 
whether Non-extended mode or Extended mode is being utilized, 
respectively.

The ANSI standard requires that all objects with static storage duration 
that are not initialized explicitly are set to zero.
With both the c018.o/c018_e.o and c018i.o/c018i_e.o startup code 
modules, this requirement is not met.
A third typeof startup module, c018iz.o and c018iz_e.o, is provided to 
meet this requirement. If this startup code module is linked with the 
application, then, in addition to initializing idata sections, all 
objects with static storage duration that are not initialized explicitly 
are set to zero.
########################################################################

von Franky77 (Gast)


Lesenswert?

Schau doch einfach mal ins lst-File, ob Du eine entsprechende Struktur 
zur Initialisierung findet. Beispiel:

    68                       ; Clear objects allocated to BANK0 (128 
bytes)
    69  000702  EE00  F060       lfsr  0,__pbssBANK0
    70  000706  0E80             movlw  128
    71  000708                 clear_0:
    72  000708  6AEE             clrf  postinc0,c
    73  00070A  06E8             decf  wreg,f,c
    74  00070C  E1FD             bnz  clear_0
    75
    76                       ; Clear objects allocated to COMRAM (37 
bytes)
    77  00070E  EE00  F001       lfsr  0,__pbssCOMRAM
    78  000712  0E25             movlw  37
    79  000714                 clear_1:
    80  000714  6AEE             clrf  postinc0,c
    81  000716  06E8             decf  wreg,f,c
    82  000718  E1FD             bnz  clear_1

von Volker S. (vloki)


Lesenswert?

Franky77 schrieb:
> Schau doch einfach mal ins lst-File...

Oder in den User-Guide des uns unbekannten Compilers.
(suchen nach "startup code" wäre bei XC8 und C18 ein guter Start)

von David N. (dave_nidda)


Lesenswert?

Vielen Danke für die vielen Antworten!
Ich lese mir mal alles durch, was ihr mit vorgeschlagen habt.

Danke!!

von Witkatz :. (wit)


Lesenswert?

David N. schrieb:
> FSR0 = 0x0f00;
>     while( FSR0++ != 0x0f76 )
>     {
>             INDF0 = 0;
>     }

Hier wird CANCON (0x0F6F) auf 0 gesetzt und damit Request CAN Normal 
Mode ausgeführt -> das CAN Modul übernimmt die Kontrolle über RB2

von David N. (dave_nidda)


Lesenswert?

Das wars.... vielen Dank!!

Ich lösche jetzt nur noch die GPR bis 0x5FF. Die SRF lasse ich nun in 
Ruhe. Es ist ja eigentlich auch nicht sinnvoll, diese manuell zu 
löschen. Diese haben schließlich alle einen definierten Status nach 
einem Reset.

von Volker S. (vloki)


Lesenswert?

Witkatz :. schrieb:
> Hier wird CANCON (0x0F6F) auf 0 gesetzt und damit Request CAN Normal
> Mode ausgeführt -> das CAN Modul übernimmt die Kontrolle über RB2

Das hätte doch eigentlich beim 18F258 auch passieren müssen...



David N. schrieb:
> Ich lösche jetzt nur noch die GPR bis 0x5FF. Die SRF lasse ich nun in
> Ruhe. Es ist ja eigentlich auch nicht sinnvoll...

Wie Peter schon angemerkt hat ist das möglicherweise alles gar nicht 
sinnvoll. Da dein Compiler aber immer noch geheim ist, weiß man da 
nichts genaues gar nicht ;-)

: Bearbeitet durch User
von David N. (dave_nidda)


Lesenswert?

Beim 2580 ist ab 0xF00 ein teil der CAN SFR. Wenn diese rückgesetzt 
werden, dann wird die "normale" Standardeinstellung überschrieben und 
auch deshalb wahrscheinlich das CAN Modul aktiviert. Ganz genau habe ich 
mir noch nicht angesehen, welche Register es hier speziell betrifft.
Beim 258 sind ab dieser Adresse nur 'unused' Bereiche, was also keine 
Auswirkung hat.

Achja, sorry, total vergessen, auf diese Frag zu antowrten!
ich habe den C18 v3.47 Compiler.
Der Linker nimmt das c018i.o file, womit alles initialisiert werden 
sollte.

Heißt, du empfiehlst mir, auf das löschen zu verzichten? :)
Ich glaube, das werde ich auch so machen.

von Volker S. (vloki)


Lesenswert?

Das Register CANCON hat sowohl beim 2580 als auch beim 258 die gleiche 
Adresse (0xF6F). Es müsste also auch beim alten Projekt schon 
überschrieben worden sein, wenn da ein 18F258 verwendet wurde.

David N. schrieb:
> Der Linker nimmt das c018i.o file, womit alles initialisiert werden
> sollte

Damit wird alles initialisiert, was auch im Sourcecode initialisiert 
wird.
Es wird nichts gelöscht! Wozu auch?
Fatal wäre natürlich, wenn es im Sourcecode "idata sections" hätte die 
beim Startup initialisiert und danach durch RamClear() wieder gelöscht 
werden, weil das ja erst nach dem Startup kommt.

von David N. (dave_nidda)


Lesenswert?

idata sections gibt es keine.

Ich belasse es nun so, dass ich einfach nichts mehr lösche.
Vielen Dank für eure Hilfe und ich wünsche ein schönes Wochenende!

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.