PIC16F88 - Taster-Eingabe wird nicht erkannt

Gast #2453961
Lesenswert?

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
}
Angehängte Dateien:
Gast #2454271
Lesenswert?

OK nach dem ich das Debbuging mit dem PICKit3 zum laufen gebracht habe 
und nochmal die PORT Funktionen angeschaut habe konnte ich das Problem 
beheben.

PortA war noch auf Analog I/O  eingestellt nach dem clearen des ANSEL 
Registers funktioniert es nun.
Gast #2454366
Lesenswert?

Der PIC16F88 ist der Nachfolger des PIC-Urahns 16F84 und hat selbst 
schon wieder einige Jahre auf dem Buckel. Der Nachfolger zum 16F88 ist 
der 16F1847, der ist pin- und funktionskompatibel, hat mehr und 
schnellere Hardware, hat XLP, ist für "C" optimiert  und kostet auch 
noch wesentlich weniger.

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