PIC LED mit Taster schalten

OP #6548701
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
OP #6548728
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?
Gast #6548733
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.
Gast #6548740
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
OP #6548741
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
}

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