Forum: Mikrocontroller und Digitale Elektronik PIC18F46K80 Programm Fehler


von Osscon (Gast)


Lesenswert?

Hallo,
ich wollte ein kleines Programm schreiben, dass solange einen 
Schrittmotor dreht wie man auf ein Taste am RB0 Pin drückt.
Zusätzlich will ich bei einem kurzen Druck auf eine Taste am RB1 Pin die 
Geschwindigkeit ändern können.
Da ich für den Schrittmotor eine Vorgeschalten Elektronik habe muss ich 
lediglich eine kurze Flanke am RA0 Pin geben um einen Schritt zu machen.
Zum Testen habe ich aber einfach mal eine LED an RD1 angeschlossen.
Mein Programm läuft dann in etwa so ab:

Ist RB0 Low(Gedrückt)?
Ja->Setze Motor auf Links Drehen (RA1 auf High setzen)
    Mache kurze Flanke an RA0,
    Warte X Takte lang.

Ist RB1 Low(Gedrückt)?
Ja->Mach LED an,
    Warte 2 Sekunden
    Mache LED aus

Fange wieder von vorne an.
Das Programm ist noch nicht fertig, jedoch ist mir ein Fehler 
aufgefallen, den ich mir nicht erklären kann.
Wenn ich einmal kurz RB1 Drücke Leuchtet die LED ca. 2 Sekunden auf und 
geht dann wieder aus.
Solange ich RB0 Drücke kann ich am Oscillator die gewünschte Frequenz 
messen.
Also eigentlich genau, was man bei dem Programm erwarten würde.
Das merkwürdige ist jetzt nur, dass wenn ich RB0 und RB1 annähernd 
gleichzeitig drücke fängt die LED an sichtbar zu Flackern und das ein 
paar mal in der Sekunde.

Wie ist das möglich, wenn bei jeder LED Aktivierung doch eigentlich 
gewährleistet ist, dass ca. 2 Sekunden gewartet wird.
Es kann doch nur etwas mit dem Timer 0 nicht stimmen.
Hat jemand eine Idee, was dieses verhalten verursachen könnte?
1
;##############################################################################;
2
3
include <pic.inc>
4
5
config  RETEN = OFF
6
config  INTOSCSEL = HIGH
7
config  SOSCSEL = DIG
8
config  XINST = OFF
9
config  FOSC = INTIO2
10
config  PLLCFG = OFF
11
config  FCMEN = OFF
12
config  IESO = OFF
13
config  PWRTEN = OFF
14
config  BOREN = OFF
15
config  BORV = 3
16
config  BORPWR = ZPBORMV
17
config  WDTEN = OFF
18
config  WDTPS = 1048576
19
config  CANMX = PORTC
20
config  MSSPMSK = MSK7
21
config  MCLRE = OFF
22
config  STVREN = ON
23
config  BBSIZ = BB1K
24
...
25
26
;##############################################################################;
27
28
org h'0'
29
Arg0      equ h'0'
30
Arg1      equ h'1'
31
Arg2      equ h'2'
32
Ret0      equ h'3'
33
Ret1      equ h'4'
34
Ret2      equ h'5'
35
36
;##############################################################################;
37
      
38
org h'0'
39
Main
40
      
41
    ; Bank 15 Auswählen
42
      movlw   b'00001111'
43
      movwf   BSR,0
44
    
45
    ; Analoge IO Ausschalten
46
      clrf    ANCON0,1
47
      clrf    ANCON1,1
48
     
49
    ; PortB Pull Ups aktivieren
50
      bcf      INTCON2,RBPU,0
51
      movlw   b'00000111'
52
      movwf   WPUB,1
53
      
54
      movlw   b'00000000'
55
      movwf   LATA,0
56
      movlw   b'11111100'
57
      movwf   TRISA,0
58
      
59
      movlw   b'00000010'
60
      movwf   LATD,0
61
      movlw   b'11111101'
62
      movwf   TRISD,0
63
      
64
Loop
65
      
66
      btfsc   PORTB,1,0
67
      goto    Loop0
68
      
69
      bcf      LATD,1,0
70
      movlw   h'ff'
71
      movwf   Arg0,0
72
      movlw   h'ff'
73
      movwf   Arg1,0
74
      call    Delay64
75
      bsf      LATD,1,0
76
      
77
Loop0
78
      
79
      btfsc   PORTB,0,0
80
      goto    Loop1
81
  
82
      call    EngineTurnLeft
83
      call    EngineMakeStep
84
      movlw   h'd0'
85
      movwf   Arg0,0
86
      movlw   h'7'
87
      movwf   Arg1,0
88
      call    Delay1
89
      
90
Loop1
91
      goto    Loop
92
      
93
;##############################################################################;
94
; Delay mit Prescale 1:1 bzw. keinem Prescale
95
Delay1
96
      movlw   b'00001000'
97
      movwf   T0CON,0
98
      
99
      comf    Arg0,0,0
100
      movwf   TMR0L,0
101
      
102
      comf    Arg1,0,0
103
      movwf   TMR0H,0
104
      
105
      bcf      INTCON,T0IF,0
106
      bsf      T0CON,TMR0ON,0
107
      
108
      btfss   INTCON,T0IF,0
109
      goto    $-h'2'
110
      
111
      bcf      T0CON,TMR0ON,0
112
      
113
      return  0
114
  
115
;##############################################################################;
116
; Delay mit Prescale 1:64
117
Delay64
118
      movlw   b'00000101'
119
      movwf   T0CON,0
120
      
121
      comf    Arg0,0,0
122
      movwf   TMR0L,0
123
      
124
      comf    Arg1,0,0
125
      movwf   TMR0H,0
126
      
127
      bcf      INTCON,T0IF,0
128
      bsf      T0CON,TMR0ON,0
129
      
130
      btfss   INTCON,T0IF,0
131
      goto    $-h'2'
132
      
133
      bcf      T0CON,TMR0ON,0
134
      
135
      return  0
136
      
137
;##############################################################################;
138
      
139
EngineTurnLeft
140
      ...
141
      return  0
142
     
143
;##############################################################################;
144
      
145
EngineTurnRight
146
      ...
147
      return  0
148
      
149
;##############################################################################;
150
      
151
EngineMakeStep
152
      ...
153
      return  0
154
      
155
;##############################################################################;
156
      
157
end
158
      
159
;##############################################################################;

von Osscon (Gast)


Lesenswert?

Ok habe den Fehler gefunden.
Der Fehler war, dass beim aktivierten "Extended instruction set" 
Register Adressen kleiner als 0x96 Speziell behandelt werden.
Sobald ich z.B. die Adressen hiervon
1
Arg0      equ h'0'
2
Arg1      equ h'1'
3
Arg2      equ h'2'
4
Ret0      equ h'3'
5
Ret1      equ h'4'
6
Ret2      equ h'5'
um 0x100 nach oben verschiebe und entsprechend den code ändere, sodass 
die Bank Selektion verwendet wird geht alles.

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.