Forum: Mikrocontroller und Digitale Elektronik Einstieg in die µController-Programmierung


von Wa'el S. (josephil)


Lesenswert?

Hallo allerseits,
ich bin ein neuer Mitglied des Forums und bräuchte eure Hilfe.
ich bin ein Neuling in Sache µController Programmierung und versuche 
gerade ein Programm zu schreiben, in dem ein Ein- und Ausgang eines 
PIC16f676 angesteurt werden. Ich benütze die MPLAB, den Hi-Tech Compiler 
und den MPLABSIM, um das Programm zum Laufen zu bringen. Die Übrseztung 
klappt ich kann aber den Zustand der Ein- und Ausgänge nicht 
beeinflüssen.
Dies sehe daran, wenn ich den File Registers aufmache.
mein Code lautet:
------------------------------------------------------------------------ 
--
#include <hitech.h>

#include <htc.h>


int i ;
void main(void)

{ // Initialisierungen
  PORTA = 0;   // PortA intialisieren
  PORTC = 0;  // PortB intialisieren
  ANSEL = 0;   // Umschaltung auf D I/O
  WPUA = 1;  // Weak pull up PortA als Eingänge initialisieren
  CM0 = 1;   // Comperatoreingang + (RA0)
  CM1 = 1;  // Comparatoreingang - (RA1)
  CM2 = 1;  // Comparatoraudgang, Comparatorpins = 111 -> Umschaltung 
auf D I/O */ (RA2)
  TRISA5 = 1; // PortAbit.0 als Eingang initialisieren
  TRISC0 = 0; // PortAbit.0 als Ausgang initialisieren
  RA0 = 1;  // PortAbit.0 auf 1 setzen

// Hauptschleife
  while(1)
  {
    if (!RA0)
    {
    while( i<100 ) // es wird  bis 100 incrementirt
      {
      i++; // i Wert der Variablen wird um 1 erhöht
      }
    RC0 = 0; // nach Ablauf des Zählens wird der Ausgangsbit.0 vom PortA 
auf Lowpegel setzen
    i = 0;
    }
    else RC0 = 1; // Ausgangsbit.0 vom PortA auf Highpegel setzen
  }
}
------------------------------------------------------------------------ 
-
ich danke euch für eure Hilfe im Voraus und werde meinen Beitrag 
leisten, mein Wissen weiter zu geben.

von holger (Gast)


Lesenswert?

>  TRISA5 = 1; // PortAbit.0 als Eingang initialisieren

Wenn du RA0 möchtest ist die 5 da wohl falsch.

von Severino R. (severino)


Lesenswert?

Wa'el Shamshoum wrote:
>   TRISA5 = 1; // PortAbit.0 als Eingang initialisieren
>   TRISC0 = 0; // PortAbit.0 als Ausgang initialisieren
>   RA0 = 1;  // PortAbit.0 auf 1 setzen
RA0 ist aber ein Eingang (per Default)

>     RC0 = 0; // nach Ablauf des Zählens wird der Ausgangsbit.0 vom PortA
> auf Lowpegel setzen
hier wird aber RC0 auf 0 gesetzt

>     else RC0 = 1; // Ausgangsbit.0 vom PortA auf Highpegel setzen
und hier auf 1, aber es immer noch PortC

> ich danke euch für eure Hilfe im Voraus und werde meinen Beitrag
> leisten, mein Wissen weiter zu geben.
Danke

von holger (Gast)


Lesenswert?

>RA0 ist aber ein Eingang (per Default)

Und der Komparatoreingang. Er sollte
die vielen falschen Kommentare mal anpassen.
Sonst weiss man ja nicht mehr was verwendet
werden sollte oder nicht. Stimmt der Kommentar
oder der Code davor?

von Wa'el S. (josephil)


Lesenswert?

ich danke euch allen für die Antworten,
ja, es gibt einiges zu ändern.....

von Wa'el S. (josephil)


Lesenswert?

Hallo alle zusammen,

ich habe den Programmcode verbessert und möchte damit eine Diode über 
einen Taster ein- und ausschalten.Zum Emmulieren benutze ich den ICE 
2000.
Die Diode soll bei Loslaseen des Tasters leuchten, also bei neg. Flanke. 
So habe ich versucht eine neg. Flanke zu nachprogrammieren. Dies 
funktioniert nur im Animation-Modus. Sobald ich aber auf Run umschalte, 
leuchtet die Diode für ca. 1..2s und schaltet sich wieder aus, wenn die
Schleife für das Einaschlaten durchlaufen wurde. Der Programmcode 
lautet:

#include <hitech.h>
#include <htc.h>
#define Taster_1 RA5  // Taster ist der symbolische Name des Pin 
RA5-PORTA, Taster offen -> RA5 = 1
#define LED  RC0      // LED ist der symbolische Name des Pin RC0-PORTC, 
LED = 1 -> LED leuchtet
bit Merker1;
bit Merker2;
bit Merker3;
int i;
void main(void)

