PIC 12F508 Projekt

OP #1618107
Lesenswert?

Hallo zusammen,

ich will ein kleines PIC-Projekt in Assembler beginnen.

Als PIC verwende ich einen 12F508.

Betriebsspannung sind 3 Knopfzellen mit jeweils 1,4V und 650mAh, also 
4,2V.

Folgende Funktionen sollten realisiert werden:


Wenn ein Schalter (Reedkontakt) geschlossen wird, soll für 2min30s 4 
rote LEDs leuchten.
Nach den 2min30s sollen 4 grüne LEDs leuchten, bis der Schalter wieder
geöffnet wird. (Wenn möglich sollen die LEDs getaktet werden, damit die 
Knopfzellen länger halten.)


Außerdem soll der PIC in Standbye-Betrieb gehen wenn er nicht gebraucht 
wird.


Habe mal eine PAP gemacht. Kann dass so gehen oder sollte ich anders 
vorgehen?

PS: Werte im Schaltplan stimmen nicht mehr, geht nur um die Schaltung an 
sich
Angehängte Dateien:
OP #1620097
Lesenswert?

so habe jetzt schon mein erstes Problem, wollte mal schnell mit einer 
Zeitschleife die LEDs mit einem Blinklicht testen, es stimmt aber vorne 
und hinten nicht.


1
    list      p=12F508            ; list directive to define processor
2
    #include <p12F508.inc>        ; processor specific variable definitions
3

4
    __CONFIG   _MCLRE_OFF & _CP_OFF & _WDT_OFF & _IntRC_OSC
5

6
; '__CONFIG' directive is used to embed configuration word within .asm file.
7
; The lables following the directive are located in the respective .inc file. 
8
; See respective data sheet for additional information on configuration word.
9

10

11

12

13
;***** VARIABLE DEFINITIONS
14
TEMP_VAR    UDATA
15
sGPIO    res 1
16
cn1      res 1
17
cn2      res 1
18
cn3      res 1
19

20

21
;**********************************************************************
22
RESET_VECTOR    CODE   0x1FF      ; processor reset vector
23

24
; Internal RC calibration value is placed at location 0x1FF by Microchip
25
; as a movlw k, where the k is a literal value.
26
    
27
MAIN    CODE    0x000
28
    movwf   OSCCAL            ; update register with factory cal value 
29

30
;Initialisierung
31
start   
32
  movlw  b'00000000'      ;OPTION-Register konfigurieren, damit TRIS nicht überschrieben
33
  OPTION            ;wird.
34
  movlw  b'11111001'      ;GP1,GP2 = Ausgänge.
35
  Tris  GPIO
36
  clrf  sGPIO
37
;Main
38

39
flash
40
  movf  sGPIO,w
41
  xorlw  b'00000110'  
42
  movwf  GPIO
43
  movwf  sGPIO
44

45
;warten
46

47
  clrf  cn1
48
  clrf  cn2
49
  movlw  .23
50
  movwf  cn3
51

52
w1
53
  nop            ;1 Cycle
54
  nop            ;1 Cycle
55
  decfsz  cn1,f      ;1 Cycle  
56
  goto   w1        ;2 Cycle
57
              ;(256*5)=1280
58

59
  nop            ;1 Cycle
60
  nop            ;1 Cycle
61
  decfsz  cn2,f      ;1 Cycle  
62
  goto   w1        ;2 Cycle
63
              ;1280*(*256*5)=1638400
64
  
65
  nop            ;1 Cycle
66
  decfsz  cn3,f      ;1 Cycle
67
  goto  w1        ;2 Cycle
68
              ;1634800*(4*23)=150732800µs=150,73s=2,5min
69
  goto flash    
70
  
71

72
    END                       ; directive 'end of program'

die LEDs leuchten nur 8sec statt 2,5min. Als Quarz wird das interne mit 
4Mhz verwendet
#1620194
Lesenswert?

>               ;1280*(*256*5)=1638400
>               ;1634800*(4*23)=150732800µs=150,73s=2,5min

Überleg doch mal was an diesen Timing Berechnunegn falsch sein könnte.

>               ;(256*5)=1280

Die ist richtig, zu dazu kommen noch die 5 Takte aus der zweiten
Schleife also 1280+5 und das mal 256 Durchläufe ergibt 328960 plus
nochmal 4 für die letzte Schleife und das mal 23 sind summa sumarum
7566172 ergibt bei 4MHz Takt eine Zeit von 7,566 Sekunden.

Passt also ganz Genua.
OP #1640527
Lesenswert?

so, habe jetzt dass nächste Problem:

Ich will eig. den GP0 als Eingang verwenden. Doch er erkennt High nur, 
wenn ich ihn auf VDD direkt anschließe. Den Schalter mit dem 
Pullup-Widerstand bekommt er nicht auf die Reihe.

Das komische jetzt jedoch ist, dass wenn ich den GP4 als Eingang 
verwende, dieser optimal funktioniert mit dem Schalter und Pullup.

Ist dass immer so, oder muss ich den GP0 noch anders konfigurieren?

Auszug aus dem Programm:
1
 start   
2
  movlw  b'00000000'      ;OPTION-Register konfigurieren, damit TRIS nicht überschrieben
3
  OPTION            ;wird.
4
  movlw  b'11111001'      ;GP1,GP2 = Ausgänge.
5
  Tris  GPIO
6

7
  clrf  wait1
8
  clrf  wait2
9
  clrf  wait3
10
  clrf  wait4
11
  clrf  GPIO
12
  movlw  .2
13
  movwf  wait4
14

15
;Main
16
Abfrage  
17

18
  btfss  GPIO,0
19
  goto   Abfrage
20
  movlw  b'00000010'
21
  movwf  GPIO

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