Forum: Mikrocontroller und Digitale Elektronik PIC 12F508 Projekt


von Florian K. (kraemer90)


Angehängte Dateien:

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

von Florian K. (kraemer90)


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

von Dieter W. (dds5)


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.

von kraemer90 (Gast)


Lesenswert?

Will jetzt einen SMD-PIC programmieren. Kann es sein dass ich da nur 5 
Pins brauche?


GP0 = ICSPDAT  Datapin
GP1 = ICSPCLK  Clockpin
GP3 = VPP  Voltage Input

und halt Vdd und Vss

von Thomas (Gast)


Lesenswert?

Ja, du brauchst 5 Pins:
Vpp (~12V)
V+ (~5V)
GND
Data
Clock

~ = ungefähr

von Thomas (Gast)


Lesenswert?

Zum programmieren und auch sonst viel zu PICs: sprut.de

von Florian K. (kraemer90)


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

von Florian K. (kraemer90)


Lesenswert?

so habe den Fehler jetzt gefunden. Habe mal mit dem Multimeter 
nachgemessen und gesehen, dass in der jetzigen Schaltung GP0 die 
Spannung gegen 0 zieht. Habe nun einfach statt dem Pullup einen Pulldown 
aufgesteckt und schon geht es :)

von Florian K. (kraemer90)


Angehängte Dateien:

Lesenswert?

So bin habe jetzt mal schnell einen Programmer geroutet, müsste so 
funktionieren laut Sprut und Datenblatt oder?

GND ist so verlegt, damit die Datenleitung von der Clockleitung 
abgeschirmt ist.

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.