PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Basic in C übersetzen?



bnitram
15.11.2010, 17:58
Hallo Forum,
Ich wollte jetzt mal anfangen in C zu programmieren, da Basic ja nicht so "top" ist und andere µCs ja auch fasst nur in C programmiert werden.
Jetzt habe ich die Lib vom LCD zu meinem Pro-Bot128 nur in Basic.
Hier der Basic-Code:

'-------------------------------------------------------------------------------
'I2C zu LCD über Porterweiterung Philips PCF8574T
'Ausgabe von Text als Char und Zahlen wie Word und Float

'Uref ist Versorgung 5Volt, andere Möglichkeiten siehe Hilfe
'Hier sehen Sie, welche PCF 8574 Ports dem LCD zugeordnet sind:
'Port 0 LCD DB4
'Port 1 LCD DB5
'Port 2 LCD DB6
'Port 3 LCD DB7
'Port 4 LCD R/W
'Port 5 LCD RS
'Port 6 LCD EN
'-------------------------------------------------------------------------------

Dim Daten As Byte 'Datenbyte für I²C-Bus- Routinen
Dim LCD_Param As Byte 'Datenbyte für LCD-Routinen
Dim LCD_Buffer As Byte 'zweites Byte für LCD- Routinen
Dim Text_Out_LCD As Char

'---[ LCD INIT ]----------------------------------------------------------------
Sub I2C_LCD_INIT()

I2C_Init(I2C_100kHz) '100kHz

'alle Ports 0
Daten = 0
I2C_SEND()

'8-Bit-Modus aktivieren
I2C_LCD_WRITE_COMMAND(&H38)

'mit 8-Bit-Modus in 4-Bit-Modus wechseln
Daten = &H02
I2C_SEND()

Daten = Daten + &H40
I2C_SEND()
AbsDelay(5)

Daten = Daten - &H40
I2C_SEND()
AbsDelay(5)

'ab jetzt 4-Bit-Modus / Cursor aus
I2C_LCD_WRITE_COMMAND(&H28)

End Sub

'---[ Cursor Blinken ein ]------------------------------------------------------
Sub BLINK_ON()
I2C_LCD_WRITE_COMMAND(&H0F)
End Sub

'---[ Cursor Blinken aus ]------------------------------------------------------
Sub BLINK_OFF()
I2C_LCD_WRITE_COMMAND(&H0C)
End Sub

'---[ Cursor sichtbar ohne blinken ]--------------------------------------------
Sub CURSOR_NO_FLASH()
I2C_LCD_WRITE_COMMAND(&H0E)
End Sub

'---[ Display löschen ]---------------------------------------------------------
Sub I2C_LCD_CLR()
I2C_LCD_WRITE_COMMAND(&H02)
I2C_LCD_WRITE_COMMAND(&H01)
End Sub

'---[ Zeilenwechsel ]-----------------------------------------------------------
Sub I2C_LCD_LOCATE(Zeile As Byte, Pos As Byte)
Dim Position As Byte
If Zeile = 1 Then
Position = (Pos - 1)
I2C_LCD_WRITE_COMMAND(Position Or &H80)
End If
If Zeile = 2 Then
Position = (Pos - 1)
I2C_LCD_WRITE_COMMAND(Position Or &HC0)
End If
If Zeile = 3 Then
Position = (Pos - 1)
I2C_LCD_WRITE_COMMAND(Position Or &H90)
End If
If Zeile = 4 Then
Position = (Pos - 1)
I2C_LCD_WRITE_COMMAND(Position Or &HD0)
End If
End Sub

'---[ LCD Steuerkommando ]------------------------------------------------------
Sub I2C_LCD_WRITE_COMMAND(com As Byte)
LCD_Buffer = &H0
LCD_Param = com
WRITE_TO_LCD()
End Sub

