Forum: Compiler & IDEs Shiftout in C


von Manfred (Gast)


Lesenswert?

Hallo

Ich würde gerne meinen vorhandenen Bascom-Code in C umschreiben.
Leider komme ich bei dem Befehl ShiftOut von Bascom nicht weiter.

Wie kann ich diese CodeZeile in C umsetzten.So weit ich weis gibt es in 
C den Befehl "ShiftOut" nicht
1
Dim Dds_cmd As Byte
2
Dim Freq_data As Long
3
Shiftout Portb.2 , Portb.0 , Freq_data , 3 , 32 , 0         'DATA,WCLK
4
Shiftout Portb.0 , Portb.0 , Dds_cmd , 3 , 8 , 0            'DATA,WCLK

mfg
Manfred

von Karl H. (kbuchegg)


Lesenswert?

Manfred schrieb:
> Hallo
>
> Ich würde gerne meinen vorhandenen Bascom-Code in C umschreiben.
> Leider komme ich bei dem Befehl ShiftOut von Bascom nicht weiter.
>
> Wie kann ich diese CodeZeile in C umsetzten.So weit ich weis gibt es in
> C den Befehl "ShiftOut" nicht

Aber du weißt ja, was der Befehl macht.

Also .... musst du ihn eben nachprogrammieren.

Ist nur ein wenig Pinwickeln von 2 Pins in der richtigen Reihenfolge, 
Bits ausmaskieren und darüber eine Schleife gelegt.
Alles C-Basistechniken.

Tip:
Es wird vernünftig sein 2 verschiedene Funktionen zu schreiben. Einmal 
für 8-Bit Werte und einmal für 32 Bit Werte. Wobei die 32-Bit Funktion 
auf die 8-Bit Funktion zurückgreifen kann.

Tip:
Du musst ja nicht sofort alle unterschiedlichen Möglichkeiten 
implementieren, die das Original ShiftOut beherrscht. Du verwendest ja 
anscheinend sowieso nur einen bestimmten Modus.

von Peter D. (peda)


Lesenswert?

Vermutlich soll das SW-SPI sein.
1
#include <avr/io.h>
2
3
#define DOUT  0
4
#define SCK  1
5
#define SPIPORT  PORTB
6
7
void spi_out( unsigned char val )  // WINAVR: 20 Byte (10 Words)
8
{
9
  unsigned char i;
10
11
  for( i = 8; i; i-- ){
12
    SPIPORT &= ~(1<<DOUT);  // DOUT = 0
13
    if( val & 0x80 )
14
      SPIPORT |= 1<<DOUT;  // DOUT = 1
15
    val <<= 1;
16
    SPIPORT |= 1<<SCK;    // SCK = 1
17
    SPIPORT &= ~(1<<SCK);  // SCK = 0
18
  }
19
}

von Manfred (Gast)


Lesenswert?

Thx für deine Hilfe.
Ich kenne mich mit C noch nicht wirklich gut aus , habe mit Bascom 
angefangen was wohl ein Fehler war.
Also wenn ich dich richtig verstehe dann könnte man das vom Prinzip her 
so machen....

Freq_data >> 8
Freq_data >> 16
Freq_data >> 24

von Manfred (Gast)


Lesenswert?

Oh habe dein Posting zu spät gesehen Peter

von Uwe (de0508)


Lesenswert?

Hallo

Oder genau 4 Byte - nicht nur 3 Byte - ausgeben oder das 
Beispielprogramm spi_out() auf 32Bit erweitern. Das geht auch !

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Manfred schrieb:
> habe mit Bascom
> angefangen was wohl ein Fehler war.

Es muss nicht unbedingt ein Fehler sein, aber Systeme wie Bascom (oder
teilweise auch die Arduino-Umgebung) halten natürlich ganz viele
Untergrund-Aktivitäten von den Nutzern fern, um ihnen ein API auf
relativ hohem Niveau zur Verfügung zu stellen.

Das ist an sich weder verwerflich noch unsinnig, denn es ist auf die
Zielgruppe dieser Programmierumgebungen zugeschnitten: Leute, die den
Controller benutzen wollen, ohne sich über jedes kleinste Detail in
der Implementierung Gedanken machen zu müssen.  Dass man auf diese
Weise vielleicht nicht die letzten 20 oder 30 % an Systemperformance
rausholen kann, spielt für diese Leute keine große Rolle.  Dafür kommt
man schnell zu einem benutzbaren Ergebnis.

Allerdings sind derartige Programmiersysteme eben nur bedingt als
Einstieg in die Welt der Microcontroller geeignet, wenn man eigentlich
vor hat, auch die Grundlagen komplett zu verstehen.  Dann fängt man
später nochmal neu an.

von Falk B. (falk)


Lesenswert?


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.