www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Code übersetzen - C --> BASCOM


Autor: -.- (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo alle,

ich probiere gerade einen Code von C in BASCOM zu übersetzen. Der Code 
ist fürs Charlieplexing. Originalquelle hier: 
http://www.dgoersch.info/codesammlung/avr-gcc/50-c...
Mein Problem ist nun die einzelne Steps. Wie übersetze ich das in 
BASCOM. Mein bisheriger Code sieht so aus:
$regfile = "attiny2313.dat"
$hwstack = 32
$swstack = 32
$crystal = 8000000

Dim Chstep As Byte
Dim Temp As Byte

Config Timer0 = Timer , Prescale = 1024
On Timer0 Timerisr

Enable Timer0
Enable Interrupts


Do



Loop

Timerisr:
   Temp = Bits(chstep)

   If Chstep = 0 Then

      
   Elseif Chstep = 1 Then

     
   Elseif Chstep = 2 Then


   Elseif Chstep = 3 Then

      
   Elseif Chstep = 4 Then

    
   End If
   Ddrb = Temp : Portb = Bits(chstep)
   If Chstep = 5 Then
      Chstep = 0
   Else
      Chstep = Chstep + 1
   End If
Return

End

Wäre nett, wenn mir jmd. helfen könnte

Autor: Helfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bitmanipulation

>        if (lights & 0x00001) tmp |= (1<<1);

IF lights AND &H1 THEN tmp = tmp OR &B10

eventuell auch

IF lights AND &H1 THEN tmp = tmp OR BITS(1)

Autor: -.- (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das &H1 muss man dann immer umrechnen oder? Windows Taschenrechner 
dürfte gehen oder?

Autor: Helfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Textersetzung reicht

C        BASCOM
0x00001  &H1
0x00004  &H4
0x00010  &H10
0x00040  &H40


1<<0     &B1
1<<1     &B10
1<<2     &B100
1<<3     &B1000
            ^ achte mal auf die Zahl der Nullen
Bzw. ist es noch einfacher, wenn BITS() benutzt werden kann

Autor: -.- (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bekomm leider mehrere Errors:
error : 35  Line : 28  3 parameters expected , in File : C:\charlieplexing.bas

error : 35  Line : 28  3 parameters expected , in File : C:\charlieplexing.bas

error : 28  Line : 28  IF THEN expected , in File : C:\charlieplexing.bas

error : 35  Line : 28  3 parameters expected , in File : C:\charlieplexing.bas

error : 350  Line : 0 Interrupt needs return , in File: 

Hier mein Code:
$regfile = "attiny2313.dat"
$hwstack = 32
$swstack = 32
$crystal = 8000000

Dim Chstep As Byte
Dim Temp As Byte
Dim Lights As Byte

Config Timer0 = Timer , Prescale = 1024
On Timer0 Timerisr

Enable Timer0
Enable Interrupts

Lights = &B11111

Do



Loop

Timerisr:
   Temp = Bits(chstep)                                      ' in step x pbx as output

   If Chstep = 0 Then
      If Lights And &H1 Then Tmp = Tmp Or Bits(1) End If

   Elseif Chstep = 1 Then


   Elseif Chstep = 2 Then


   Elseif Chstep = 3 Then


   Elseif Chstep = 4 Then


   End If
   Ddrb = Temp : Portb = Bits(chstep)                       ' temp to ddrb ; pbx (step) high
   If Chstep = 5 Then
      Chstep = 0                                            ' back to 1st step after 5
   Else
      Chstep = Chstep + 1                                   ' next step
   End If
Return

End

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eventuell
If Lights And &H1 <> 0 Then Tmp = Tmp Or Bits(1) End If
                  ^^^^

MfG Mark

Autor: -.- (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> If (Lights And &H1) <> 0 Then Tmp = Tmp Or Bits(1) End If

So kommt nur noch ein Error 3 parameters excpected

Autor: mue-c (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst jetzt jeden einzelnen Befehl nach Bascom übersetzen. Z.B.
If lights.0 = 1 Then Tmp.1 = 1
entspricht deiner Abfrage.
Allerdings wird das ziemlich ineffizient. Und Charlieplexing riecht per 
se zunächst mal zeitkritisch.
Daher wäre es besser, den Sinn zu verstehen und dann in Bascom neu zu 
schreiben.

lights ist ein Long Typ in Bascom (uint32_t in C). Wenn du da jedesmal 
Operationen auf Long machst, nur um ein Bit abzufragen, dauert das sehr 
lange.
Alternativ kannst du 4 Byte Variable per Overlay drüberlegen und diese 
dann manipulieren. Geht wesentlich schneller.

Autor: -.- (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kennt jmd. dann ein einfaches beispiel für charlieplexing in bascom?

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
-.- schrieb:
> ich probiere gerade einen Code von C in BASCOM zu übersetzen. Der Code
> ist fürs Charlieplexing. Originalquelle hier:
> http://www.dgoersch.info/codesammlung/avr-gcc/50-c...

Ist Dir eigentlich bei dem verlinkten "Programmwerk" aufgefallen, daß 
die Verwendung des Output Compare Int völlig sinnfrei ist ? Wär' genauso 
ein Ovfl Int gegangen.

Zur Übersetzung, der Code kommt mit <= 240 Takten aus, ginge also auch 
noch bei Prescale = 1. Allerdings scheint mir die Charlyplexingfrequenz 
bei 8MHz Takt unnötig hoch, da könnte man also einen Prescale von 8 oder 
16 nehmen und es wär' immer noch ok.
tmp1 = 0
tmp1.steps = 1
tmp = tmp1
Select Case steps
   Case 0:
      tmp.1 = lights.0
      tmp.2 = lights.2
      tmp.3 = lights.4
      tmp.4 = lights.6
   Case 1:
      tmp.0 = lights.1
      tmp.2 = lights.8
      tmp.3 = lights.10
      tmp.4 = lights.12
   Case 2:
' usw.
End Select
  DDRB = tmp
  PORTB = tmp1
    If steps = 4 Then
      steps = 0
    Else
      Incr steps
    End If

Autor: -.- (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann mir mal jmd. sagen, wie man in dem Code auf die Zahl hinter Lights 
kommt?

Autor: -.- (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
niemand ne idee?

Autor: -.- (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
keiner eine Idee?

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na klar habe ich Ideen, nur wenn weder Danke für das Fetzerl Code noch 
sonstwas kommt, vergess' ich die alle. Außerdem reagier' ich nicht auf 
jmd., niemand, keiner usw.

Geb' Dir aber trotzdem 'nen Tip: Nimm den wissenschaftlichen Windows 
Taschenrechner, schalt' auf Hex-Eingabe, gibt die Konstante hinter
If (lights &
ein und konvertier's in Binär.
Mal schauen, ob's dann heller wird...

Autor: Serieller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Variable.Zahl Schreibweise ist wohl eine nützliche Spracherweiterung 
in BASCOM (Beitrag "Bascom Bit und Byte")

Die Doku dazu finde ich in dem BASCOM Manual auf die Schnelle nicht. Mal 
selber suchen.

Auf die Zahlen kommt man einfach, wenn man das Binärsystem und das 
Hexadezimalsystem für die Zahlendarstellung kennt. Beides müsste in 
wikipedia ausführlich erklärt sein, deshalb hier kurz:

>>> if (lights & 0x00001) tmp |= (1<<1);
>> tmp.1 = lights.0

Hexadezimal 0x00001 ist Binär 0b01, d.h. 0. Bit gesetzt. lights.0 ist 
das 0. Bit von lights.

(1<<1) ist 1 (Binär: 0b01) um eine Stelle nach links geshiftet also 
0b010, d.h. 1. Bit gesetzt. tmp.1 ist das 1. Bit von tmp.

MWS benutzt jetzt einen "Trick": statt bei der Zuweisung in tmp den Wert 
(1<<1) zu benutzen, verwendet er den bekannten Wert aus lights.

Damit spart er sich die if Abfrage für lights und kann die 
Bitmanipulation schön elegant in dem case Fall unterbringen.

Autor: -.- (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gut, dann bedank ich mich erstmal für den Code. Funktioniert alles, bis 
auf das, dass die anderen Zahlen fehlen.

Zu dem Tipp:
Komisch, wenn ich den ersten Step in Dezimal umrechne, dann komme ich 
auf 1,4,16,64. Du hast jedoch in deinem Code 0,2,4,6. Wie kommst du da 
drauf. Hab ich irgenwas falsch gemacht. Oder muss ich da die Anzahl der 
Nullen in Binär hinschreiben?

Autor: Serieller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Oder muss ich da die Anzahl der Nullen in Binär hinschreiben?

Das wird dir helfen. Dann siehst du an welcher Position die einzelne 1 
steht. Und das ist dann genau die .Zahl

Beim abzählen der Position beachten, dass von rechts nach links 
beginnend mit 0 gezählt wird. 00100000 ist Bitposition 5

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
-.- schrieb:
> Dezimal umrechne, dann komme ich auf 1,4,16,64.

Ich zitier' mich mal selbst:

MWS schrieb:
> und konvertier's in Binär.

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.