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


von Steffen Z. (bladde85)


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!!

von ozo (Gast)


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?

von Steffen Z. (bladde85)


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.

von MSB (Gast)


Lesenswert?

Tach.

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

von Peter D. (peda)


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

von Steffen Z. (bladde85)


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?

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.