Forum: Mikrocontroller und Digitale Elektronik Anfängerproblem PIC XC8 C


von Martin M. (ats3788)


Lesenswert?

void SetMatrix(void) {
const uint8_t PortGndStart = 2;
const uint8_t PortGndEnde  = 3;
const uint8_t PortLedStart = 4;
const uint8_t PortLedEnde  = 7;

      uint8_t PortGnd;
      uint8_t PortLed;

  //  for (PortGnd = PortGndStart; PortGnd >= PortGndEnde; PortGnd++) {
  //  for (PortLed = PortLedStart; PortLed >= PortLedEnde; PortLed++) {
  //  PORTC = PortLed = 1;
  //  __delay_ms(250);
  //  PORTC = PortLed = 0;
  //  }

    asm("CLRF PORTC");

//    if (PortGnd == PortGndStart) {
    asm("BSF  PORTC,2");


 //   PORTC = PortGnd   = 1;
 //   PORTC = PortGnd+1;
//    PORTC = 0;
//    } else {
    asm("BSF  PORTC,3");

//    PORTC = PortGnd+1;
//    PORTC = 1;
//    PORTC = PortGnd   = 0;

   //  }


   //   }

return;
}

Hallo Ich habe eine Funktion in C geschrieben und
der Compiler meckert nicht aber kompiliert sie auch nicht.
Die // habe ich später eingefügt und die asm mal Testweise eingefügt.
Meine Frage was ist an den for schleifen falsch und was bei der if 
Abfrage?
Danke

Vielleicht weiß jemand eine tolle Beschreibung über Microchip XC8 C

: Bearbeitet durch User
von Martin M. (ats3788)


Lesenswert?

OK ich raffe nun wo es liegt, ist genau umgekehrt wie in Pascal
es muss

for (PortGnd = PortGndStart; PortGnd <= PortGndEnde; PortGnd++) {
 for (PortLed = PortLedStart; PortLed <= PortLedEnde; PortLed++) {

heißen.

Hat trotzdem gute links um Microchip C zu lernen

von Chris B. (dekatz)


Lesenswert?

Um C zu lernen genügt jedes gute C-Buch. Die Compilerspezifischen Dinge 
stehen im Manual deines Compilers.
Hier gibt es ein allgmeines C-Tutorial:
http://pic-projekte.de/wiki/index.php?title=PIC_C_Tutorial

von B. S. (bestucki)


Lesenswert?

Martin Michael schrieb:
> Meine Frage was ist an den for schleifen falsch und was bei der if
> Abfrage?

for schleifen schreibt man normalerweise in folgender Form:
1
for(i=0;i<10;i++)

So sieht man auf den ersten Blick, dass die Schleife genau 10 Mal 
durchlaufen wird und i am Ende den Wert 10 hat. Dies wird hauptsächlich 
dazu verwendet, dass du folgendes machen kannst:
1
#include <stdint.h>
2
#define VALUE_SIZE 10
3
4
void foo(void){
5
  uint8_t i;
6
  uint8_t value[VALUE_SIZE];
7
8
  for(i=0;i<VALUE_SIZE;i++){
9
    value[i]=i; /* Gewuenschter Wert zuweisen */
10
  }
11
}

Wenn du dort i<=VALUE_SIZE schreibst, wird die Schleife 11 Mal 
durchlaufen und du greifst auf Speicherbereiche ausserhalb des Arrays 
zu. Wenn du so einen Murks machen willst, schreib eher i<VALUE_SIZE+1. 
Dann sieht man auf den ersten Blick, dass es deine Absicht ist, die 
Schleife 11 Mal durchlaufen zu lassen und nicht versehentlich <= statt < 
geschrieben hast.


Noch was: Wenn du deinen Code richtig einrückst, kann man ihn besser 
lesen und verstehen, auch du selbst.

von Martin M. (ats3788)


Lesenswert?

Ja Danke
Aller Anfang ist schwer, aber so langsam
bekomme ich das hin.

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.