- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 8 von 8

Thema: Anfängerquellcode zum Thema Array

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    26.06.2005
    Ort
    Gäufelden
    Alter
    39
    Beiträge
    111
    das mit dem Arrays initialisieren ist gut . Dann kann ich mir das nächstes mal Sparen.

    Das
    p[x]=PINA&(1<<(PINA+x));
    soll eigentlich nacheinander jeden einzelnen Pin von PortA abfragen und den dann in ein weiteres Array speichern. Also beim ersten schleifendurchlauf soll quasi
    p[0]=PINA&(1<<(PINA0)); sein, das also der Wert von PINA0 ins Array gespeichert wird.

    Ist da ein Denkfehler dabei?

    Gruß

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Besser wäre es so:

    p[x]=PINA&(1<<x); // für x von 0 bis 7

    Die 1 wird x-mal nach links geschoben. Oder noch knapper:

    char p, v=0b01010101;

    p=PINA;
    for (n=0; n<8; n++){
    if((v & (1<<n)) == (p & (1<<n)){

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.02.2013
    Ort
    Graz
    Beiträge
    211
    Zitat Zitat von radbruch Beitrag anzeigen
    p[x]=PINA&(1<<x); // für x von 0 bis 7
    Dann kommt bei Übereinstimmung 2^x ins array, und nicht 1, oder?

  4. #4
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Stimmt. Dann muss wohl eher sowas formuliert werden:

    p[x]=(PINA >> x) & 1;
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    26.06.2005
    Ort
    Gäufelden
    Alter
    39
    Beiträge
    111
    ich habe das jetzt mal nachvollzogen und habe meinen Code angepasst und siehe da, schon läufts. Jetzt habe ich mir Gedanken darum gemacht wieso das jetzt läuft.
    Stimmt das wenn ich mir das wie folgt vorstelle:

    Der Code lautet
    for(x=0; x<8; x++
    { p[x]=PINA>>x)&1;
    }

    PortA sei einfach mal 10101010 und X läuft von 0-7. Verglichen wir das mit der Binärzahl 00000001. Bei x=0 wird PortA nicht verändert. Also vergleiche ich

    10101010
    00000001
    -----------
    00000000

    Das Ergebnis ist also = und wird als Zahl in p[0] gespeichert. Für die nächste Schleife x=1 wird PortA um 1 Verschoben, es vergleicht also wie folgt:

    11010101
    00000001
    -----------
    00000001
    und Somit kommt in p[1]=1. Und das geht dann halt bis X=7 so weiter.

    Stimmt das? Ich glaube ich muss mir in Zukunft öffter diese bildchen malen, da wird einem doch einiges klarer.

    Vielen Dank an alle!
    Geändert von Jeti (30.03.2013 um 18:20 Uhr) Grund: code einfügen

  6. #6
    Erfahrener Benutzer Roboter Genie Avatar von robocat
    Registriert seit
    18.07.2006
    Beiträge
    935
    Stimmt so
    Ausser dass bei den ANSI-C Compilern, die ich kenne, in beide Richtungen (leftshift "<<" und rightshift ">>") Nullen nachgeschoben werden. In deinem Beispiel wurde ein gesetztes Bit nachgeschoben.

    Im Endeffekt wird im µC Maschinencode ein SHL daraus, der Befehl ist hier näher beschrieben:
    http://andremueller.gmxhome.de/befehle.html
    Für die folgenden Bitschiebebefehle gilt die Annahme, dass das höchstwertige Bit am weitesten links in einem Byte/Word etc steht und die Zählung der Bits mit Null beginnt. Dementsprechend steht in einem Byte das höchstwertige Bit an Position 7, das Bit mit dem geringsten Wert an Position 0.
    Beim Befehl SHL werden aus dem ersten Operanden so viele Bits nach links herausgeschoben, wie im zweiten Operanden angegeben. Am rechten Ende werden ebenso viele Bits nachgeschoben, die alle nicht gesetzt sind. Das zuletzt herausgeschobene Bit läßt sich im Carry-Flag finden.
    Geändert von robocat (30.03.2013 um 18:43 Uhr)

Ähnliche Themen

  1. Grundwissen zum Thema Robotic
    Von Azubi88 im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 5
    Letzter Beitrag: 29.11.2009, 17:00
  2. Einteigerfragen zum Thema
    Von sulu im Forum PC-, Pocket PC, Tablet PC, Smartphone oder Notebook
    Antworten: 9
    Letzter Beitrag: 18.04.2008, 17:50
  3. fragen zum thema HF
    Von Che Guevara im Forum Elektronik
    Antworten: 4
    Letzter Beitrag: 06.01.2008, 03:01
  4. Anfängerfragen zum Thema Mikrokontrollerschaltung
    Von Hansanaut im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 30.11.2007, 09:28
  5. Stoff zum Thema Drehflügler
    Von ThunderD im Forum Mechanik
    Antworten: 24
    Letzter Beitrag: 20.07.2005, 15:07

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test