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
Druckbare Version
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
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'
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
http://www.sprut.de/electronic/pic/fallen/fallen.html
Spruts Fallenseite
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
Absolut unqualifizierte Antwort aber ich konnte es mir leider nicht verkneifen 8-[
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
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
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