avatar_wlfmario

PIC 18F14K22 Button Problem

Begonnen von wlfmario, 09.11.2023, 13:15:24 CET

Vorheriges Thema - Nächstes Thema

wlfmario

Jetzt wird es peinlich !  :o

ich versuche mich seit Gestern mit den Basic's beim PIC18FK22 und einen einfachen Button.
Leider bringen mich diese paar Zeilen Code zur Verzweifelung.

Es ist eine ganz einfache Schaltung die ich beim AVR schon X-mal gemacht habe.
von VSS über 10K zum Button >> GND.
Wenn der Button gedrückt wird, gehen ca. 4,6V an den PIN RB5.

Nur leider reagiert der MC nicht wenn ich den RB5 abfrage egal was ich mache.
Gibt es beim PIC etwas zu beachten ? Oder bin ich nur betriebsblind ?
Das Datenblatt brachte bei der Fehlersuche keine große Hilfe.
Evtl. seht ihr den Fehler oder habt Tipps.

Gruß Mario 

#include <xc.h>
#include"PIC18F14K22_config.h"

#define _XTAL_FREQ 1000000U

void main(void) {

    TRISB = 0b00100000; // RB5 Input, RB6 & RB7 Output.
    PORTB = 0b11000000; // RB6 & RB7 LED aus.

    while (1) {
        if (PORTBbits.RB5 == 1) {
            LATBbits.LATB6 = 1;
            
        } else {
            // Mach was anderes.
        }
    }
    return;
}

Peter

Du hast den Port nicht auf digital gesetzt.
Müsste hier das ANSEL Register sein.
Like Like x 1 View List

wlfmario

Zitat von: Peter in 09.11.2023, 13:29:16 CETDu hast den Port nicht auf digital gesetzt.
Müsste hier das ANSEL Register sein.

Ich merke schon, alles etwas anders als bei den AVR's.
Dann werde ich mal das Datenblatt bemühen und gucken wie ich das machen muss.

Danke erst mal für den Hinweis.

Peter

Was ich jetzt nicht gefunden habe in der schnelle ist wie der Pic seine Ports beim starten gesetzt hat.
Es kann sein das die Ports schon auf digital sind, dann brauchst du das ANSEL Register nicht nochmal zu
setzten. Kann aber nicht schaden dann weist du sicher das die Ports auf digital sind.
Benutzt du denn einen externen Quarz von 1 MHz ? Denn so hast du ihn eingestellt. Wenn du keinen Quarz
benutzt dann musst du den internen Quarz konfigurieren.
Like Like x 1 View List

Ottmar

Hi,
Bei Initialisierung der Pic's sind alle Portpins hochohmig  als Inputs gesetzt und werden dann je nachdem, per Code von diesem Zustand ausgehend explizit auf digital oder analog gesetzt.
Ottmar



Like Like x 1 View List

PICkel

Hallo,

setze mal ANSELB = 0;  // gesamter PORTB ist digitaler Input.

Alternativ; ANSELB = 0b11011111; // nur PORTB.5 ist digitaler Input, Rest ist analog
Vorgabe beim Start ist ANSELB = 255, also analog.

Gruß
PICkel
Like Like x 1 View List

PICkel

#6
Zitat von: PICkel in 10.11.2023, 10:24:25 CETsetze mal ANSELB = 0;  // gesamter PORTB ist digitaler Input.

Entschuldigung, habe Mist erzählt!
Beim 18F14K22 gibt's nur ANSEL und ANSELH.
ANSELH = 0 setzt PORTB.5 und PORTB.4 sowie PORTC.7 und PORTC.6 auf digital.

Übrigens: Das Prog schaltet nur einmalig PORTB.6 ein!
In den ELSE-Zweig gehört noch
LATBbits.LATB6 = 0;

PICkel
Like Like x 1 View List

wlfmario

Ich danke erst mal euch allen für die Hilfe, es lag tatsächlich an den Digitalen (Besser Analogen) I/O an RB5.
Es Funktioniert jetzt alles so wie es soll, ich hefte das Script mal als Quellcode an.
Es ist zwar nur ein sehr simples Script, aber evtl. hilft es den Ein oder Umsteiger in der PIC-Welt bei der Suche etwas.

Gruß Mario

#include <xc.h>
#include"PIC18F14K22_config.h"  // Konfigurations Bits

#define _XTAL_FREQ 1000000UL    // Int. Oszillator 1 Mhz.

// Funktions Definition.
void wechselblinken(void);

void main(void) {

    ANSELH = 0; // ANSEL Register alles auf Digital I/O
    TRISB = 0b00100000; // TRISB Register RB5 Eingang, Rest Ausgang I/O 
    PORTB = 0b00000000; // PORTB Alles Low. (Je nach Anschluss von VSS an der LED)

    while (1) {
        if (PORTBbits.RB5 == 0) {
            wechselblinken();

        } else {
            LATBbits.LB6 = 0;
            LATBbits.LB7 = 0;
        }
    }
    return;
}

// Funktionen.
void wechselblinken(void) {
    for (int i = 0; i < 5; i++) {
        LATBbits.LB6 = 1;
        __delay_ms(500);
        LATBbits.LATB6 = 0; // Das geht auch kürzer :) bsp: PORTB ^= (1 << 6); 
        __delay_ms(500);
        LATBbits.LB7 = 1;
        __delay_ms(500);
        LATBbits.LATB7 = 0;
        __delay_ms(500);
    }
}
}


pic18

ZitatPORTB ^= (1 << 6);
^ bedeutet doch xor, mit PORTB ^= (1 << 6) müßte dann Bit 6 gedreht werden, es wird aber nicht immer auf Null gesetzt.

Like Like x 1 View List

pic18

ich habe gerade etwas gerechnet, Bit 6 auf Null setzen kann so gemacht werden;
x &= (~(1<<6));
x &= 0xbf; // so lösche ich das Bit 6
Like Like x 1 View List

wlfmario

Es ist ja die Anweisung um Bits zu toggeln !
Der Kommentar bezog sich nicht nur auf die eine Zeile.

bsp. ein Lauflicht das eine LED (Bit) einschaltet, (setzt) und danach aufschaltet. (hier für ein Atmega).

for (i = 0; i < 8; i++) {
            PORTD ^= (1 << i);
            _delay_ms(100);
            PORTD ^= (1 << i);
        }
 

pic18

Ein Lauflicht würde ich aus dem Stehgreif so programmieren, der Programmablauf ist etwas anders, ich schiebe nur das gesetzte Bit weiter und drehe nicht die einzelnen Bits.
unsigned char i;
PORTD=0x01;
for (i=0;i<8;i++){
  _delay_ms(100);
  PORTD <<=1;
}
Like Like x 1 View List

Schnellantwort

Achtung: In diesem Thema wurde seit 120 Tagen nichts mehr geschrieben.
Wenn Sie nicht absolut sicher sind, dass Sie hier antworten möchten, starten Sie ein neues Thema.

Name:
Tastenkürzel: Alt+S Beitrag schreiben oder Alt+P für Vorschau

Similar topics (5)