Hallo miteinander! Ich möchte mich gerne mit dem PIC16F88 vertraut machen und dessen Programmierung in C und ASM. In einem ersten Laborversuch hab ich einen Lottozahlengenerator mit Flowcode erstellen müssen mit dem passenden Schaltplan (im Anhang). Das funktioniert auch alles soweit. Jedoch soll das Ganze auch in ASM u. C geschrieben werden. Was ich also zur Zeit versuche ist das bei Betätigen des Tasters SEG1 (obere 7-Segment-Anzeige im Schaltplan) aus geht und SEG2 an. Nun ist aber das Problem, dass die Änderung an Port A2 nicht erkannt wird. Weiterhin ist bei Start des Programms button = 0 anstelle von 1, weil dieser ja egtl an einem Pullup hängt. Die Verbindung mit dem Taster auf meinem PIC-Demo Board stimmt auch bei Betätigung zieht er die Spannung an A2 auf 0V aber es wird vom Programm nicht erkannt. Meine Frage ist also wieso ist button = 0 zu Beginn des Progammstarts und warum wird die Änderung an Port A2 nicht erkannt. Habe schon viel gelesen und versucht und finde einfach nicht mein Fehler. Die Segmente an ausschalten ist ja kein Problem aber der Taster ;(. Das Programm und der Schaltplan befinden sich im Anhang. MFG wottis
1 | /* Präprozessor */
|
2 | /* ############ */
|
3 | #include "htc.h" |
4 | #include "pic.h" |
5 | #include "stdlib.h" |
6 | #include "delay.c" |
7 | #define SEG1 RA1
|
8 | #define SEG2 RA0
|
9 | #define Taster RA2
|
10 | |
11 | /* Konfiguration des PCIs
|
12 | *
|
13 | * WDTE_OFF - Watchdogtimer off
|
14 | * PWRTE_ON - Power-on Timer on
|
15 | * FOSC_INTOSCIO - Interner Taktgeber 8MHz
|
16 | * MCLRE_OFF - Master Clear off
|
17 | */
|
18 | |
19 | __CONFIG(WDTE_OFF & PWRTE_ON & FOSC_INTOSCIO & MCLRE_OFF & LVP_OFF); |
20 | |
21 | |
22 | /* Unterfunktionen deklarieren */
|
23 | /* ########################### */
|
24 | void init(); // initialisiere SFR's |
25 | void check(); // überprüft RA2 und speichert Status inn button |
26 | |
27 | unsigned char button; |
28 | |
29 | int main(void) |
30 | {
|
31 | init(); |
32 | while(1) // Mainloop |
33 | {
|
34 | check(); |
35 | |
36 | while(button == 1) // wenn Taster nicht betätigt wurde |
37 | {
|
38 | SEG1 = 0; // SEG1 soll leuchten |
39 | RA0 = 1; |
40 | PORTB = 0b10010001; |
41 | check(); // prüfe RA2 |
42 | }
|
43 | while(button == 0) // wennn Taster betätigt wurde |
44 | {
|
45 | SEG2 = 0; // SEG2 soll leuchten |
46 | SEG1 = 1; |
47 | PORTB = 0x10; |
48 | check(); // prüfe RA2 |
49 | }
|
50 | }
|
51 | |
52 | return 0; |
53 | }
|
54 | |
55 | |
56 | void init() |
57 | {
|
58 | OSCCON = 118; // 8MHz interner Takt |
59 | TRISB = 0x00; // PortB auf Ausgang |
60 | TRISA = 0b00000100; // A2 als Eingang und Rest Ausgang |
61 | PORTB = 0x00; // clear PortB |
62 | PORTA = 0x00; // clear PortA |
63 | SEG1 = 1; // Segment 1 u. 2 aus |
64 | SEG2 = 1; |
65 | }
|
66 | |
67 | void check() |
68 | {
|
69 | button = RA2; |
70 | DelayMs(100); |
71 | }
|
