PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Von Bascom in C/Ansi C



balrog
28.08.2006, 20:04
Hallo,

da ich nur c bzw ansis c kann und mit basecom oder anderen sprachen noch nicht klar komme, brauch ich eure hilfe... O:)

kann mir jemand das in C übersetzen??bitte ! !
(zur auswertung einer gabellichtschranke von sharp)

.... bei google gibts da leider noch kein sprachtool für #-o

################################################## #####



$regfile = "m32def.dat"
' bei Mega 16 $regfile = "m16def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32

$crystal = 16000000 'Quarzfrequenz
$baud = 9600



Config Int0 = Falling

Config Timer1 = Timer, Prescale = 256
Const Timervorgabe = 3036
Const Markierungenproscheibe = 120

Dim Zaehlerirq0 As Long
Dim Impulseprosekunde As Long
Dim Impulseprominute As Long
Dim Umdrehungenprominute As Integer

Print
Print "* RN-CONTROL 1.4 *"
Print "Drehzahl Messung"; ""



Zaehlerirq0 = 0
On Int0 Irq0
Enable Int0

On Timer1 Timer_irq
Enable Timer1

Enable Interrupts


Do
Print
Print "Impulse Sek: "; Impulseprosekunde
Impulseprominute = Impulseprosekunde * 60
Umdrehungenprominute = Impulseprominute / Markierungenproscheibe
Print "Umdreh. Min: "; Umdrehungenprominute
Wait 3
Loop

End




'Pro Impuls (Markierung auf Scheibe) ein Aufruf
Irq0:
Incr Zaehlerirq0
Return


'Pro Sekunde ein Aufruf
Timer_irq:
Timer1 = Timervorgabe
Impulseprosekunde = Zaehlerirq0
Zaehlerirq0 = 0
Return

######################################


mit freundlichen grüßen

stefan

SIGINT
28.08.2006, 20:29
Hallo balrog,
wo ist genau das Problem?!? Wenn du deinen Controller in C Programmieren kannst, dann kannst du das Basic Programm doch auch in C Umwandeln. Ich sehe nichts, was man als C-Programmierer nicht verstehen kann. Du musst natürlich wissen, wie man IRQs in C nutzt und die Hardware einstellt. Davon hab ich aber leider keine Ahnung, da ich bsi jetzt nur in Assembler progge.

Gruß,
SIGINT

izaseba
28.08.2006, 21:02
Ein kleiner Ansatz,

Der Geber hängt auf einem Externen Interrupt.
Wenn der auslöst wird eine Variable Zaehlerirq0 um eins erhöht.

Timer 1 wird so konfiguriert, daß er jede Sekunde einen Interrupt auslöst.
Hier wird die Zaehlerirq0 ausgelesen und auf Null gesetzt.

In der Hauptschleife würd ich dann die Berechnungen machen und ausgeben,
ist das jetzt schwer ?

Gruß Sebastian

Hanni
28.08.2006, 21:44
ist das jetzt schwer ?

Sicher ist das nicht schwer, wenn man sein Hirn mal einschaltet.
Aber, ich denke mal das is der Typ User, der ne "Komplettlösung" haben will ...

balrog
28.08.2006, 21:46
tut mir leid aber ich kann mit dem basecomzeugs echt ncihts anfangen.. leider

hoffe es wäre irgendeiner so freundlich und kann mir das in c übersetzen oder hat es schon aufm pc und kann es mir schicken..

mit freundlichen grüßen

stefan

izaseba
28.08.2006, 21:53
tut mir leid aber ich kann mit dem basecomzeugs echt ncihts anfangen


Naja, ich halte davon auch nichts, aber lesen kann ich es schon :wink:
Klar könnte ich das direkt in C schreiben, aber Du sagst
da ich nur c bzw ansis c kann
sollte es ja kein Problem sein .
Ich hab Dir auch das Programm übersetzt, der Rest ist Deine Sache ...

Gruß Sebastian