'---[ LCD_Write_Float_Ext ]-----------------------------------------------------
Sub I2C_LCD_WRITE_FLOAT(Var As Single, Len As Word)
Dim Str_Float(17) As Char
Dim x As Word
x = 0
Str_WriteFloat(Var,Len,Str_Float,0)
Do While True
Text_Out_LCD = Str_Float(x)
x = x + 1
If Text_Out_LCD = 0 Then
Exit
End If
I2C_LCD_WRITE(Text_Out_LCD)
End While
End Sub

'---[ LCD_Write_Word_Ext ]------------------------------------------------------
Sub I2C_LCD_WRITE_WORD(Var As Word, Len As Word)
Dim Str_Word(21) As Char
Dim x As Word
x = 0
Str_WriteWord(Var,10,Str_Word,0,Len)
Do While True
Text_Out_LCD = Str_Word(x)
x = x + 1
If Text_Out_LCD = 0 Then
Exit
End If
I2C_LCD_WRITE(Text_Out_LCD)
End While
End Sub

'---[ LCD_Write_Text ]----------------------------------------------------------
Sub I2C_LCD_WRITE_TEXT(ByRef text As Char)
Dim x As Word
x = 0
Do While True
Text_Out_LCD = text(x)
x = x + 1
If Text_Out_LCD = 0 Then
Exit
End If
I2C_LCD_WRITE(Text_Out_LCD)
End While
End Sub

'---[ LCD_Write_Ext ]-----------------------------------------------------------
Sub I2C_LCD_WRITE(Text_Print As Char)
LCD_Buffer = &H20
LCD_Param = Text_Print
WRITE_TO_LCD()
End Sub

'---[ Ausgabe über I2C ]--------------------------------------------------------
Sub WRITE_TO_LCD()
'Hi-Nibble
Daten = LCD_Buffer Or (LCD_Param >> 4)
I2C_SEND()

Daten = Daten + &H40
I2C_SEND()
AbsDelay(1)

Daten = Daten - &H40
I2C_SEND()
AbsDelay(1)

'Low-Nibble
Daten = LCD_Buffer Or (LCD_Param And &H0F)
I2C_SEND()

Daten = Daten + &H40
I2C_SEND()
AbsDelay(1)

Daten = Daten - &H40
I2C_SEND()
AbsDelay(1)
End Sub

'---[ I2C Routine ]-------------------------------------------------------------
Sub I2C_SEND()
I2C_Start()
I2C_Write(I2C_LCD_ADDR)
I2C_Write(Daten)
I2C_Stop()
End Sub

So... jetzt habe ich das gröbste schon in C überstetzt aber hier sind immer noch Fehler drinn(meldet die IDE)
Hier mein überstetzter Code in C:#

/*-------------------------------------------------------------------------------
'I2C zu LCD über Porterweiterung Philips PCF8574T
'Ausgabe von Text als Char und Zahlen wie Word und Float

'Uref ist Versorgung 5Volt, andere Möglichkeiten siehe Hilfe
'Hier sehen Sie, welche PCF 8574 Ports dem LCD zugeordnet sind:
'Port 0 LCD DB4
'Port 1 LCD DB5
'Port 2 LCD DB6
'Port 3 LCD DB7
'Port 4 LCD R/W
'Port 5 LCD RS
'Port 6 LCD EN
------------------------------------------------------------------------------*/

byte Daten; //Datenbyte für I²C-Bus- Routinen
byte LCD_Param; //Datenbyte für LCD-Routinen
byte LCD_Buffer; //zweites Byte für LCD- Routinen
byte Text_Out_LCD;

//---[ LCD INIT ]----------------------------------------------------------------
void I2C_LCD_INIT(void)
{
I2C_Init(I2C_100kHz); //100kHz

//alle Ports 0
Daten = 0;
I2C_SEND();

//8-Bit-Modus aktivieren
I2C_LCD_WRITE_COMMAND &H38;

//mit 8-Bit-Modus in 4-Bit-Modus wechseln
Daten = H02;
I2C_SEND();

Daten = Daten + H40;
I2C_SEND();
AbsDelay(5);

Daten = Daten - H40;
I2C_SEND();
AbsDelay(5);

//ab jetzt 4-Bit-Modus / Cursor aus
I2C_LCD_WRITE_COMMAND &H28;
}

