mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bascom Befehl Shiftout für C


Autor: Steffen Zimmer (bladde85)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich bin gerade dabei einen ATmega 32 mit dem AVRStudio zu programmieren.
Bisher habe ich dies immer mit Bascom AVR gemacht. Nun habe ich geplant 
auf C umzusteigen.
Die Grundkenntnisse für die C-Programmierung sind auch vorhanden.
Zu meinem Problem:
Bei Bascom AVR gibt es einen Befehl SHIFTOUT der folgendes macht:
(Auszug aus der Hilfe)
Shifts a bit stream out of a variable into a port pin .
Syntax
SHIFTOUT pin , pclock , var , option [, bits , delay ]
Remarks
Pin     The port pin which serves as a data output.
Pclock  The port pin which generates the clock.
Var     The variable that is shifted out.
Option  Option can be :
0 – MSB shifted out first when clock goes low
1 – MSB shifted out first when clock goes high
2 – LSB shifted out first when clock goes low
3 – LSB shifted out first when clock goes high
Bits    Optional number of bits to shift out.
Delay   Optional delay in uS. When you specify the delay, the number of 
bits must also be specified. When the default must be used you can also 
use NULL for the number of bits.
If you do not specify the number of bits to shift, the number of shifts 
will depend on the type of the variable.
When you use a byte, 8 shifts will occur and for an integer, 16 shifts 
will occur. For a Long and Single 32 shifts will occur.
The SHIFTIN routine can be used to interface with all kind of chips.
The PIN is normally connected with the input of a chip that will receive 
information.
The PCLOCK pin is used to clock the bits out of the chip.
The VARIABLE is a normal BASIC variable. And may be of any type except 
for BIT. The data that is stored in the variable is sent with PIN.
The OPTIONS is a constant that specifies the direction of the bits. The 
chip that reads the data may want the LS bit first or the MS bit first. 
It also controls on which edge of the clock signal the data is sent to 
PIN.
The number of bits may be specified. You may omit this info. In that 
case the number of bits of the element data type will be used.
The DELAY normally consists of 2 NOP instructions. When the clock is too 
fast you can specify a delay time(in uS).

Ich bin daher auf der Suche nach einem Befehl in C, der das gleiche 
macht wie dieser SHIFTOUT Befehl von Bascom.
Kann mir dabei jemand weiterhelfen, bzw. existiert für so was schon 
irgendwo eine Headerdatei?

Danke für Eure Hilfe!!

Autor: ozo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Uii, als fertige Lösung wäre mir das nicht bekannt. Musst du 
wahrscheinlich sleber schreiben.
Aber vielleicht ist es vielversprechender, das Problem anders anzugehen. 
Wahrscheinlich kommt dabei dann eine wesentlich bessere C Lösung bei 
raus.
Der Auszug aus der Bascom Hilfe riecht für mich nach ganz viel polling 
und massig Warteschleifen.

Wenn du mal dein Problem schilderst, kommen wir ja vielleicht zusammen 
auf einen (eleganteren) Lösungsansatz?

Autor: Steffen Zimmer (bladde85)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also das Problem ist dass ich über genau eine Leitung Bitkombinationen 
seriell rauschicken muss, um ein Poti einzustellen. Deshalb benötige ich 
auch diese delay Einstellung! Und genau dafür war der Befehl SHIFTOUT 
von Bascom einfach genial und ich dachte, dass es dafür eben schon eine 
Headerdatei oder so etwas in C gibt.

Autor: MSB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tach.

Schau mal in der Ansteuerung für LCD Modulen an einem Schiftregister 
nach. Da gibt es viele verschiedene Lösungen.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Steffen Zimmer wrote:
> Also das Problem ist dass ich über genau eine Leitung Bitkombinationen
> seriell rauschicken muss, um ein Poti einzustellen. Deshalb benötige ich
> auch diese delay Einstellung! Und genau dafür war der Befehl SHIFTOUT
> von Bascom einfach genial und ich dachte, dass es dafür eben schon eine
> Headerdatei oder so etwas in C gibt.

Wenn Du Daten über nur eine Leitung senden willst, mußt Du die UART 
nehmen und die entsprechende Baudrate einstellen.

Das SHIFTOUT (SPI) gibt immer 2 Signale aus (Takt, Daten) und das Delay 
ist eher als Minimalzeit gedacht, falls die Leitung länger ist oder der 
Slave langsamer.

Nen SPI-Beispielcode findest Du hier:

Beitrag "Re: Schieberegister-LCD vereinfachen"


Peter

Autor: Steffen Zimmer (bladde85)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger wrote:
> Wenn Du Daten über nur eine Leitung senden willst, mußt Du die UART
> nehmen und die entsprechende Baudrate einstellen.

Also das mit dem UART hab ich mir auch schon angeschaut. Wird aber in 
meinem Fall leider nicht funktionieren.

> Das SHIFTOUT (SPI) gibt immer 2 Signale aus (Takt, Daten) und das Delay
> ist eher als Minimalzeit gedacht, falls die Leitung länger ist oder der
> Slave langsamer.

Ja soweit ist mir das auch klar und das sollte auch genauso sein!

> Nen SPI-Beispielcode findest Du hier:

Also wenn ich das dann so richtig verstanden habe müsste diese Funktion 
die Lösung meines Problems sein?!




void send_char (uint8_t dsp_char_out)  {
  uint8_t n;

  for (n=0; n<8; n++)  {           // Sende 8 BIT
  if (dsp_char_out & (0x80 >> n))  // Daten an Display ausgeben, MSB 
first
    {
      PORTB |= (1 << DATA);
    }
    else
    {
      PORTB &= ~(1 << DATA);
    }
    PORTB &= ~(1 << CLOCK);        // Ausgabe des Schiebetakt, CLOCK = 0
    PORTB |= (1 << CLOCK);         // CLOCK = 1
  }
  wait (delay_irgendwas);
}

oder liege ich da falsch?

Wenn nicht bräuchte ich noch ne kurze erklären zu diesem Code.Und zwar 
steht da immer PORTB. Kann ich jetzt z.B. über den PORTB1 meine Daten 
senden und über PORTB2 mein Clock? Also ich muss dass dann in diesem 
Code natürlich noch ergänzen. Aber das würde dann so funktioneren?

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.