PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PIC_16F84A - Programmfrage



aykay
21.11.2008, 22:50
Hallo zusammen!
Ich hab wieder einmal ein unerklärliches Problem welches mir den kopf zerbricht.
Programme schreibe ich mit MPLAB 8.1
Es geht um Folgendes: Ich möchte einen Schrittmotor (unipolar) mit einem PIC ansteuern, da ich keine lust für teure Treiberschaltungen habe.
Die vorschaltelektronik beschert mir keine Probleme sondern das Programm.
Bevor ich den Schrittmotor ansteuere, möcht ich dies mal mit LED's simulieren.
Dazu habe ich 8 LED's an den Port B, RB1- RB8 angeschlossen (Vorwiderstand 1K).
Ich möchte erst alle LED's ausschalten, nachdem ich den Port B auf ausgang geschaltet habe.
Dies sieht so aus:


org 0x00
goto main


main
bsf STATUS, RP0
movlw B'00000000'
movwf TRISB
bcf STATUS, RP0
clrf PORTB

end



So, jetzt müssten alle meine LED's aus sein.
Aus unerklärlichen Gründen ist dies aber nicht so!
Die Spannung an den halb leuchteten LED's beträgt 2,2V und wenn ein Port auf high ist, dann ist die Spannung 2,7V
Wieso die Spannung an den NICHT ANGESTEUERTEN LED'S 2,2V beträgt kann ich mir unmöglich erklären! Die Printplatte hab ich schon tausendmal überprüft, da ist nicht der kleinste Fehler zu finden!
Ich hoffe einer von euch kann mir sagen was da läuft!


MfG

Andi

Lif79
22.11.2008, 08:31
moin,
hast du den pic denn richtig konfiguriert?
Manche Ports haben mehrere funktionen und müssen erst als digitaler ausgang eingestellt werden...
schreibe am besten die Config-Werte mit in die asm Datei, wenn man das im brennprogramm später falsch einstellt hat man sonst plötzlich fehler.
Um den Code zu prüfen hat sih bei mir folgendes programm bewährt http://oshonsoft.com/pic.html

aykay
22.11.2008, 11:41
ja das hab ich doch...mit bsf STATUS, RP0 gehe ich in die band 1 dann schreibe ich den wert von W (B'00000000') in das TRISB register in dem man zwischen aus- und eingang wählen kann. ist das bit 0 so ists ein ausgang.
und dannach kehre ich mit bcf STATUS, RP0 wieder in die bank 0 zurück wo sich der PORTB befindet, welcher ich ja ansteuere..also die linker und include datei habe ich von MPLAB genommen und der PIC stimmt mit den werten auch überein...müsste also alles gehen...aber ich schua mal was ich mit diesm programm von dir machen kann! danke viel mals!

aykay
22.11.2008, 11:42
ja das hab ich doch...mit bsf STATUS, RP0 gehe ich in die band 1 dann schreibe ich den wert von W (B'00000000') in das TRISB register in dem man zwischen aus- und eingang wählen kann. ist das bit 0 so ists ein ausgang.
und dannach kehre ich mit bcf STATUS, RP0 wieder in die bank 0 zurück wo sich der PORTB befindet, welcher ich ja ansteuere..also die linker und include datei habe ich von MPLAB genommen und der PIC stimmt mit den werten auch überein...müsste also alles gehen...aber ich schua mal was ich mit diesm programm von dir machen kann! danke viel mals!

Mobius
22.11.2008, 12:32
Also, was mir als erstes auffeallt, du hast keine Unendlichschleife in deinem Programm. Unten ist mein Vorschlag gegen dieses Problem.



org 0x00
goto main


main
bsf STATUS, RP0
movlw B'00000000'
movwf TRISB
bcf STATUS, RP0

loop
clrf PORTB
goto loop

end

Simulier das Programm mal mit MPSIM und schau, ob er tut was du erwartest (und zwar alle PORTB-Pins auf low ziehen). Ansonsten, schau das Datenblatt durch welche Module des PIC mit PORTB gemultiplext sind und ob diese nach einem Reset ausgeschalten sind, oder ob sie manuell abgeschalten werden müssen.
lg
Mobius

PICture
22.11.2008, 14:36
Hallo!