//---[ Cursor Blinken ein ]------------------------------------------------------
void BLINK_ON(void)
{
I2C_LCD_WRITE_COMMAND &H0F;
}

//---[ Cursor Blinken aus ]------------------------------------------------------
void BLINK_OFF(void)
{
I2C_LCD_WRITE_COMMAND &H0C;
}

//---[ Cursor sichtbar ohne blinken ]--------------------------------------------
void CURSOR_NO_FLASH(void)
{
I2C_LCD_WRITE_COMMAND &H0E;
}

//---[ Display löschen ]---------------------------------------------------------
void I2C_LCD_CLR(void)
{
I2C_LCD_WRITE_COMMAND &H02;
I2C_LCD_WRITE_COMMAND &H01;
}

//---[ Zeilenwechsel ]-----------------------------------------------------------
void I2C_LCD_LOCATE(byte Zeile,byte Pos)
{
byte Position;
if(Zeile == 1){
Position = (Pos - 1);
I2C_LCD_WRITE_COMMAND(Position &H80);
}
if(Zeile == 2){
Position = (Pos - 1);
I2C_LCD_WRITE_COMMAND(Position &HC0);
}
if(Zeile == 3){
Position = (Pos - 1);
I2C_LCD_WRITE_COMMAND(Position &H90);
}
if(Zeile == 4){
Position = (Pos - 1);
I2C_LCD_WRITE_COMMAND(Position &HD0);
}
}

//---[ LCD Steuerkommando ]------------------------------------------------------
void I2C_LCD_WRITE_COMMAND(byte com)
{
LCD_Buffer = H0;
LCD_Param = com;
WRITE_TO_LCD();
}

//---[ LCD_Write_Float_Ext ]-----------------------------------------------------
void I2C_LCD_WRITE_FLOAT(Var As Single, Len As Word)
{
char Str_Float(17);
word x;
x = 0;
Str_WriteFloat(Var,Len,Str_Float,0);
while(true){
Text_Out_LCD = Str_Float(x);
x = x + 1;
if(Text_Out_LCD == 0){
Exit;
}
I2C_LCD_WRITE(Text_Out_LCD);
}
}

//---[ LCD_Write_Word_Ext ]------------------------------------------------------
void I2C_LCD_WRITE_WORD(word Var,word Len)
{
char Str_Word(21);
word x;
x = 0;
Str_WriteWord(Var,10,Str_Word,0,Len);
while(true){
Text_Out_LCD = Str_Word(x);
x = x + 1;
if(Text_Out_LCD == 0){
Exit;
}
I2C_LCD_WRITE(Text_Out_LCD)
}
}

//---[ LCD_Write_Text ]----------------------------------------------------------
void I2C_LCD_WRITE_TEXT(char ByRef text)
{
word x;
x = 0;
while(true){
Text_Out_LCD = text(x);
x = x + 1;
if(Text_Out_LCD == 0){
Exit;
}
I2C_LCD_WRITE(Text_Out_LCD)
}
}

//---[ LCD_Write_Ext ]-----------------------------------------------------------
void I2C_LCD_WRITE(char Text_Print)
{
LCD_Buffer = &H20;
LCD_Param = Text_Print;
WRITE_TO_LCD();
}

//---[ Ausgabe über I2C ]--------------------------------------------------------
void WRITE_TO_LCD(void)
{
//Hi-Nibble
Daten = LCD_Buffer Or (LCD_Param >> 4);
I2C_SEND();

Daten = Daten + &H40;
I2C_SEND();
AbsDelay(1);

Daten = Daten - &H40;
I2C_SEND();
AbsDelay(1);

//Low-Nibble
Daten = LCD_Buffer Or (LCD_Param And &H0F);
I2C_SEND();

Daten = Daten + &H40;
I2C_SEND();
AbsDelay(1);

Daten = Daten - &H40;
I2C_SEND();
AbsDelay(1);
}