balrog
28.08.2006, 22:00
man ihr seid echt witzig...
ich hab bisher c++ immer nur so verwendet um programme zu schreiben für den pc. NICHT mikrocontroller, hab mir nur in letzter zeit ein bisschen ansis c angeschaut,weil ich es ja brauch um einen mikrocontroller zu steuern.. aber ich versteh jetzt von dem basecomzeug einfach 0 ! ! deshalb fällt es mir auch total schwer das in c zu übersetzen weil ich garnicht weiß was da zeile für zeile in basecom steht... also kann ich es auch schlecht übersetzen:-(

Hanni
28.08.2006, 22:38
Der Geber hängt auf einem Externen Interrupt.
Wenn der auslöst wird eine Variable Zaehlerirq0 um eins erhöht.

Timer 1 wird so konfiguriert, daß er jede Sekunde einen Interrupt auslöst.
Hier wird die Zaehlerirq0 ausgelesen und auf Null gesetzt.

In der Hauptschleife würd ich dann die Berechnungen machen und ausgeben,

Reicht dir der Ansatz nicht mit dem Datenblatt und der Compilerdokumentation ?

AVRboy
29.08.2006, 00:01
Less doch mal den Text in dem Pdf wo des her hast und auserdemdu musst doch nur Timer1 nehmen in ner subroutine "zählen" umrechnen und z.B. auf einem lcd ablesen.(sehe dir mal das datenblatt)

balrog
29.08.2006, 15:46
naja ... ich werds versuchen...

aber falls jemand das programm in c hat, bitte bitte schickt es mir ! ;-) danke !

SprinterSB
29.08.2006, 15:53
Es ist einfacher (und bringt dir auch mehr), wenn du versuchst, die Arbeitsweise des Programms zu verstehen und es dann selber in C programmierst. Es sind eh nicht alle Sachen übertragbar, ein Print in BASIC macht was anderes als ein printf in C! Oder such dir ein paar nicht zu schwierige C-Beispiele aus für dein erstes C-Projekt, und nicht gleich ne "Übersetzung" von BASIC nach C.

Der Teufel steckt im Detail, vor allem bei µCs kann das am Anfang frustrierend sein. Klar, du willst möglichst schnell dein Ding zum laufen haben, aber die investierte Zeit wird sich lohnen...

