Bit's schreiben

Gast #407718
Lesenswert?

Hallo comunnity,

ich habe da ein paar differenzen mit meinem atmega 8535, den ich in C
programmiere!

Ich will ein Schieberegister (64bit) auslesen und den zustand in 8
variablen schreiben zu je 1byte. (8x8bit = 64bit)
dafür habe ich ein array angelegt
messwert[8]= {0}
(Ich weiß, ich verschenke somit 1byte, aber feintuning stell ich
erstmal hinten an.)

der kleine proggrammcode ist im anhang.

Mein problem ist, er schreibt mir nur nullen in die variablen!

für konstruktive kritik bin ich euch dankbar!

Bis dahin
Daniel
Angehängte Dateien:
Gast #407720
Lesenswert?

Die taktfrequenz vom µC sind 4 MHZ. das low ->high-> low ist als clock
signal für das schieberegister gedacht. das clock-signal soll mir ein
bit aus dem schieberegister drücken!

Bis dahin
Daniel
#407721
Lesenswert?

Hi,

> Ich weiß, ich verschenke somit 1byte, aber feintuning stell ich
> erstmal hinten an.)
tust Du nicht. Aber ein Satz wie dieser läßt auf einen beliebten Fehler
schließen. Und siehe da, im Code findet sich:

<c>
for(j = 1; j <= 8; j++)  //die schleife steuert das array
{
 ...
 messwert[j] |= (1 << i);
}
</c>

Dein Array geht bestimmt von 0..7, oder?

Oder hast Du ein 9 Bytes großes Array angelegt? Dann stimmt Dein Satz
oben (wobei 'messwert[8]= {0}' dann wieder nicht paßt) ;-)

Im Codeausschnitt ist leider nur die Schleife und nicht der Rest.

Grüße, Freakazoid
Gast #407724
Lesenswert?

Umständlich!
for(j = 0; j <= 7; j++)  //die schleife steuert das array
{
 for(i = 0; i <= 7; i++)  //diese schleife gibt die bitstelle
                                //in der variablen an
 {
  PORTB &= ~(1 << 3);      // low für clock
  PORTB |= (1 << 3);      // high für clock
  PORTB &= ~(1 << 3);      // low für den clock
  messwert[j] <<= 1; // Multiplikation mit 2
  if (PINA & (1<<PINA1)) messwert[j] |= 1;
  }
}

Man kann das Byte auch andersherum aufbauen (ohne Gewähr):
  messwert[j] >>= 1; // Division durch 2
  if (PINA & (1<<PINA1)) messwert[j] |= 128; // 0b10000000
Gast #407725
Lesenswert?

Hallo,

@Freakazoid
also ich brauche ein array mit 8 variablen. ich war der annahme das
messwert[8] neun variablen anlegt von null an bis acht hoch!

und gedacht war es so dass das array in der schleife von 1 - 8 genutzt
wird!

hmm, den rest willst du sicher nicht sehen gg

okay mag sein, dass meine art das bit zu schieben umständlich ist, aber
an und für sich müsste es doch genau das tun was ich verlange und genau
das macht es leider nicht!

ich schau mal zu das ich den rest des programms zur verfügung stelle.

soweit erstmal danke!

Daniel
Gast #407727
Lesenswert?

Hi,

noch einfacher und schneller geht es wenn du die HW SPI benutzt.

volatile unsigned char messwert[7];

1
void get_data(void){
2
 static unsigned int temp=0;
3
 for(i=0;i<8;i++){
4
  SPDR = temp;          
5
  while(!(SPSR & (1<<SPIF)));          
6
  messwert[i]= SPDR;
7
 }
8
}

Gruß,
Dirk
Gast #407728
Lesenswert?

Sofern messwert[j] vor der Schleife = 0 ist/gesetzt wird, kannst du dir
die zweite Abfrage (!(PINA &...) sparen.
Wenn man sich (1<<i) anguckt, dann wird das auch immer länger, je
grösser i wird.
Sowas kann zu Problemen führen, wenn man es zeitkritisch wird
("Jitter").
Gast #407729
Lesenswert?

Hi,

@ WM-Rahul

ich habe deine Schleife mal durchgetestet. Sie ist in der tat viel
kompakter. Den if teil für 0 bit setzten kann ich mir in der tat
sparen.

funktionieren tut es dennoch nicht.

Das mit dem SPI werde ich morgen mal versuchen. (dazu muss ich erst
noch den lötkolben aufheizen)

vieleicht ist mein µc zu langsam ist. denn das register kann nur
ausgelesen werden, wenn nicht gerade hineingeschrieben wird, da die
datenpakete allerdings ziehmlich schnell hinterinander ins register
geschoben werden (alle 300ms), könnte ich da ein konflikt haben.

im moment fällt mir dazu nix mehr ein!

gute nacht
Daniel
#407730
Lesenswert?

> also ich brauche ein array mit 8 variablen. ich war der annahme das
> messwert[8] neun variablen anlegt von null an bis acht hoch!
>
> und gedacht war es so dass das array in der schleife von 1 - 8
> genutzt wird!

Totaler Quatsch.
Bitte besorg dir ein C Buch.

int Werte[8]

legt ein Array mit 8 Einträgen an. Diese tragen die
Indenummern
 0 1 2 3 4 5 6 7
Zähl sie nach. Das sind 8 Stück.

In C wird mit 0 zu zählen begonnen!
Gast #407731
Lesenswert?

Hallo,

könnte mir bezüglich der SPI jemand auf die sprünge helfen?

ich will ja daten empfangen, muss aber ein clocksignal ausgeben, brauch
ich da eine master konfiguration oder ein slave? ist der miso port der
eingang und der sck für clock?

bevor ich da jetzt so mir nichts dir nichts das neue programm auf den
mc bügel, kann ich durch die "doppelbelegung der pins später noch die
ISP nutzen oder geht das nicht mehr?

bis dahin
Daniel
#407732
Lesenswert?

Hi,

> ich will ja daten empfangen, muss aber ein clocksignal ausgeben,
> brauch ich da eine master konfiguration oder ein slave?
DU gibst den Clock, also bist DU der Master.

> ist der miso port der eingang und der sck für clock?
miso= MASTER INPUT SLAVE OUTPUT -> Ja
sck = clock -> Ja

> bevor ich da jetzt so mir nichts dir nichts das neue programm auf
> den mc bügel, kann ich durch die "doppelbelegung der pins später
> noch die ISP nutzen oder geht das nicht mehr?
Kommt auf die Beschaltung an beim SPI. Wenn Deine Peripherie MISO und
CLK hochohmig schalten kann, kannst Du den SPI weiter benutzen.

Grüße, Freakazoid

P.S.:
Die SPI-Beschreibung im Datenblatt hilft auch ungemein.

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