//---[ I2C Routine ]-------------------------------------------------------------
void I2C_SEND(void)
{
I2C_Start();
I2C_Write(I2C_LCD_ADDR);
I2C_Write(Daten);
I2C_Stop();
}

Wäre nett wenn einer mal drüber schaun konnte da ich mit meinem bisherigen wissen am Ende bin.

Mfg
bnitram

BurningWave
15.11.2010, 18:18
Mit welchem Compiler kann man C# für AVR kompilieren?!

Welche IDE, welchen Compiler benutzt du und welche Fehler meldet der Compiler?

bnitram
15.11.2010, 18:44
Ich benutze die IDE von der C-Control, die bei dem Pro-Bot128 mitgeliefert wurde.
Hier der Download:
http://www.c-control-pro.de/updates/C-ControlSetup.exe
Hier mal ein Bild mit dem Fehlern:
http://www.bilder-hochladen.net/files/thumbs/fijn-d.jpg (http://www.bilder-hochladen.net/files/fijn-d-jpg.html)

BurningWave
15.11.2010, 18:52
Ich kenne mich mit C-Control und C# nicht aus. Bist du dir sicher, dass du einen C#-Compiler und keinen C-Compiler benutzt? (Sry für die Frage, wenn sie zu dumm ist, aber ich habe noch nie etwas von einem C#-Compiler für AVR gehört). Außerdem deklariert man Variablen in C, C++ und C# doch nicht mit so einer Basic-Syntax?!

bnitram
15.11.2010, 19:02
Also ich will die Lib in C schreiben.
In Demo programmen heißt es dann C-Compakt.
Ich habe jetzt auch die Lib auf nur noch 3 Fehler kürzen können.(habe die Fehler gelößt)
So sieht sie jetzt aus:


/*-------------------------------------------------------------------------------
'I2C zu LCD über Porterweiterung Philips PCF8574T
'Ausgabe von Text als Char und Zahlen wie Word und Float

'Uref ist Versorgung 5Volt, andere Möglichkeiten siehe Hilfe
'Hier sehen Sie, welche PCF 8574 Ports dem LCD zugeordnet sind:
'Port 0 LCD DB4
'Port 1 LCD DB5
'Port 2 LCD DB6
'Port 3 LCD DB7
'Port 4 LCD R/W
'Port 5 LCD RS
'Port 6 LCD EN
------------------------------------------------------------------------------*/

byte Daten; //Datenbyte für I²C-Bus- Routinen
byte LCD_Param; //Datenbyte für LCD-Routinen
byte LCD_Buffer; //zweites Byte für LCD- Routinen
byte Text_Out_LCD;

//---[ LCD INIT ]----------------------------------------------------------------
void I2C_LCD_INIT(void)
{
I2C_Init(I2C_100kHz); //100kHz

//alle Ports 0
Daten = 0;
I2C_SEND();

//8-Bit-Modus aktivieren
I2C_LCD_WRITE_COMMAND &H38;

//mit 8-Bit-Modus in 4-Bit-Modus wechseln
Daten = H02;
I2C_SEND();

Daten = Daten + H40;
I2C_SEND();
AbsDelay(5);

Daten = Daten - H40;
I2C_SEND();
AbsDelay(5);

//ab jetzt 4-Bit-Modus / Cursor aus
I2C_LCD_WRITE_COMMAND &H28;
}

//---[ Cursor Blinken ein ]------------------------------------------------------
void BLINK_ON(void)
{
I2C_LCD_WRITE_COMMAND &H0F;
}

//---[ Cursor Blinken aus ]------------------------------------------------------
void BLINK_OFF(void)
{
I2C_LCD_WRITE_COMMAND &H0C;
}

