Forum: Mikrocontroller und Digitale Elektronik Anfängerprojekt - Probleme mit LED Sequenz


von spark (Gast)


Lesenswert?

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:
1
#include<p18f45k22.inc>
2
3
  CONFIG WDTEN = OFF    
4
  CONFIG MCLRE = INTMCLR  
5
  CONFIG DEBUG = OFF    
6
  CONFIG LVP = OFF     
7
  CONFIG FOSC = INTIO67 
8
  CONFIG PBADEN = OFF
9
  CONFIG PLLCFG = ON, PRICLKEN = ON
10
  CONFIG PWRTEN = OFF, BOREN = OFF, HFOFST = ON
11
  CONFIG CCP2MX = PORTB3, CCP3MX = PORTB5, P2BMX = PORTC0, T3CMX = PORTC0
12
  CONFIG XINST = OFF
13
  CONFIG CP1 = OFF, CPB = OFF, CP0 = OFF
14
15
16
Delay1 res 1
17
Delay2 res 1
18
Delay3 res 1
19
20
 org 0                  
21
  CLRF PORTB
22
  CLRF TRISB
23
  CLRF Delay1
24
  CLRF Delay2
25
  CLRF Delay3
26
  BSF PORTB, RB4
27
28
Loop:
29
  DECFSZ Delay1, F
30
  GOTO Loop
31
  DCFSNZ Delay2, F
32
  BTG PORTB, RB3
33
  GOTO Loop
34
 end

Habe mir erlaubt diesen zweiten Thread zu erstellen, nachdem ich mit dem 
ersten nicht erfolgreich war und dieser nun nach hinten gerutscht ist.
von Lehrmann M. (ubimbo)


Lesenswert?

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
von spark (Gast)


Lesenswert?

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...;-)
von Lehrmann M. (ubimbo)


Lesenswert?

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
von spark (Gast)


Lesenswert?

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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.