Forum: Mikrocontroller und Digitale Elektronik PIC16F88 - Taster-Eingabe wird nicht erkannt


von wottis (Gast)


Angehängte Dateien:

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
}
von frozen eye (Gast)


Lesenswert?

Den Port RA kennt Dein Compiler vermutlich nicht.
Versuch mal PORTA2 oder PORTA.2

In ASM wäre es PORTA, 2
von wottis (Gast)


Lesenswert?

Die Ports kennt er schon, weil die hab ich aus dem entsprechenden 
Header-File und für RA0 u. RA1 funktioniert es ja auch.
Was noch eine Variante ist PORTAbits.RA2 aber das bringt auch nichts.
von wottis (Gast)


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.
von tt2t (Gast)


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.
von wottis (Gast)


Lesenswert?

Danke für den Hinweis tt2t.
Muss mich aber bisschen mit dem beschäftigen, weil wir an der Hochschule 
damit arbeiten.
von tt4u (Gast)


Lesenswert?

Man sollte auch noch die Komparatoren abschalten:

     movlw   b'00000111'
     movwf   CMCON           ; Comparators off
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.