Antworten

Der Beitrag verursachte die folgenden Fehler, die behoben werden müssen:
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.
Einschränkungen: 8 pro Beitrag (8 verbleibend), maximale Gesamtgröße 8,79 MB, maximale Individualgröße 1 MB
Entfernen Sie den Haken der Dateianhänge, die gelöscht werden sollen
Klicken Sie hier oder ziehen Sie Dateien hierher, um sie anzuhängen.
Anhänge und andere Optionen
Verifizierung:
Bitte lassen Sie dieses Feld leer:
Geben Sie die Buchstaben aus dem Bild ein
Buchstaben anhören / Neues Bild laden

Geben Sie die Buchstaben aus dem Bild ein:

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

Zusammenfassung

Autor pic18
 - 12.11.2023, 00:23:15 CET
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;
}
Autor wlfmario
 - 11.11.2023, 17:10:53 CET
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);
        }
 
Autor pic18
 - 10.11.2023, 23:06:09 CET
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
Autor pic18
 - 10.11.2023, 22:41:24 CET
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.

Autor wlfmario
 - 10.11.2023, 20:08:22 CET
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);
    }
}
}

Autor PICkel
 - 10.11.2023, 12:34:32 CET
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
Autor PICkel
 - 10.11.2023, 10:24:25 CET
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
Autor Ottmar
 - 10.11.2023, 09:53:51 CET
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



Autor Peter
 - 09.11.2023, 20:54:16 CET
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.
Autor wlfmario
 - 09.11.2023, 18:30:08 CET
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.

Similar topics (5)