{ // Initialisierungen
PORTA = 0b00000000; // PortA intialisieren
PORTC = 0b00000000; // PortC intialisieren
ANSEL = 0; // Pins auf Digital I/O umschalten
CMCON = 0b00000111; // Pins Comperator-Modus auf Digital I/O umschalten
INTCON = 0b00000000;
WPUA = 0b00000000;
TRISA5 = 1; // PortAbit5 als Eingang initialisieren
TRISC0 = 0; // PortCbit0 als Ausgang initialisieren
Merker1 = 0; // Abfrage der Pegelvergangenheit des Tasters zum 
Einschalten der Diode
Merker2 = 0; // Abfrage des jetzigen Pegelzustands der Diode ( Merker2 = 
0 -> Diode ist ausgeschaltet )
Merker3 = 0; // Abfrage der Pegelvergangenheit des Tasters zum 
Ausschaltenschalten der Diode
i = 0; //Zählervariable

// Hauptschleife
while(1)
{

  while((!Taster_1 || Merker1) && !Merker2)
    {
    while (i<10000)
      {
      i++;
      }
      if(Taster_1)
      {
      Merker1 = 1;
      }
      if(Taster_1 && Merker1)
      {
      LED = 1;
      Merker1 = 0;
      Merker2 = 1;
      i=0;
      }
      while (i<10000)
      {
      i++;
      }
      i=0;
    }

  /*  while((!Taster_1 || Merker3) && Merker2)
      {
      while (i<10000)
        {
        i++;
        }
        if(Taster_1)
        {
        Merker3=1 ;
        }
        if (Taster_1 && Merker3)
        {
        LED = 0;
        Merker2 = 0;
        Merker3 = 0;
        i=0;
        }
        while (i<10000)
        {
        i++;
        }
        i=0;
      }*/

  }
}

Nachdem ich die Schleife für das Ausschalten auskommentiert habe, 
stellte ich fest, dass die Diode sich trotzdem ausschaltet. Vieleicht 
kann jemand mir weiterhelfen.
Ich danke euch im Voraus.....

von Peter D. (peda)


Lesenswert?

Wa'el Shamshoum wrote:
1
>     while (i<10000)

Kannst Du mal begründen, wie Du gerade diesen Wert 10000 berechnet hast?
Pi*Daumen Programmierung sollte man sich garnicht erst angewöhen, das 
ist evil.

Dein Programm scheint rudimentär irgendwie Entprellen zu sollen mit 
CPU-Zeitvernichtungsschleifen.

Leider gibt es aber schon einwandfrei funktionierende, kurze und 
universelle Entprellroutinen, da hat man wenig Lust, sich immer wieder 
noch durch solche Anfängerschritte durchzuwuseln.

Ich würde Dir daher raten, machs gleich richtig.
Einem Baby soll man ja auch nicht erst ne Babysprache beibringen, 
sondern gleich richtig zu sprechen, sonst muß es doppelt lernen.


Peter

von Wa'el S. (josephil)


Lesenswert?

Herr Dannegger,
Danke für deine äußerst NETTE Antwort scheinbar bist du von Geburt auf 
der Super makellloser Programmierer, was ich absolut bezweifle, also es 
wäre  angebrachter, wenn du sachlich bleibst und nicht philosophierst. 
Dies beantwortet aber nicht meine Frage. Das heißt abgesehen davon ob 
ich den Taster, aus deiner Sicht, richt entprelle oder nicht.
Ich hoffe, dass die Sachlichkeit und andere Tugend in deinen Lexika noch 
vorhanden sind.....

von Peter D. (peda)


Lesenswert?

Wa'el Shamshoum wrote:
> Herr Dannegger,
> Danke für deine äußerst NETTE Antwort scheinbar bist du von Geburt auf
> der Super makellloser Programmierer, was ich absolut bezweifle, also es
> wäre  angebrachter, wenn du sachlich bleibst und nicht philosophierst.

Ich nehme mir eben die Freiheit auch mal zu philosophieren auf die 
tausendste ähnlich gelagerte Frage. Solche Posts sieht man hier ja alle 
Tage.

Ich vermute, Du hast keinen Ablaufplan gemacht, sondern einfach so 
angefangen das Programm runterzuschreiben (es sieht jedenfalls ganz 
danach aus).
Versuch mal die Forenformatierung zu verwenden, damit man die 
Einrückungen sieht (oder als Anhang posten).
Versuch mal nicht so phantasielose Veriablen (Merker 1..1000) zu 
verwenden, sondern der Bedeutung entsprechend.
Versuch mal die Zeilen zu kommentieren, was sie machen (ist auch für 
Dich besser, um Deinen Code selber zu verstehen).


> Dies beantwortet aber nicht meine Frage.

Du beantwortest ja auch nicht meine Frage, wie Du die 10000 berechnet 
hast.


Ne allgemeine Bemerkung:
Hast Du den Watchdog ausgeschaltet?
Der könnte Dir die LED wieder ausschalten.


Peter

von Wa'el S. (josephil)


Lesenswert?

Hallo Peter,

dank für deinen Rat, ich werde die übrigen Zeilen weiterkommenteiren
und es lag tatsächlich an dem Watchdog.
Die 10000 sind willkürlich gewählt worden, um den Taster zu entprellen.
Ich werde aber später den Timer benützen und eine Entprellung von ca. 
20ms erreichen ( Erfahrungswert anderer Programmierer).

Gruß Wa'el

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.