kann PORTD keinen Variablenwert auf PIC18F zuweisen

Ich verwende den folgenden Code, um etwas GPIO zu testen, während ich mit dem PIC18F45K20-Demoboard herumspiele. Mir wurde klar, dass etwas seltsam war, als ich einen Wert nicht erhöhen und sehen konnte, wie er sich auf den LEDs widerspiegelte, nachdem ich ihn in den Port geschrieben hatte. Irgendeine Idee, warum das so ist? Ich verwende den C18-Compiler mit MPLABX IDE v3.05

Verwendung von aPICkit3 mit diesem Demo-Kit: http://www.microchip.com/DevelopmentTools/ProductDetails.aspx?PartNO=dm164130-4

#pragma config FOSC = INTIO67   
#pragma config WDTEN = OFF, LVP = OFF   

#define TIMER T0CON

#include "p18f45k20.h"   

void delay();   

void delay() {      
   int counter = 0;   
   for (counter = 0; counter<1000; counter++);    
}   
void main(void) {     

   unsigned char d = 0;   

   TRISD = 0; // all bits of portd are set 0 as output      
   PORTD = 0; // deactivate all led's   

   while (1) {    

       d++;

       PORTD = d;

       delay();        

   }       
}   
LATDVersuchen Sie stattdessen zu schreiben PORTDund machen Sie Ihre Verzögerung viel langsamer.
Wo setzen Sie d zurück, wenn es das Maximum 255 erreicht? Wenn Sie versuchen, einem Port eine Nummer > 255 zuzuweisen, führt dies zu einem Fehler (es ist nur ein 8-Bit-Port, nicht wahr?)
@derstrom8 unsigned char ist eine 8-Bit-Variable. Es wird überlaufen und sich umwickeln.
Hmm, ich wusste, dass es eine 8-Bit-Variable war, aber ich glaube, ich habe vergessen, dass sie automatisch umbricht = P
Ich habe für alle Fälle einen Überlauf-Reset hinzugefügt, hat keinen Unterschied gemacht. Wie Matt sagte, sollte das 8-Bit-Zeichen ohne Vorzeichen umbrechen, wenn es überläuft.

Antworten (1)

Auf PICs lesen Sie von PORT und schreiben in LAT. Ersetzen Sie PORTD durch LATD. Es ist auch keine schlechte Idee, counterals zu deklarieren volatile int counter = 0;. {}Nachher nicht vergessen for(counter = 0; counter<1000; counter++).

PORTD durch LATD ersetzt, immer noch kein Glück. Es scheint auch seltsam, dass ich einen Hex-Wert in PORTD schreiben und ihn als Ausgabe sehen kann, wenn er nur zum Lesen dient.
@Sensors Es empfiehlt sich, in LAT zu schreiben und von PORT zu lesen. Das liegt an der Geschichte der PICs. Ursprünglich wurde PORT sowohl zum Lesen als auch zum Schreiben verwendet. Sogenannte "Read-Modify-Write"-Fehler waren üblich, daher erstellte Microchip die LAT-Register zum Schreiben. Die Möglichkeit, in PORT zu schreiben, wurde aus Gründen der Abwärtskompatibilität beibehalten.
@Sensors Ich habe keine Ahnung, welches Demoboard Sie haben. Poste die Demontage. Haben Sie ein PICKit oder einen ICD?
Ich habe den Beitrag mit einem Link zu dem von mir verwendeten Demo-Board aktualisiert. Verwenden Sie auch ein PICkit3 zum Programmieren.
@MattYoung für Verzögerungen brauchst du die Klammern nach deiner for-Schleife nicht. Ein Semikolon ist ausreichend.
Ich stimme dem Vorschlag zu, den int-Zähler als flüchtig zu deklarieren. Es ist möglich, dass der Compiler Ihre Verzögerungsschleife optimiert; volatile kann das verhindern. Eine andere Möglichkeit besteht darin, den Watchdog-Timer bei jeder Schleife zu löschen, was der Compiler auf keinen Fall optimieren sollte. Sie können auch versuchen, TRISE.PSPMODE manuell zu löschen; Wenn es gesetzt ist, könnte es den D-Port überschreiben. Das Handbuch sagt, dass es standardmäßig null ist, aber seltsamere Dinge sind passiert.
@derstrom8 Ich habe genug Dummes mit Microchip-Compilern gesehen, um nichts dem Zufall zu überlassen.
@MattYoung Ich hatte noch nie ein Problem, ich habe Hi-Tech und C18 ausprobiert. Habe Mikro-C aber noch nicht ausprobiert.
Was ist die FOSC-Geschwindigkeit? Wenn es 8 MHz mit einem 4x PLL aktiv sind, 32 MHz = 8 MIPS. Eine Iteration der "Verzögerung" könnte so wenig wie etwa 1100 Anweisungen sein, und da jede Anweisung 1/8 MIPS zur Ausführung oder 0,0001375 s benötigt, benötigen 255 Werte, die mit dieser Rate an einen Port geschrieben werden, nur 35 ms - gerade am Limit der menschlichen Beharrlichkeit des Sehens .