Forum: Mikrocontroller und Digitale Elektronik PIC LED mit Taster schalten


von Benjamin B. (benbu)


Lesenswert?

Moin zusammen,
Ich muss mal eine Dumme Frage stellen.
Ich habe bereits einige Foren und Internetseiten angesehen.
Gefühlt schreibt jeder etwas anderes zur PIC Programmierung. (Stichwort 
LATx, PORTx, ANSx)
Ich mache gerade einen Wechsel von AVR zu PIC und auch von Assembler zu 
C. Ich wollte mit einem Taster einfach erst mal eine LED einschalten. 
Aber egal welche kombinationen aus den verschiedenen Foren ich nutze. 
Nichts funktioniert. Vielleicht könnt ihr mir das mal einfach an meinem 
Beispiel erklären.
(Ich nutze den PIC16F18344)
Hier der Code, der einfach nicht laufen will.
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <xc.h>
4
5
void main(void) {
6
     TRISCbits.TRISC0 = 0;  //Ausgang
7
     TRISBbits.TRISB6 = 1;  //Eingang
8
     while (1){
9
10
         if (PORTBbits.RB6 == 1){    //Wenn Pin HI
11
             LATCbits.LATC0 = 1;    //LED an 
12
         }
13
         else {                     // sonst 
14
             LATCbits.LATC0 = 0;    // LED aus
15
         }
16
17
     }
18
    return;
19
}

Viele Grüße

von bingo (Gast)


Lesenswert?

Du musst die Ports erst mal initialisieren, wie, das steht im Datenblatt 
auf S.139 unter Example 12-1 (da für Port A)

von Benjamin B. (benbu)


Lesenswert?

OK und da wird das Datenblatt etwas undurchsichtig. Mein Compiler kann 
diese Befehle nicht übersetzen. Fpr mich sieht das auch sehr nach 
ASSEMBLER aus.
1
BANKSEL PORTA ;
2
CLRF PORTA ;Clear PORTA
3
BANKSEL LATA ;Data Latch
4
CLRF LATA ;
5
BANKSEL ANSELA ;
6
CLRF ANSELA ;digital I/O
7
BANKSEL TRISA ;
8
MOVLW B'00111000' ;Set RA<5:3> as inputs
9
MOVWF TRISA ;and set R

kannst du mir das in C geben?

von Dirk F. (Gast)


Lesenswert?

Teste doch erst mal, ob der Prozessor läuft und ob die LED eingeschaltet 
wird.
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <xc.h>
4
5
void main(void) {
6
     TRISCbits.TRISC0 = 0;  //Ausgang
7
     TRISBbits.TRISB6 = 1;  //Eingang
8
      while (1)
9
        {
10
               LATCbits.LATC0 = 1;    //LED an
11
        }


Wenn ja, dann ist der Eingangsping noch auch analog gestellt. Umstellen 
auf Digitaleingang.

von Dirk F. (Gast)


Lesenswert?

CLRF ANSELA ;digital I/O

in C:

ANSELA = 0;

Du musst aber Port B umstellen:
ANSELB = 0;

von Sstudi (Gast)


Lesenswert?

Alle GPIOs welche als Eingänge konfiguriert werden, sind per default 
analog.

Die analog Konfiguration wird über die ANSELx Register gesetzt.

M.m.n. fehlt einzig folgende Anweisung:
1
ANSELB = 0x00; // PORTB digitale Eingänge

Möchtest du nur einen GPIO als digitalen Eingang nutzen, kannst du auch 
über die Struktur einzelne GPIOs konfigurieren:

1
ANSELBbits.ANSELB0 = 0x00; // PB6 als digitalen Eingang nutzen

von Benjamin B. (benbu)


Lesenswert?

OK ich habe das jetzt mal ausprobiert...
Meine LED blinkt jetzt dauerhaft im sekunden Takt :D... ich weiß nur 
nicht warum.
hier der Code:
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <xc.h>
4
5
void main(void) {
6
    
7
    PORTB = 0;
8
    LATB = 0;
9
    ANSELB = 0;
10
    TRISB = 0;
11
    
12
    PORTC = 0;
13
    LATC = 0;
14
    ANSELC = 0;
15
    TRISC = 0;
16
17
    TRISBbits.TRISB6 = 1;  //Eingang
18
    TRISCbits.TRISC0 = 0;  //Ausgang
19
     while (1){
20
         
21
         
22
             LATCbits.LATC0 = 1;    //LED an 
23
     }
24
    return;
25
}

von Dirk F. (Gast)


Lesenswert?

Evtl. ist der Watchdog eingeschaltet.
Configuration bits überprüfen

von Benjamin B. (benbu)


Lesenswert?

Dirk F. schrieb:
> Evtl. ist der Watchdog eingeschaltet.
> Configuration bits überprüfen

Ja stimmt Danke.
... euch allen das hat mich gerade viel weiter gebracht.

von Sstudi (Gast)


Lesenswert?

Dirk F. schrieb:
> Evtl. ist der Watchdog eingeschaltet.
> Configuration bits überprüfen

Ja, die scheinen zu fehlen. Weiss gerade nicht, wie die default Werte 
sind.

Code für die Configuration Bits kannst du in MPLABX generieren und in 
deine Datei kopieren:

https://microchipdeveloper.com/mplabx:view-and-set-configuration-bits

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.