I/O Programmierung mit C am PIC 18F2550

Gast #2419242
Lesenswert?

Hallo,

ich bin ein absoluter Neuling auf dem Gebiet der PIC-Programmierung. 
Mit C habe ich schon kleine Erfahrungen.

Ich möchte einen PIC 18F2550 mit C programmieren und habe mir einen 
kleine Testplatine aufgebaut.

Ich habe es geschafft mit MPLAB einen C-Code zu schrieben, der Ausgänge 
gezielt ansteuert (8 Dioden an Port B)
An RA0 ist soll ein Eingang definiert werden.

Was nicht funktioniert ist die Deklarierung der Eingänge.

Kann mir da jemand helfen? Habe gefühlt schon das halbe Internet 
gelesen.

Ich hänge mal mein kleines Testprogramm hier an.

Vielen Dank für eure Hilfe.

//Includes
#include <p18f2550.h>
#include "delays.h"

//Config

#pragma config PLLDIV   = 5       // (20 MHz input)
#pragma config PWRT = ON
#pragma config BOR = OFF
#pragma config WDT = OFF
#pragma config LVP = OFF

//defines
#define  LED1   LATBbits.LATB0
#define  LED2   LATBbits.LATB1
#define  LED3   LATBbits.LATB2
#define  LED4   LATBbits.LATB3
#define  LED5   LATBbits.LATB4
#define  LED6   LATBbits.LATB5
#define  LED7   LATBbits.LATB6
#define  LED8   LATBbits.LATB7
#define  EIN  LATAbits.LATA0


//Declaration
#pragma code
void main (void)
{
  int i=100;
  int j=0;
  TRISA=1; //PORTA - Eingang???
  TRISB=0; //PORTB - Ausgang
  PORTB=0; //Ausgänge ausschalten


// zur orientierung, ob sich das Programm geändert hat und ob überhaupt 
etwas läuft
  LED1=0;
  LED2=0;
  LED3=0;
  LED4=0;
  LED5=0;
  LED6=0;
  LED7=0;
  LED8=0;


while(1)
  {
    LED1 = 1;
    LED2 = 0;
    Delay10KTCYx(i); //warten
    LED1 = 0;
    LED2 = 1;
    Delay10KTCYx(i); //warten
  if (EIN == 1)  // schnelle Blinken wenn Schalter betätigt
  {
    LED3=1;
    i=100;
    LED4=0;
  }
  else
  {
    i=1000;
    LED4=1;
    LED3=0;
  }

  if (EIN == 0) // LED5 ist aus, wenn Schalter gedrückt
  {
    LED5=1;
    LED6=0;
  }
  else
  {
    LED6=1;
    LED5=0;
  }

  }
LED7=1;

}
Gast #2419265
Lesenswert?

pic-projekte.de Da auf Wiki, und dann auf PIC C Tutorial.
Sorry gibt keinen Direktlink.

Noch zu deinem Problem, das mit LATA = 1; stimmt schon soweit.
Wie ist deine Hardwarebeschaltung für den Eingang auf deinem Board ?

Und ich würde wenn es mit Eingängen noch garnicht geht, ein etwas 
einfacheres Programm stricken, um das mit den Eingängen zu testen. z.B:

Lg Tim


while(1)
{
  if(EIN==1)
    {
    LED1=1;
    }
  else
    {
    LED1=0;
    }
}
Gast #2419359
Lesenswert?

Hey, also die Hexzahl stellt follgendes dar:
0x80 = 0b10000000
Das bedeutet, das nur auf Port B das Bit 0 ein Eingang ist, und alles 
andere ein Ausgang.
Bei dir ist alles auf Port A ein Eingang, und alles auf Port B ein 
Ausgang.

LG Tim
Gast #2419903
Lesenswert?

Ich glaube, da fehlt noch etwas in dieser Art:
1
  adcon1 = 0b00001111;
Insbesondere Port A hat einige Bits, die per Default Spezialfunktionen 
haben, wenn man die nicht abschaltet. Der Wert 0b1111 passt für den 
18f2580; du müsstest noch nachschauen, was der 2550 hier braucht. 
Vielleicht 0b111.

-- Ulrich
Gast #2420519
Lesenswert?

>0x80 = 0b10000000
>Das bedeutet, das nur auf Port B das Bit 0 ein Eingang ist, und alles
>andere ein Ausgang.

Leider Falsch.  Nicht Bit0 sondern Bit7.

Bei PIC uCs haben Analog funktionen priorität.  d.h. mann muss alle 
Analog Peripherie erstmal deaktivieren (ADC, Komparatoren, usw...).

Ansonsten wie schon gesagt.

Und LATx benutzt mann für Ausgänge, PORTx für Eingänge.

z.B. :
#define  LED1   LATBbits.LATB0
#define  EIN    PORTAbits.PORTA0

Wenn alles richtig eingestellt ist sollte es dann klappen.

Viel glück.

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