//---[ Cursor sichtbar ohne blinken ]--------------------------------------------
void CURSOR_NO_FLASH(void)
{
I2C_LCD_WRITE_COMMAND &H0E;
}

//---[ Display löschen ]---------------------------------------------------------
void I2C_LCD_CLR(void)
{
I2C_LCD_WRITE_COMMAND &H02;
I2C_LCD_WRITE_COMMAND &H01;
}

//---[ Zeilenwechsel ]-----------------------------------------------------------
void I2C_LCD_LOCATE(byte Zeile,byte Pos)
{
byte Position;
if(Zeile == 1){
Position = (Pos - 1);
I2C_LCD_WRITE_COMMAND(Position &H80);
}
if(Zeile == 2){
Position = (Pos - 1);
I2C_LCD_WRITE_COMMAND(Position &HC0);
}
if(Zeile == 3){
Position = (Pos - 1);
I2C_LCD_WRITE_COMMAND(Position &H90);
}
if(Zeile == 4){
Position = (Pos - 1);
I2C_LCD_WRITE_COMMAND(Position &HD0);
}
}

//---[ LCD Steuerkommando ]------------------------------------------------------
void I2C_LCD_WRITE_COMMAND(byte com)
{
LCD_Buffer = H0;
LCD_Param = com;
WRITE_TO_LCD();
}

//---[ LCD_Write_Float_Ext ]-----------------------------------------------------
void I2C_LCD_WRITE_FLOAT(float Var,word Len)
{
char Str_Float(17) ;
word x;
x = 0;
Str_WriteFloat(Var,Len,Str_Float,0);
while(true){
Text_Out_LCD = Str_Float(x);
x = x + 1;
if(Text_Out_LCD == 0){
Exit;
}
I2C_LCD_WRITE(Text_Out_LCD);
}
}

//---[ LCD_Write_Word_Ext ]------------------------------------------------------
void I2C_LCD_WRITE_WORD(word Var,word Len)
{
char Str_Word(21);
word x;
x = 0;
Str_WriteWord(Var,10,Str_Word,0,Len);
while(true){
Text_Out_LCD = Str_Word(x);
x = x + 1;
if(Text_Out_LCD == 0){
Exit;
}
I2C_LCD_WRITE(Text_Out_LCD);
}
}

//---[ LCD_Write_Text ]----------------------------------------------------------
void I2C_LCD_WRITE_TEXT(char ByRef text)
{
word x;
x = 0;
while(true){
Text_Out_LCD = text(x);
x = x + 1;
if(Text_Out_LCD == 0){
Exit;
}
I2C_LCD_WRITE(Text_Out_LCD);
}
}

//---[ LCD_Write_Ext ]-----------------------------------------------------------
void I2C_LCD_WRITE(char Text_Print)
{
LCD_Buffer = H20;
LCD_Param = Text_Print;
WRITE_TO_LCD();
}

//---[ Ausgabe über I2C ]--------------------------------------------------------
void WRITE_TO_LCD(void)
{
//Hi-Nibble
Daten = LCD_Buffer (LCD_Param >> 4);
I2C_SEND();

Daten = Daten + H40;
I2C_SEND();
AbsDelay(1);

Daten = Daten - H40;
I2C_SEND();
AbsDelay(1);

//Low-Nibble
Daten = LCD_Buffer (LCD_Param &H0F);
I2C_SEND();

Daten = Daten + H40;
I2C_SEND();
AbsDelay(1);

Daten = Daten - H40;
I2C_SEND();
AbsDelay(1);
}

//---[ I2C Routine ]-------------------------------------------------------------
void I2C_SEND(void)
{
I2C_Start();
I2C_Write(I2C_LCD_ADDR);
I2C_Write(Daten);
I2C_Stop();
}
Ich hoffe du kannst mir irrgentwie helfen.

Mfg
bnitram

BurningWave
15.11.2010, 19:19
Ach du willst wirklich C benutzen.



