Hallo
Ich versuche mir eine LED Sequenz auf einem Steckboard aufzubauen. Die
Schaltug besteht aus einem PIC18F45K22 mit +5V and beiden VDD und Ground
an beiden VSS, dazwischen je ein Kondensator. MCLRE ist mit einem 10Ohm
Kondensator an VDD, von RB0 - RB7 ist je eine LED mit 150Ohm Widerstand
daran. Die Spannung kommt von einem Spannungsgeber (5V).
Dabei habe ich versucht den folgenden Code darauf laufen zu lassen. Der
Code kompiliert fehlerfrei, jedoch happerts bei der Ausführung auf dem
PIC. Statt an RB3 eine blinkende LED zu haben, bleibt an RB4 eine LED
dauerhaft auf ON. Auch bei leichtem Verändern des Codes ist das
Ergebniss immer dasselbe: Die am Anfang auf high geschaltenen PINs
bleiben high ansonsten passiert nichts. Wobei zu bemerken ist, dass es
nicht möglich war alle gleichzeitig auf high zu schalten, stadtdessen
waren nur zwei LED an.
Was sind mögliche Fehlerquellen?
Bitte um Hilfe, ist zum Verzweifeln...
Der Code sieht jetzt so aus:
spark schrieb:> CONFIG WDTEN = OFF> CONFIG MCLRE = INTMCLR> CONFIG DEBUG = OFF> CONFIG LVP = OFF> CONFIG FOSC = INTIO67> CONFIG PBADEN = OFF> CONFIG PLLCFG = ON, PRICLKEN = ON> CONFIG PWRTEN = OFF, BOREN = OFF, HFOFST = ON> CONFIG CCP2MX = PORTB3, CCP3MX = PORTB5, P2BMX = PORTC0, T3CMX = PORTC0> CONFIG XINST = OFF> CONFIG CP1 = OFF, CPB = OFF, CP0 = OFF
Da schau ich jetzt nicht drüber - ich gehe mal davon aus, dass du weißt,
was du da machst. Ansonsten setzt die ConfiBits nicht im Code sondern in
der Programmersoftware. Hilft beim Einstieg, da sieht man die ganzen
Optionen. Das bildet.
spark schrieb:> Delay1 res 1> Delay2 res 1> Delay3 res 1
Mach es altmodisch - schlaf das Datenblatt auf und geh in die Memorymap.
Such dir nen schönene Platz aus und mach
Delay1 equ 0x....
....
....
spark schrieb:> org 0> CLRF PORTB> CLRF TRISB
mach der Vorsicht halber mal alle Pins digital. Wie man macht steht im
AD-Wandler Teil.
> CLRF Delay1> CLRF Delay2> CLRF Delay3
Machst also alle gleich 0
> BSF PORTB, RB4
und eine LED an
spark schrieb:> Loop:> DECFSZ Delay1, F> GOTO Loop> DCFSNZ Delay2, F> BTG PORTB, RB3> GOTO Loop> end
Bist du dir mit DECFSZ Delay1, F und DCFSNZ Delay2, F sicher? Meines
Wissens nach sollte das DECFSZ irgendeinRegister, 1 stehen, damit das
auch übernommen wird.
Hast du schonmal simuliert und die Werte angekuckt? (MPLAB)
Dir ist schon klar, dass das Programm da böse schnell durchrasselt und
dass du keinerlei Chancen hast, das mit dem blossen Auge wahrzunehmen,
wenn eine LED über ein paar Takte blinkt.
Schau dich mal auf www.sprut.de um und schau dir dir Lernbeispiele zu
PIC an. Da gibts auch ne blinkende LED :-D
Danke für die Antwort.
Mit den ConfigurationBits ist mir tastächlich nicht alles klar, ich habe
es mal gekürtzt auf das was ich kenne (und hoffentlich reicht):
1
CONFIG WDTEN = OFF
2
CONFIG MCLRE = ON
3
CONFIG DEBUG = OFF
4
CONFIG LVP = OFF
5
CONFIG FOSC = INTIO67
6
CONFIG PBADEN = OFF
So schnell rasselt das übrigens gar nicht durch. Bei 1Mhz
Standardeinstellung gibt das 250'000 instruction cycles. Mit einem Byte
habe ich wird ja jeweils von 255 runtergezählt und das Ganze
verschachtelt ergibt 255^2 also wird von 65'025 gezählt. Eine LED würde
demnach mit
(3+1)*255^2+255*(3+3)+3 = 261'633 instruction cycles =
1/250'000*261'633 Hz = 1.046532 Hz blinken, oder?
Der Test mit dem DemoBoard (mit PIC18F45K20) mit dem selben Code aber
obigen configuration Bits bestätigt dies. Mit den selben Configuration
Bits funktioniert es aber nicht. Ich schau jeweils im .inc nach, dort
finden sich ebenfalls Kommentare.
1
DECFSZ Delay1, F
hat bis jetzt immer funktioniert. So wie du es geschrieben hast (und es
in manchen Tutorials ebenfalls steht) mit DECFSZ Register, 1 gibt es bei
mir immer einen BUILD Error. Frage mich warum.
Wie ich die Pins digital ist mir trotz intensiver Datasheet Recherche
nicht klar geworden. Ist es das ANSEL BIT? oder ADCON?
Der Code lautet jetzt wie folgt:
1
org 0
2
CLRF PORTB
3
CLRF TRISB
4
Delay1 EQU 0xFF
5
Delay2 EQU 0xFF
6
BSF PORTB, RB4
7
8
Loop:
9
DECFSZ Delay1, F
10
GOTO Loop
11
DCFSNZ Delay2, F
12
BTG PORTB, RB4
13
GOTO Loop
14
end
Wobei jetzt nur RB4 blinken sollte, was sie aber nicht tut. Was könnte
ich falsch gemacht haben??? Bitte um Hilfe. Sonst eröffne ich halt
wieder ein Thread, wenn dieser nicht mehr gesehen wird...;-)
spark schrieb:> Danke für die Antwort.> Mit den ConfigurationBits ist mir tastächlich nicht alles klar, ich habe> es mal gekürtzt auf das was ich kenne (und hoffentlich reicht): CONFIG WDTEN =
OFF
> CONFIG MCLRE = ON> CONFIG DEBUG = OFF> CONFIG LVP = OFF> CONFIG FOSC = INTIO67> CONFIG PBADEN = OFF
Ich kann dir nur für den Anfang den Rat geben einfach mit dem
graphischen von MPLAB zu arbeiten. Die Präprozessordirektiven können
später noch gelernt werden. Wenn du fragen hast zu den einzelenen Bits
bitte frag - ich werde dir helfen soweit ich das kann.
spark schrieb:> Ich schau jeweils im .inc nach, dort> finden sich ebenfalls Kommentare.> DECFSZ Delay1, Fhat bis jetzt immer funktioniert. So wie du es geschrieben hast
(und es
> in manchen Tutorials ebenfalls steht) mit DECFSZ Register, 1 gibt es bei> mir immer einen BUILD Error. Frage mich warum.
Okay das war nur was ich noch bemerkt habe. Ich muss ehrlich sagen, dass
ich Assembler nur auf den PIC16F gemacht habe, bei 18F bin ich dann zu
C. Das war mir nur noch in Erinnerung geblieben.
spark schrieb:> Wie ich die Pins digital ist mir trotz intensiver Datasheet Recherche> nicht klar geworden. Ist es das ANSEL BIT? oder ADCON?
ANSELx (Analogselect) legt fest, ob ein Pin analog oder digital ist.
(digital buffered enabled/disabled)
ADCON: Du weißt sicher, dass du im PIC nur einen AD-Wandler drin hast.
Auf ihn kann man sämtlich mit ANx bezeichneten Pins aufschalten. Mit
ADCON wählst du welcher AD-Pin mit dem AD-Wandler (ADC) intern verbunden
wird.
spark schrieb:> Loop:> DECFSZ Delay1, F> GOTO Loop> DCFSNZ Delay2, F> BTG PORTB, RB4> GOTO Loop> end
Bau mal das ANSEL mit ein und ersetze das
DCFSNZ Delay2, F
gegen
DECFSZ Delay2, F
also
DECFSZ Delay1, F
GOTO Loop
DECFSZ Delay2, F
BTG PORTB, RB4
GOTO Loop
Danke für deine Antwort. Und danke für deine Hilfe mit den Config-Bits,
sie erscheinen mir im Moment noch als grösstes Fragezeichen. Zum
Beispiel hier:[[Beitrag "Zwei Configurationbit Fragen"]]
diese sind mir noch nicht klar.
Der Syntax von den ANSELBITS war mir nicht ganz klar. Aber hier:
http://www.microchip.com/forums/m551843.aspx
meint jemand im letzten Beitrag:
The state of the ANSEL bits has no affect on digital output
functions.
Was eigentlich bedeuten würde, dass die Setzung nicht nötig wäre, oder?
Ich habe eigentlich auch vor auf C umzusteigen, wobei ich zuerst mal
dieses Lauflicht machen können sollte. Ist die Setzung der Config Bits
und die initialisierung des oszillators da einfacher?
>>DECFSZ Delay1, F>>GOTO Loop>>DECFSZ Delay2, F>>BTG PORTB, RB4 // wird nur übersprungen, wenn Delay2 null ist, also kein
blinken
>>GOTO Loop
Dies erscheint für mich wenig sinnvoll. Hier gibt es ja gar kein blinken
mehr.
Sinnvoller wäre wahrscheinlich
1
DECFSZ Delay1, F
2
GOTO Loop
3
DECFSZ Delay2, F
4
GOTO Loop
5
BTG PORTB, RB4
6
GOTO Loop
Was mir aber wirklich komisch erscheint ist, dass der Code auf dem
Demoboard funktioniert. Kann es sein, dass ich irgendwelche
Einstellungen im MPLAB falsch habe?
Danke