PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PIC und Akte X



Enrock
17.04.2008, 07:55
Servus,

ich habe gerade ein komisches Problem.
Und zwar möchte ich den PIC(16F877A) direkt auf der Platine programmieren und will mir dazu das ICSP Kabel von sprut.de nachbauen.
Um dies zu bewerkstelligen trenne ich VDD, die Pins RB6 und RB7 sowie MCLR über Jumper von der restlichen Schaltung. (High Voltage Programming)
Jetzt waren aus Zufall die Jumper von MCLR und VDD offen und der PIC läuft trotzdem ohne Versorgungsspannung. Also auf dem Display wird wie gewollt etwas angezeigt so wie es sein sollte. Auch die Kommunikation mit dem EEPROM funktioniert?!?!?

Aber ohne VDD? Kann mir das jemand erklären?! Ohne MCLR würde ich noch nachvollziehen können aber ohne die Versorgungsspannung. Wird der PIC dann über die PORTS gespeist? :-k

Gruß

gunzelg
17.04.2008, 11:46
Hi

da sind intern Clamp-Dioden an jedem Pin gegen VDD und VSS. Wenn jetzt an einem beliebigen Pin ds PIC eine Spannung anliegt, und diese Spannung größer ist als die Spannung an VDD, fliesst Strom dorthin ab.

Gerhard

Enrock
18.04.2008, 10:19
Servus,

okay, so ganz verstehe ich das nicht aber gut.

Dann hätte ich da noch eine Frage bzw. ein Problem.
Und zwar wollte ich mir eine Wetterstation basteln. Soweit so gut.

Ich habe insgesamt 10 Quelldateien (.asm), die für unterschiedliche Sensoren, das LCD, ADC usw. verantwortlich sind. (Um das ganze übersichtlich zu machen)
In meiner Main rufe ich dann nach und nach die eizelnen Routinen auf. Einzeln funktioniert das auch super aber wenn ich Temperatur.asm, Feuchte.asm und zusätzlich Druck.asm zusammen einbinde, ohne irgendetwas aus der Druck.asm Datei aufzurufen, funktioniert auf einmal meine Temp. und Feuchtemessung nicht mehr.
Diese gibt dann irgendeinen sinnlosen Wert aus. Lösche ich die Druck.asm Datei aus den Source Files in MPLab funktioniert das ganze wieder einwandfrei. Die Adresszuweisung für die Variablen kann es nicht sein, darauf habe ich geachtet.
Kann mir das jemand erklären? Ich habe absolut keinen Plan mehr

Achja, was macht der Befehl CODE? Also z.B. Prog1 Code? Gibt das nur an, dass jetzt Code folgt oder wofür ist das zuständig.
Danke

Gruß

Benedikt.Seidl
18.04.2008, 10:50
hallo

wenn du uns nicht die quelldateien zeigst, können wir nur raten. am einfachsten wäre es, wenn du es hier einfach postets, am besten in solche [ code ][ /code ] kästchen, dann bleibt es schön übersichtlich.

sonst fällt mir auch nur ein was ein:
evtl. ist es zu viel code, dass du über die 1. page hinauskommst?

was auch immer hilfreich beim fehler suchen ist, ist die *.lst datei. da kann man überprüen wie die einzelnen asm-files zusammengesetzt werden.

SEIDL.

Enrock
18.04.2008, 11:17
Servus,

kannst du mri das mit der 1. page genauer erklären? Wie groß ist diese?
Ich werde dann heute Abend den Code posten...
Gruß

Benedikt.Seidl
18.04.2008, 11:26
hallo

eine page ist beim 16f877a 2048 befehle lang. dann muss man dem controller, wenn man durch einen call oder goto befehl velässt mit dem pclath register sagen, zu welcher page man springt. (siehe auch hier (https://www.roboternetz.de/wissen/index.php/PIC_Assembler#Programmspeicher_2) im rn-wissen)

SEIDL.

Enrock
18.04.2008, 11:42
Servus,

okay... und ich dachte dass das bei Programmcode egal ist sondern nur bei den Registern so ist also mit den Banken...
Nu ja das wäre ien Erklärung
Gruß

Enrock
18.04.2008, 12:09
So nochmal ich....

ich glaube ich habe das jetzt verstanden. Bisher habe ich noch kein so großes Programm geschrieben.
Also ich brenne 2450 Befehle, somit muss ich irgendwann in die Page 1 springen. Der Übergang ist direkt in der druck.asm Datei.
Wie mache ich das jetzt am geschicktesten? Wäre es sinnvol beispieslese mit ORG 0x800 die druck.asm komplett in die erste Page auszulagern und dann jedes mal mit
bcf PCLATH,4
bsf PCLATH,3
in die Page 1 zu wechseln, wenn ich die druck.asm Datei aufrufe bzw eine Routine daraus?!
Vielleicht sollte ich mir dann gleich angewöhnen, die Datein mit ORG zu organisieren.
Oh man...
Gruß

Benedikt.Seidl
18.04.2008, 16:25
genau. allerdings musst du dich auch um pclath kümmern, wenn du in druck.asm eine routine von einer anderen datei, bzw eine routine in page0 aufrufst.

um das zurückspringen mit return brauchst du dich dann aber nicht mehr zu kümmern, das geht automatisch.

du kannst auch ein "directive" verweden:

PAGESEL wait
call wait

gpasm macht dann aus PAGESEL automatisch den code, den man braucht um pclath mit den richtigen werten zu füllen.


This directive will generate page selecting code to set the page bits to the page containing the designated <label>. The page selecting code will set/clear bits in the STATUS for 12 bit and 14 bit devices. For 16 bit devices, it will generate MOVLW and MOVWF to modify PCLATH. The directive is ignored for enhanced 16 bit devices.

SEIDL.

Enrock
21.04.2008, 13:04
Servus,

also ich habe da dann doch noch mal eine frage zu.
Main Page 0
LCD Page 1
Ich springe in meiner Main mit call in die die LCD_ROUTINE. In der LCD-Routine springe ich mit call in die Subroutinen, wie LCD_LINE_1, LCD_LINE_1, Busy-Flag usw. Nach einen RRETURN bin ich ja wieder auf Page 0... wie mache ich das nun?

Gruß

Benedikt.Seidl
21.04.2008, 13:33
das macht der alles automatisch. behaupte ich jetzt einfach mal. das einzige wichtige ist der vorgang, wenn per call oder goto die grenze zwischen zwei pages durchschritten wird. return sollte auch so funktionieren, da muss man nichts machen.

solange die routinen LCD_LINE_1, LCD_LINE_1, Busy-Flag auf page 1 liegen, müsste es funkitonieren.

SEIDL.