Fehler bei der Anwendung des Programs

Gast #3259648
Lesenswert?

Hey,
um mit den PIC Microkontrolern anzufangen habe ich mir eine einfache 
Aufgabe gestellt:
- drei LEDs (Blau, Grün, Rot) sollen mit einen Taster nacheinander an 
und Ausgeschaltet werden (1. Tastendruck: Grüne LED geht an - 2. 
Tastendruck Blaue LED geht an - 3. Tastendruck: Grüne LED geht aus...).
-mit einem zweiten Taster soll eine LED ein, und beim zweiten drücken 
ausgeschaltet werden.
Im Simulationprogram "Real Pic Simulator" und "MPLAB SIM" funktioniert 
das Programm auch so wie ich es haben will. doch beim Laden auf ein 
16F628A Chip mit "Propic2" reagiert der Chip nicht auf die Signale, die 
ich ihm Gebe.
Die Taster schalten 5V an PIN RA1 und RB1 und die Ausgänge kontrolier 
ich mittels Voltmeter (will keine Bauteile verschwenden, solange der 
Chip nicht ordnungsgemäß lauft).



Program:
1
  list      p=16f628A           ; list directive to define processor
2
  #include <p16F628A.inc>       ; processor specific variable definitions
3

4
  errorlevel  -302              ; suppress message 302 from list file
5

6
  __CONFIG   _CP_OFF  & _LVP_OFF & _BOREN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT 
7
;& _DATA_CP_OFF
8
; '__CONFIG' directive is used to embed configuration word within .asm file.
9
; The lables following the directive are located in the respective .inc file.
10
; See data sheet for additional information on configuration word settings.
11

12

13

14

15
;***** VARIABLE DEFINITIONS
16
w_temp        EQU     0x7E        ; variable used for context saving 
17
status_temp   EQU     0x7F        ; variable used for context saving
18
loops       Equ     0x22            ; Zähler für Warteschleife 
19
loops2      Equ     0x23            ; Zähler für Warteschleife  
20

21

22

23

24
;**********************************************************************
25
  ORG     0x000             ; processor reset vector
26
  goto    main              ; go to beginning of program
27
  
28

29
  ORG     0x004             ; interrupt vector location
30
  movwf   w_temp            ; save off current W register contents
31
  movf  STATUS,w          ; move status register into W register
32
  movwf  status_temp       ; save off contents of STATUS register
33

34
; isr code can go here or be located as a call subroutine elsewhere
35
  BTFSS PORTB,1
36
  GOTO LEDEIN
37
  BTFSC PORTB,1
38
  GOTO LEDAUS
39

40
  LEDEIN
41
  BSF PORTB,1
42
  CALL Wait
43
  GOTO OUT
44

45
  LEDAUS
46
  BCF PORTB,1
47
  CALL Wait
48

49
OUT
50
  bcf    INTCON, INTF       ; RB0-Interrupt-Flag löschen 
51
  movf    status_temp,w     ; retrieve copy of STATUS register
52
  movwf  STATUS            ; restore pre-isr STATUS register contents
53
  swapf   w_temp,f
54
  swapf   w_temp,w          ; restore pre-isr W register contents
55
  retfie                    ; return from interrupt
56

57

58
main
59

60
; remaining code goes here
61

62
        bsf     STATUS, RP0     ; auf Bank 1 umschalten
63
        movlw   B'00000001'     ; PortB alle output
64
        movwf   TRISB
65
        bcf     STATUS, RP0     ; auf Bank 0 schalten
66
        clrf    PORTB           ; alle LEDs ausschalten
67

68

69
; RB0-Interrupt einstellen
70
        bsf    STATUS, RP0        ; auf Bank 1 umschalten
71
        bsf    OPTION_REG, INTEDG ; 0-1-Flanke an RB0
72
        bcf    STATUS, RP0        ; auf Bank 0 zurückschalten
73

74
        bsf    INTCON, INTE       ; RB0-interrupt erlauben
75
        bsf    INTCON, GIE        ; Interrupt generell erlauben
76

77
Start
78
  BTFSC PORTA,1
79
  GOTO Gruen
80
  CALL Wait
81
  GOTO Start
82

83
Gruen
84
  BSF PORTB,2
85
  CALL Wait
86
  BTFSC PORTA,1
87
  GOTO Tuerkis
88
  GOTO Gruen
89

90
Tuerkis
91
  BSF PORTB,3
