-
-
Erfahrener Benutzer
Lebende Robotik Legende
PIC Fallen
Hallo!
Ich habe das Thema geöffnet um Fallen vom PICs zu sammeln.
Ich bin sehr dankbar für alle Warnungen im voraus. Solche Sammlung finde ich sehr nutzlich für alle die Programme entwickeln.
MfG
-
Erfahrener Benutzer
Robotik Einstein
Hallo PICture,
hier ist eine weitere 'Falle': https://www.roboternetz.de/phpBB2/viewtopic.php?t=18526, hier sind noch mehr: http://www.domnick-elektronik.de/piccheck.htm bei 'Assembler-Programmier(er)-Fehler'
-
Erfahrener Benutzer
Lebende Robotik Legende
Hallo kalledom!
Vielen Dank für Deine Links. Weil es sich auf andere Typen von PICs erweitert hat, werde ich das Titel des Treads ändern.
Schöne Grüsse
Andreas
-
Erfahrener Benutzer
Roboter Genie
-
Erfahrener Benutzer
Lebende Robotik Legende
Hallo!
Es Betrift den PIC18F252, aber wahrscheinlich gilt für alle PIC18FXXX.
Ich wollte, eine Sequenz:
nop
nop
durch
goto $+2
ersetzen.
Gemessene Ausführungszeit beträgt aber 3 anstatt 2 Takten. Natürlich ein Befehl $+1 schickt den Prozessor in "Nirvana", weil die Adressen nur gerade seien dürfen. Wen jemand eine Verzögerung um 3 Takte braucht, kann also "goto $+2" anwenden.
Erklärung vom Microchip Forum, wo ich selbstverständlich nachgefragt habe:
The second instruction word of all of the 2-word instructions has '1111' in its upper nibble. This will make it always execute as a 'nop'.
If this weren't the case, a skip instruction followed by a 2-word instruction wouldn't work correctly since the PIC would execute something unintended. Execution would be unpredictable in that it would be determined by whatever happened to be in that second instruction word.
MfG
-
Erfahrener Benutzer
Roboter-Spezialist
Absolut unqualifizierte Antwort aber ich konnte es mir leider nicht verkneifen
Es ist Montag und mein Kopf ist noch beim booten...
Bild hier
-
Hallo PICTure,
irgendwie stehe ich bei Deinem Problem auf dem Schlauch. Um drei Takzyklen zu warten, benutze ich folgende Sequenz:
goto $+1
nop
Die Adresse wird in "words" gezählt, d.h. ein goto $+1 springt an den Beginn der folgenden Befehls. Bei mir jedenfalls funktioniert obige Sequenz tadellos (PIC16). Bei PIC18 hab ich noch nicht probiert, denke aber dass das auch geht.
Grüße
Mario
-
Erfahrener Benutzer
Lebende Robotik Legende
Hallo *Mario*!
Das geht sicher nicht.
Der Hauptunterschied zwischen den Famillien 12+16F und 18F liegt in der Organisation des Programmspeichers.
Bei den 12F und 16F PICs ist der Programmspeicher 14 Bit breit und jede Adresse enthält einen vollständigen (gültigen) Befehl.
Bei den 18F PICs ist der Programmspeicher 8 Bit breit und nur jede gerade Adresse enthält einen gültigen Befehl, da jeder 16-Bit Befehl im Speicher 2 Byte lang ist.
Deswegen "goto $+1" schickt den Prozessor vom 18F in die Mitte des nächsten Befehls, was er nicht interpretieren kann, und das Programm hängt.
Das ist, so wie ich es jetzt sehe, auch eine Falle für Umsteiger von 12F und 16F auf 18F PICs.
MfG
-
Hallo PICture,
danke für die Erklärung, wusste ich nicht! Da ich demnächst mein Programm auf einen PIC18 portieren werde (wegen USB) wäre ich da sicher reingefallen.
Super Tipp, Dank Dir!
Gruß
Mario
-
Erfahrener Benutzer
Lebende Robotik Legende
Hallo!
Im Microchip Forum haben ein Problem mit dem PIC16F630 gehabt. Sie wollten RA0 bis RA2 als digital I/O eintellen. Ich habe das Problem auch mal gehabt und herausgefunden, dass es bei der Initialisiereung von PORTA, anstatt fehlerhaft im Datenblatt angegebenem:
movlw 5
movwf CMCON
stehen muss
movlw 7
movwf CMCON
Seit ich mein Beitrag dort gepostet habe, hat sich keiner mehr gemeldet.
MfG
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen