Forum: Mikrocontroller und Digitale Elektronik I/O Programmierung mit C am PIC 18F2550


von Hobby-Pic (Gast)


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;

}

von Tim (Gast)


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;
    }
}

von Hobby-Pic (Gast)


Lesenswert?

Die Schaltung ist folgende

- 5V über Taster auf RA0
- 10kOhm zwischen RA0 und 0V

von Hobby-Pic (Gast)


Lesenswert?

Auf pic-projekte.de ist die Rede von

"TRISB = 0x80;          //So stellt man I und O ein"

Wie ist das mit der Hexadezimalzahl zu interpretieren?

von Tim (Gast)


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

von Hobby-Pic (Gast)


Lesenswert?

Ah. Ok.

Danke.

Trotzdem funktioniert es nicht.

Viele Grüße,

Sebastian

von Hobby-Pic (Gast)


Lesenswert?

Es muss

#define  EIN    PORTAbits.RA0

statt

#define  EIN  LATAbits.LATA0

heißen

von pic gast (Gast)


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

von PICfan (Gast)


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.

von Tim (Gast)


Lesenswert?

Ah, LOL, schon wider so ein doofer Fehler ;) Wie oft, immer vertausche 
ich es ;) Danke dir dür den Hinweis !

LG Tim

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.