Es könnte auch sein, dass der Watchdog aktiv ist und in regelmässigen Abständen den PIC resetet. Er solle in __config als OFF deklariert werden.

MfG

aykay
22.11.2008, 16:06
also den watchdog deaktiviere ich immer beim übertragen (picprog2006) und nehme den power up timer....wie soll denn dieser configurationsbefehl im quellcode aussehen?

PICture
22.11.2008, 16:32
Ich benutze nur MPASM und bei mir sieht standartmässig jeder Programmanfang so wie im Code aus.

MfG
LIST P=16F84
include "P16F84.inc"
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC

aykay
22.11.2008, 17:57
also ich habs genauso gemacht und auch das testprogramm von http://oshonsoft.com/pic.html hat mir geholfen, es zeigt genau das an wie es sein sollte aber in der praxis schauts leider immernoch nicht besser aus :(
ich weiss echt nicht mehr was ich machen soll...kanns am pic selber liegen? dass der futsch ist oder so?

PICture
22.11.2008, 18:54
Es ist natürlich möglich, aber unwahrscheinlich. Es könnte auch sein, dass der Oszillator nicht arbeitet, dann kann der PIC nähmlich gar kein Programm ausführen.

Wenn der Oszillator geht, würde ich um den PORTB zu testen, ein kleines Testprogramm (im Code) ausführen. Wenn nach dem ausführen die LEDs immer noch leuchten, dann ist der PIC leider kaputt. :(

Ich nehme an, dass jede LED mit Vorwiderstand zwischen PORTB Pin und GND geschaltet ist.

MfG

LIST P=16F84a
include "P16F84a.inc"
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
org 0x00
clrf PORTB
bsf STATUS, RP0
movlw 0
movwf TRISB
bcf STATUS, RP0
sleep
end

aykay
27.11.2008, 18:06
Ich hab dein letzteres Programm einmal getestet. Es passiert nicht, genau so wie es sollte...Nuna habe ich das sleep rausgenommen, den PORTB,1 gesetzt und daraus eine schleife gemacht:

LIST P=16F84a
include "P16F84a.inc"
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
org 0x00
clrf PORTB
bsf STATUS, RP0
movlw 0
movwf TRISB
bcf STATUS, RP0
loop1
bsf PORTB,1
goto loop1

end


Jetzt sollte das zweite LED am Ausgang leuchten und sonst nichts. Die anderen LED's leuchten aber immernoch ein wenig. ich hab mal rumgespielt und an RB5 das GND hingehalten. Erstaundlicherweise leuchten die anderen LED's nicht mehr, nur noch das gewollt leuchtende an RB2! Hast du eine ahnung wieso das so ist? ich hab dann auch mal eine LED zwischen diesen RB5 und dem GND gehalten, welche leicht leuchtete, bei den anderen jedoch das selbe verursachte wie wenn ich NUR GND hinhalte, also die anderen waren ebenfalls aus.
hast du eine ahnung an was das liegen könnte?

MfG
Andi

PICture
27.11.2008, 18:25
Hallo!

Der PIC ist defekt oder der Oszillator geht nicht.

MfG

aykay
27.11.2008, 20:39
Also der Oszi geht, da zum beispiel ein lauflicht problemlos über die Bühne geht, nur dass dann hald die LED's die nicht voll leuchten sollen ein wenig leuchten.
Ich hab das Problem so lösen können dass ich vom GND eine Verbindung zum Pinport 1 mache, also zu RA2/AN2/Vref. Funktioniert ;)

PICture
27.11.2008, 21:27
Vielleicht sprechen wir nicht über gleichen PIC, da der 16F84a nähmlich kein Pin AN2/Vref hat. :)

MfG

aykay
27.11.2008, 21:45
Hopla :D hab auf dem datenblatt des 16F628A geschaut, weil ich die auch hab und die RB- Ports ansonsten gleich sind :D auch speirung und MCLR :D
Auf jeden fall geht das Ganze jetzt wenn ich GND mit Port 1 verbinde :D
Danke für die Unterstützung!

MfG
Andi

PICture
27.11.2008, 22:17
Nichts zu danken. :)

Das ist aber sogar für mich unverständlich. Wahrscheinlich fehlt dem PIC ein gutes GND am GND-Pin.

MfG