mikrocontroller.net

Forum: Compiler & IDEs Kann mir einer mal diesen Code erklären??


Autor: Hans Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
buffer_counter=0;
write_SPI(BUFFER_1_WRITE);
write_SPI(0x00);
write_SPI((char)(buffer_counter>>8)); ????
write_SPI((char)buffer_counter);
write_SPI(flash_data);


Vorallem was bedeutet das
write_SPI((char)(buffer_counter>>8));

>> ist ja ein Bitschieber nach rechts oder???

kann ich es so verstehen

00000000->00000001

hat jemand einen gute Tutorial über das Bitschieben????

habe mich noch nicht sehr lang mit C und AVR beschäftigt.


Autor: Thomas B. (yahp) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ja, das ist ein Schiebefehl und zwar um acht Bit nach rechts. Ich nehme 
mal an, dass buffer_counter ein Wort breit und wird deswegen in zwei 
Byte zerlegt und getrennt ausgegeben.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>  >> ist ja ein Bitschieber nach rechts oder???

Ganz genau

> kann ich es so verstehen
>
> 00000000->00000001

Wie du da drauf kommst ist mir schleierhaft.
Wenn ich  00000000 8-mal nach rechts schiebe,
ist das immer noch 00000000

Ich geh mal davon aus, dass buffer_counter ein unsigned int ist,
auf einem gcc also 16 Bits belegt.

also zb.
   01011010 11111111
und das 8 mal nach rechts geschoben ergibt

   00000000 01011010

Im Endeffekt erhält man damit also Zugang zum High-Byte eines int.

> hat jemand einen gute Tutorial über das Bitschieben????

Was brauchst du. Ist doch simpel. Mal dir die Bits auf und schiebe
sie so oft wie angegeben. Das einzige problematische ist das Fakt,
dass bei signed nicht definiert ist, ob da jetzt das Vorzeichenbit
dupliziert wird oder ob von links eine 0 nachkommmt. Daher
sollte man diese Dinge, Bitmanipulationen im allgemeinen, immer
mit unsigned Typen machen. Auch im obigen ist es ratsam, anstatt
dem cast auf char einen cast auf unsigned char zu machen.


Autor: Hans Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AHAH

Jetz bin ich schlauer geworden.

Vielen Dank

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Hans Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also hier blicke ich noch nicht durch könnte mir vieleicht einer dabei 
helfen.

Im anhang das Datenblatt eines Atmel Flash Speichers.

Vorallen die Tabelle 7 und 8 wie kann man das verstehen???

Verstehe ich das richtig der SPI BUS sendet oder liest immer nur 8 bit 
oder???

Ich bin wahrscheinlich zu doof für den SPI bus den habe ich nocht nicht 
begriffen wie der Funktioniert und wie man daten sendet bz empfängt.





Autor: Hans Peter (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Soory das Datenblatt

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hans Peter wrote:

> Verstehe ich das richtig der SPI BUS sendet oder liest immer nur 8
> bit oder?

Ja, genau.  Er hat noch eine Besonderheit: er sendet und empfängt
immer zugleich.  Du kannst also nicht nur etwas empfangen: da der
Master den Takt liefern muss, mit dem der Slave die Daten rauspumpt,
muss er zwangsweise auch ein Byte dafür senden (oft wird ein
Dummy-Byte gesendet für diesen Zweck).

Stell dir den Slave einfach als ein serielles 8-bit-Schieberegister
vor, dann bekommst du am ehesten ein Gefühl dafür.  Genau so
funktioniert es, nur dass es (in der Regel) andere Daten raussendet
als die, die es 8 bits zuvor empfangen hat.

Autor: Michael U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

denk noch etwas weiter: denke Dir das 8-Bit-Register im Master und das 
im Slave als ein 16-Bit Schieberegister, die über MOSI hintereinander 
geschaltet sind und deren Eingang (im Master) und Ausgang (im Slave) 
über MISO verbunden sind. Jetzt lade im Master 8Bit rein und im Slave 8 
Bit rein.
Nun schiebe den Kram um 8 Bit weiter...
Am Besten aufmalen. :)

Gruß aus Berlin
Michael

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

Bewertung
0 lesenswert
nicht lesenswert
Willst Du das Rad nochmal erfinden?
Simon stellt schon die fertigen Routinen zur Verfügung:
http://avr.auctionant.de/avrETH1/software_download.html

Dort findest Du auch die dataflash.c und dataflash.h, welche ich für 
Dich ungegzippt, ungetart, mit CR-LF versehen und gezippt angehängt 
habe.

Autor: Hans Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank

Werde mir den Code mal zu Rate ziehen und versuchen ihn zu verstehen und 
umzusetzten..


Danke

Autor: Hans Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich blicke da nicht durch buffer pages len???


wo soll ich anfangen??

die MMC Lib von Radig ist sehr schön nachvollziebar aber hier blick ich 
nicht durch.

Autor: Hans Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe mir das Datenblatt nochmal zu gemüte geführt

1. muß ich in den Buffer schreiben der ist 256 byte groß


den muß ich laut datenblatt so initialisieren

Commando:0x84 für buffer1


dann 15Reserve bits wie übertrage ich 15 bits??? der SPI kann nur 8bit 
2x8 sind 16 und nicht 15.

oder muß ich es schiften

byte buffer adress bit ist das die startadresse des buffers?? die ist ja 
meist null oder??

sende
CS auf low

der buffercounter ist im MSB=0000000|0=9.bit vom bufferbit
                      im LSB=00000011 =8 bit vom bufferbit

zusammen ergibt das 0x03 oder???
das würde heißen gehe zu bufferadresse 0x03.


spi_write(0x84)
spi_write(0x00); 8 reservebits
spi_write(bufferadresse>>8); schiebe msb über lsb oder???
spi_write(bufferadresse);

ich würde aber immer mit 0 beginnen und den block vollschreiben 256 
byte.

dann kann ich mit der übertragung meiner daten beginnen

von 1 bis 256
int counter=1;
while(counter<256)
{
write_spi(*buffer++);
counter++;
}


cs auf height

kann mann das so machen ??????


Bin ich damit auf dem holzweg????

Danke

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.