92
  CALL Wait 
93
  BTFSC PORTA,1
94
  GOTO Blau
95
  GOTO Tuerkis
96

97
Blau
98
  BCF PORTB,2
99
  CALL Wait
100
  BTFSC PORTA,1
101
  GOTO Lila
102
  GOTO Blau
103

104
Lila
105
  BSF PORTB,4
106
  CALL Wait
107
  BTFSC PORTA,1
108
  GOTO Rot
109
  GOTO Lila
110

111
Rot
112
  BCF PORTB,3
113
  CALL Wait
114
  BTFSC PORTA,1
115
  GOTO Gelb
116
  GOTO Rot
117

118
Gelb
119
  BSF PORTB,2
120
  CALL Wait
121
  BTFSC PORTA,1
122
  GOTO Weiss
123
  GOTO Gelb
124

125
Weiss
126
  BSF PORTB,3
127
  CALL Wait
128
  BTFSC PORTA,1
129
  GOTO Schwarz
130
  GOTO Weiss
131

132
Schwarz
133
  BCF PORTB,2
134
  BCF  PORTB,3
135
  BCF PORTB,4
136
  CALL Wait
137
  GOTO Start
138

139
; Warteschleife 250 ms
140

141
Wait
142
        movlw   D'250'          ; 250 ms Pause
143
        movwf   loops 
144

145
Wai
146
        movlw   .110           ; Zeitkonstante für 1ms
147
        movwf   loops2
148
Wai2    nop                    ; 
149
        nop
150
        nop
151
        nop
152
        nop
153
        nop
154
        decfsz  loops2, F      ; 1 ms vorbei?
155
        goto    Wai2           ; nein, noch nicht
156
                               ;
157
        decfsz  loops, F       ; 250 ms vorbei?
158
        goto    Wai            ; nein, noch nicht
159
        retlw   0              ; das Warten hat ein Ende 
160

161
; initialize eeprom locations
162

163
  ORG  0x2100
164
  DE  0x00, 0x01, 0x02, 0x03
165

166

167
  END                       ; directive 'end of program'
#3259671
Lesenswert?

RobertVogel schrieb:
> Hey,
> um mit den PIC Microkontrolern anzufangen habe ich mir eine einfache
> Aufgabe gestellt:


> ich mittels Voltmeter (will keine Bauteile verschwenden, solange der
> Chip nicht ordnungsgemäß lauft).

Der läuft sicherlich ordnungsgemäss. Das Problem liegt bei dir, bzw. 
deinem Programm und nicht beim PIC.

Aber: Was du festgestellt hast ist, dass deine vermeintlich 'einfache 
Aufgabe' in Wirklichkeit noch immer viel zu schwer ist. Du musst dir 
eine noch einfachere Aufgabe stellen.
Taste drücken -> LED leuchtet
Tatse nicht drücken -> LED leuchtet nicht

Und für die allerersten Versuche solltest du auch die Taste gleich noch 
weg lassen und dich nur mit der LED (oder mehreren LED) alleine 
beschäftigen.

Die einzige Web-Site die ich kenne, die so etwas ähnliches wie ein PIC 
Tutorial anbietet, ist Sprut.de

http://www.sprut.de/electronic/pic/grund/grund.htm
Gast #3259678
Lesenswert?

Ich bin mit dem Programieren in Assembler vertraut. Ich bin dabei mich 
in die PICs einzuarbeiten und diese Aufgabe dient nur zur vorbereitung 
auf andere Komplexere anwendungen.

Diese aller einfachsten Übungen habe ich allerdings auch Bewerkstelligt 
und diese Funktionierten auch.
Gast #3259701
Lesenswert?

um die erste Aufgabe zu lösen kann ich das "Vellemann 8048" 
Experimentierbord nutzen. Da sind die Wiederstände eingebaut. in der 
Schaltung die ich für die Kontrolle des Interrubs aufgebaut habe fehlen 
diese Widerstände zwar noch, das Program läuft aber auf beiden nicht.
Gast #3259941
Lesenswert?

an der von dir angefragten Stelle:
wen PORTA,1 = 1: springe vor zu Markierung "Gelb"
ansonsten springe zurück zur Markierung "Rot".

wie schon erwähnt, diese Zeilen haben nichts mit dem Interrubt zu tun.
Habe den Fehler übrigens schon Lokaliesiert. Er lag in der Schaltung.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren