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
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
> ;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.
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
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 |
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 :)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.