Forum: Mikrocontroller und Digitale Elektronik Bit's schreiben


von Daniel (Gast)


Angehängte Dateien:

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

von Sonic (Gast)


Lesenswert?

Dein PORTB Bit 3 ist für 1 Taktzyklus high. Ich weiß zwar nicht was du
damit taktest, aber ist diese Zeit ausreichend? (Welche Taktfrequenz?)

von Daniel (Gast)


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

von André K. (freakazoid)


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

von André K. (freakazoid)


Lesenswert?

<C>
???
</C>

von Alex Trusk (Gast)


Lesenswert?

tr/<>/[]/;
1
???

von inoffizieller WM-Rahul (Gast)


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

von Daniel (Gast)


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

von Daniel (Gast)


Angehängte Dateien:

Lesenswert?

hier der auszug aus der main funktion.

durch die usart wird das ganze ein bisschen unübersichtlich! sry

Daniel

von Dirk (Gast)


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

von inoffizieller WM-Rahul (Gast)


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").

von Daniel (Gast)


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

von Karl H. (kbuchegg)


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!

von Daniel (Gast)


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

von André K. (freakazoid)


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.

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.