Forum: Mikrocontroller und Digitale Elektronik von bascom nach c


von Adolf B. (woody91)


Lesenswert?

Hallo zusammen,
zurzeit habe ich die Aufgabe ein Programm eines 3 stufigen 
HF-Verstärkers  von Bascom nach C umzuschreiben. Gesteuert wird der 
verstärker von eimen atmega128. Leider habe ich bisher nicht mit bascom 
gearbeitet und komme einfach nicht mehr weiter..
die erste frage wäre wie ich am besten die variablen mit dem zusatz "at 
overlay" umschreibe (ist das für byteweises lesen/schreiben??)


1
'Read_DC misst die Augenblickliche Spannung an dem in 'Channel' selektiertem
2
'Kanal
3
4
Function Read_dc(byval Channel As Word)as Word
5
   Dim D_out As Word
6
   Dim D_out_lo As Byte At D_out Overlay
7
   Dim D_out_hi As Byte At D_out + 1 Overlay
8
   Dim D_in As Word
9
   Dim D_in_lo As Byte At D_in Overlay
10
   Dim D_in_hi As Byte At D_in + 1 Overlay
11
   D_out = Channel
12
   Cs_adc7491 = 0                                           'start
13
   D_in_hi = Spimove(d_out_hi)
14
   D_in_lo = Spimove(d_out_lo)
15
   Cs_adc7491 = 1                                           'ende
16
   D_in = D_in And &H0FFF                                   '
17
   Read_dc = D_in
18
End Function

von Christian K. (christian_rx7) Benutzerseite


Lesenswert?

JA, mit Overlay kann eine Variable über eine Andere (auf gleichen 
Speicherplatz gelegt werden, somit lässt sich komfortabel und schnell 
Konvertieren.
In C musst du dafür umständlich mit Pointern fummeln.

Zwei 8 Bit Werte in einem Array auf einen 16 Bit Wert mappen:
uint8_t  SDOS_6200_Data[2];
uint16_t *SDO6200 = (uint16_t*)&SDOS_6200_Data[0];

Christian_RX7

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Christian Kreuzer schrieb:
> In C musst du dafür umständlich mit Pointern fummeln.

... oder eine "union" verwenden. Das ist dann gar nicht so umständlich. 
:-)

von Scelumbro (Gast)


Lesenswert?

Christian Kreuzer schrieb:
> JA, mit Overlay kann eine Variable über eine Andere (auf gleichen
> Speicherplatz gelegt werden, somit lässt sich komfortabel und schnell
> Konvertieren.
> In C musst du dafür umständlich mit Pointern fummeln.

In C gibts auch unions.

von Hans (Gast)


Lesenswert?

Christian Kreuzer schrieb:
> In C musst du dafür umständlich mit Pointern fummeln.
>
> Zwei 8 Bit Werte in einem Array auf einen 16 Bit Wert mappen:
> uint8_t  SDOS_6200_Data[2];
> uint16_t *SDO6200 = (uint16_t*)&SDOS_6200_Data[0];
Und wo fummelst du da umständlich mit Pointern? Das einzige 
umständliche das ich sehe ist das &SDOS_6200_Data[0], SDOS_6200_Data 
würde reichen.

von STK500-Besitzer (Gast)


Lesenswert?

D_in_hi = Spimove(d_out_hi)
   D_in_lo = Spimove(d_out_lo)

wenn man D_in als int definiert, kann man die Sache in C auch so lösen:
1
   D_in = (Spimove(d_out_hi) << 8) | Spimove(d_out_lo);

und die SPI-Adresse/-Daten, die ja offensichtlich  d_out_hi und d_out_lo 
steht/-en, kann man auch einfach der Funktion einen weiteren Parameter 
bzw. übergeben.

von Christian K. (christian_rx7) Benutzerseite


Lesenswert?

Unions muss ich mir mal ansehen, meine Lösung gefällt mir eh noch nicht 
100%ig, bin aber auch erst am C lernen. Komme von Bascom.

Christian_RX7

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.