Hier mein überstetzter Code in C:#


Hat mich verwirt, ich habe gedacht, dass soll C# sein. ^^

Also C sieht definitiv anders aus :)
Fangen wir mal an:
1. Soll "'Port 0 LCD DB4" ein Kommentar oder ein Makro sein? Kommentare müssen mit // anfangen.
2. Funktionsaufrufe sehen so nicht aus: I2C_LCD_WRITE_COMMAND &H0E; sondern so: Funktion(param1, param2, ..., paramn);
3. Ob es diesen Datentyp gibt? statt "word" sollte man "int" oder z.B. uint_16, bzw. uint_8 benutzen.
4. Was ist "H40" Hexadezimal schreibt man 0x40 (binär 0b1000000).
5. Verwende statt "byte" "char" und für Bits "bool" (entspricht char).
6. Wo ist main()???
7. Fehlen nicht noch einige #includes?
8. Woher bekommst du deine Funktionen I2C_Start(), I2C_Write, I2C_Stop() und AbsDelay()?

So das sollte fürs erste genügen. Ich empfehle dir wirklich, ein Buch zur C-Programmierung zu lesen.

bnitram
15.11.2010, 19:49
Ja
Man muss halt beachten das ich den Code nur leicht verändert habe.
Die begriffe habe ich einfach nur übernommen.
Da werde ich noch was lernen müssen.
Ich dachte halt nur das ich kleine teile ändern könnte um die Lib benutzen.
Naja. Dann wird sich das wohl erstmal seinlassen.

Mfg
bnitram

BurningWave
15.11.2010, 20:03
Das soll dich nicht entmutigen, der Aufwand ist machbar, auch wenn es einiges an Arbeit ist, ich kann das Buch http://www.amazon.de/Mikrocomputertechnik-Controllern-Atmel-AVR-RISC-Familie-Programmierung/dp/3486587900/ref=sr_1_4?ie=UTF8&qid=1289158964&sr=8-4-spell empfehlen.

radbruch
15.11.2010, 20:48
Hier geht es um C-Compact vom Conrad C-Control Pro:


Die Programmierung kann in C-Compact oder Basic vorgenommen werden.

http://de.wikipedia.org/wiki/C-Control#C-Control_Pro

bnitram
15.11.2010, 21:06
Also ist C-Compakt wieder etwas anderer als C?
Sind die zwei Sprachen sehr unterschiedlich?
Ich möchte später(so in 1jahr) einen Roboter mit einem Atmel bauen und dem in C programmieren.
Ich dachte halt das ich dann schonmal ein bisschen lernen könnte mit meinem Pro-Bot128.

Mfg
bnitram

Besserwessi
15.11.2010, 21:28
Etwas anders als C ist das C-Compakt schon. So groß werden die Unterschiede in der Syntax aber nicht ein. Aber C ist auch nicht gleich C, da hat sich auch einiges getan von den Ursprüngen bis ins Jahr 2000.

Unterschiede wird man vor allem bei den Hardwarespezifischen Teilen haben. Die sind aber nicht Teil der Sprache C, sondern halt Compiler und Hardwarespezifisch.

Zum lernen würde ich aber eher empfehlen von kleinen Beispielprogrammen auszugehen, nicht gleich ein größeres Programm umzusetzen.

radbruch
15.11.2010, 21:53
So groß werden die Unterschiede in der Syntax aber nicht sein.Sind sie aber schon, wie man oben sieht. Das ist auch der Grund warum ich den probot (und seine CCPRO) nur empfehlen kann, wenn schon eine C-Control vorhanden ist. Als "Einsteigerplattform" taugt es aber nicht. Standart für AVRs ist eben A V R - G C C (http://www.rn-wissen.de/index.php/Avr-gcc)

Gruß

mic

P.S.:
Keine Ahnung, ob sich der Support für den probot inzwischen verbessert hat:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=465379#465379