balrog
29.08.2006, 16:30
ich weiß nicht ob ihr mich nicht versteht;-) aber ich weiß absolut nicht was da steht ... ich kenne die ganzen basecombefehle definitionen nicht !! deshalb kann ich auch nicht nachvollziehen was da abläuft, geschweige denn es in c zu übersetzen!!:-(
auch nicht stück für stück weil ich einfach 0 ahnung von basecom habe ! !
wenn mir einer alles erklärt gerne, aber so wäre es für mich einfacher es in c zu haben denn dann kann ich die basecombefehel auch nachvollziehen !

danke für eure zahlreichen beiträge !
aber eine c übersetzung wäre mir am liebsten..

Hanni
29.08.2006, 16:35
Der Geber hängt auf einem Externen Interrupt.
Wenn der auslöst wird eine Variable Zaehlerirq0 um eins erhöht.

Timer 1 wird so konfiguriert, daß er jede Sekunde einen Interrupt auslöst.
Hier wird die Zaehlerirq0 ausgelesen und auf Null gesetzt.

In der Hauptschleife würd ich dann die Berechnungen machen und ausgeben,

Reicht dir der Ansatz nicht mit dem Datenblatt und der Compilerdokumentation ?

da:



Es ist einfacher (und bringt dir auch mehr), wenn du versuchst, die Arbeitsweise des Programms zu verstehen und es dann selber in C programmierst. Es sind eh nicht alle Sachen übertragbar, ein Print in BASIC macht was anderes als ein printf in C! Oder such dir ein paar nicht zu schwierige C-Beispiele aus für dein erstes C-Projekt, und nicht gleich ne "Übersetzung" von BASIC nach C.

Ich geb dir noch nen Tip am Rande: Eine komplette übersetzung wird dir hier keiner liefern. Das ist nunmal nicht Sinn und Zweck dieses Forums.
Fakt ist auch, das ohne Eigeninitiative hier recht wenig passieren wird.
Ergo: Fang an zu programmieren und wenn du dabei auf Probleme stößt werden deine Fragen und Probleme hier gerne beantwortet.

Grüße,
da Hanni.

balrog
29.08.2006, 17:37
ich versteh das hauptprogramm ja, aber das hier

zitat
"
Der Geber hängt auf einem Externen Interrupt.
Wenn der auslöst wird eine Variable Zaehlerirq0 um eins erhöht.

Timer 1 wird so konfiguriert, daß er jede Sekunde einen Interrupt auslöst.
Hier wird die Zaehlerirq0 ausgelesen und auf Null gesetzt.
"


weiß ich einfach nicht wie das aussehen soll in c weil ich in der hinsicht noch nie was gemacht habe! was ist ein interrupt ? und irq0 ???

mfg

stefan

Hanni
29.08.2006, 17:45
Nuja, in dem Fall empfehle ich dir das Datenblatt einmal genauer anzusehen, genauso wie die Doku der entsprechenden Lib deines Compilers.

Im übrigen könnte ein Blick in diverse Tutorials, z.B. hier im Wiki oder auf www.mikrocontroller.net eine ganze Ecke weiterhelfen.

Grüße,
da Hanni.

SIGINT
29.08.2006, 18:39
So,
ich versuche mal den Quelltext zu Kommentieren... dann sollte jeder
sehen, daß das ganz einfach zu verstehen ist.



################################################## #####



$regfile = "m32def.dat" // Include Datei für Registerdefinitionen
' bei Mega 16 $regfile = "m16def.dat"
$framesize = 32 // Irgendwelche Einstellungen für BASCOM
$swstack = 32 // Stack?!?!
$hwstack = 32 // Stack?!?!

$crystal = 16000000 'Quarzfrequenz //Quarzfrequen
$baud = 9600 // Serielle Schnittstelle



Config Int0 = Falling // INT0 bei fallender Flanke an PIN.d2

Config Timer1 = Timer, Prescale = 256 // Timer1 einstellen
Const Timervorgabe = 3036 //Konstante definieren
Const Markierungenproscheibe = 120 //DITO

Dim Zaehlerirq0 As Long // Variable deklarieren
Dim Impulseprosekunde As Long //dito
Dim Impulseprominute As Long //dito
Dim Umdrehungenprominute As Integer //dito

Print //
Print "* RN-CONTROL 1.4 *" //
Print "Drehzahl Messung"; "" // Text ausgeben



Zaehlerirq0 = 0 //Variable=Wert
On Int0 Irq0 // Bei INT0 die Subroutine "Irq0" aufrufen
Enable Int0 // INT0 einschalten

On Timer1 Timer_irq //Bei Timer1-Int die Sub "Timer_irq" aufrufen
Enable Timer1 //Timer1-Int einschalten

Enable Interrupts // Alle Interrupts freigeben


Do // Endlosschleife
Print //
Print "Impulse Sek: "; Impulseprosekunde // Text und Variable ausgeben
Impulseprominute = Impulseprosekunde * 60 // Irgendwas rechnen
Umdrehungenprominute = Impulseprominute / Markierungenproscheibe //dito
Print "Umdreh. Min: "; Umdrehungenprominute //Text und Var ausgeben
Wait 3 //Warten
Loop //Endlosschleife-Ende

End // Ende des Hauptprogramms




'Pro Impuls (Markierung auf Scheibe) ein Aufruf
Irq0: //Subroutine "Irq0"
Incr Zaehlerirq0 //Variable um eins erhöhen
Return // Zurück zum Hauptprogramm


'Pro Sekunde ein Aufruf
Timer_irq: //Subroutine
Timer1 = Timervorgabe // Timer1 mit Wert laden
Impulseprosekunde = Zaehlerirq0 // irgendwas rechnen
Zaehlerirq0 = 0 // Var=Wert
Return // Zurück zum Hauptprogramm

######################################


Gruß,
SIGINT

UlrichC
29.08.2006, 19:18
Es liegt doch auf der Hand ...
jemand der C Programmiert kann BASCOM zumindest lesen (weil Text).
Vorraussetzung für C ist sogar das man BASCOM zumindest versteht und interpretieren kann.

Oben musste stehen "Such idi der mir Fleißarbeit abnimmt".
Ich zweifle an dessen C-Kenntnisse wenn er das nicht übersetzt bekommt ;-)

Schöne Grüße

izaseba
29.08.2006, 21:07
Hmm,
es stellt sich die Frage, ob der Stefan dieses eine Programm braucht,
sprich ein Drehzahlmesser und fertig, oder ob allgemein Programmieren lernen will.
Wenn nur ein Drehzahlmesser gefragt ist, würde ich mir die kostenlose Version von Basic runterladen,
kompilieren, flashen, fertig.

Wenn es darum geht µC allgemein kennezulernen und noch C dabei zu lernen würde ich mit Blinklicht anfangen.

Und wenn es sich darum dreht das eine Programm in C umzusetzen, aus welchem Grund auch immer würde ich das in der Jobsuche schreiben, es findet sich sicher jemand, der gerne für einen Mega16-32 oder so das für Dich übersetzt.

Gruß Sebastian