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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.