mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bit's schreiben


Autor: Daniel (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?)

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: André Kronfeldt (freakazoid)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: André Kronfeldt (freakazoid)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
<C>
???
</C>

Autor: Alex Trusk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tr/<>/[]/;
???

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hier der auszug aus der main funktion.

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

Daniel

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

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

volatile unsigned char messwert[7];

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

Gruß,
Dirk

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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").

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: André Kronfeldt (freakazoid)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.