Forum: Mikrocontroller und Digitale Elektronik Basecom > C übersetzen


von Joe B. (joebuttamafuco)


Lesenswert?

Hallo,

ich bin gerade dabei C zu lernen, kenne Basecom von früher und würde 
mich freuen wenn mir Jemand dieses Basecom Program vernünftig in C 
übersetzen könnte.
Es handelt sich hier um ein Atmega8 der ein 7Segment per taster die 
ziffern 1 - 9 nacheinander anzeigt.
1
$regfile "m8def.dat"
2
$crystal = 1000000
3
4
Config Portb.0 = Input
5
Config Portd = Output
6
7
Portb.0 = 1
8
9
Dim Dis(10) As Byte
10
Dim Cnt As Byte
11
12
Dis(1) = &B00111111
13
Dis(2) = &B00000110
14
Dis(3) = &B01011011
15
Dis(4) = &B01001111
16
Dis(5) = &B01100110
17
Dis(6) = &B01101101
18
Dis(7) = &B01111101
19
Dis(8) = &B00000111
20
Dis(9) = &B01111111
21
Dis(10) = &B01101111
22
23
Cnt = 2 : Portd = Dis(cnt)
24
25
Do
26
  If Pinb.0 = 0 Then
27
    Portd = Dis(cnt) : Cnt = Cnt + 1
28
    If Cnt = 8 Then Cnt = 2
29
  End If
30
Loop

Vielen Dank im voraus
Joe

von Jobst M. (jobstens-de)


Lesenswert?

Joe B. schrieb:
> ich bin gerade dabei C zu lernen

Du lernst es am besten, wenn Du es selber machst.
Anschließend kann immer noch jemand hier drauf schauen ...


Gruß

Jobst

von AMD K6 II (Gast)


Lesenswert?

Wenn google dir nichts hilfreiches Ausspuckt, suche mal nach "BASCOM", 
das mag helfen.

von Joe B. (joebuttamafuco)


Lesenswert?

Vielen dank für die sehr hilfreiche Antwort ..gibt es hier kein Schlaubi 
schlumpf filter?

von Joe B. (joebuttamafuco)


Lesenswert?

Ich probiere es :)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Joe B. schrieb:
> ich bin gerade dabei C zu lernen
Ja, das ist doch eine tolle Aufgabe. Fang doch einfach mal an, und wenn 
du dann was hast und auf ein Problem stößt, dann kann man darüber 
diskutieren. Dadurch wirst du den Lerneffekt maximieren.

> kenne Basecom
Was ist das?

> Es handelt sich hier um ein Atmega8 der ein 7Segment per taster die
> ziffern 1 - 9 nacheinander anzeigt.
Ich hoffe, dir ist klar, dass er das mit rasender Geschwindigkeit tut, 
solange der Taster gedrückt ist. Was in dem BASCOM Code fehlt, ist 
nämlich die Entprellung und die Flankenerkennung...

von hp-freund (Gast)


Lesenswert?

Bei diesem Schwierigkeitsgrad und da Du C lernen möchtest, ist es 
tatsächlich der beste Weg wenn Du selbst den ersten Schritt machst.

Also:

1. richtiges #include wählen
2. Dim Dis(10) As Byte in eine C array Definition wandeln
3. main Funktion erstellen
4. ....

von Peter D. (peda)


Angehängte Dateien:

Lesenswert?

1
#include <avr/io.h>             //$regfile "m8def.dat"
2
#include "sbit.h"
3
4
uint8_t Dis[] = {               //Dim Dis(10) As Byte
5
                  0b00111111,   //Dis(1) = &B00111111
6
                  0b00000110,   //Dis(2) = &B00000110
7
                  0b01011011,   //Dis(3) = &B01011011
8
                  0b01001111,   //Dis(4) = &B01001111
9
                  0b01100110,   //Dis(5) = &B01100110
10
                  0b01101101,   //Dis(6) = &B01101101
11
                  0b01111101,   //Dis(7) = &B01111101
12
                  0b00000111,   //Dis(8) = &B00000111
13
                  0b01111111,   //Dis(9) = &B01111111
14
                  0b01101111,   //Dis(10) = &B01101111
15
                };
16
17
int main( void )
18
{
19
  uint8_t Cnt;                  //Dim Cnt As Byte
20
21
  DDR_B0 = 0;                   //Config Portb.0 = Input
22
  DDRD = 0xFF;                  //Config Portd = Output
23
  PORT_B0 = 1;                  //Portb.0 = 1
24
  Cnt = 1;                      //Cnt = 2 : Portd = Dis(cnt)
25
  PORTD = Dis[1];
26
  for(;;){                      //Do
27
    if( PIN_B0 == 0 ){          //  If Pinb.0 = 0 Then
28
      PORTD = Dis[Cnt];         //    Portd = Dis(cnt) : Cnt = Cnt + 1
29
      Cnt++;
30
      if( Cnt == 7 )            //    If Cnt = 8 Then Cnt = 2
31
        Cnt = 1;
32
    }                           //  End If
33
  }                             //Loop
34
}

von Joe B. (joebuttamafuco)


Lesenswert?

Danke Peter....das wird mir sehr gut helfen können!!!!!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Frickelfritze schrieb im Beitrag #4598378:
> Och nöööö, Peda, wo ist da der Lerneffekt für den TO wenn
> du alles auf dem Silbertablett servierst?

Zudem es in diesem Stadium taktisch unklug ist, das Problem mittels 
sbit.h zu erschlagen. Das hätte Peter erstmal weglassen können. Dann 
hätte der TO wenigstens ansatzweise die Möglichkeit gehabt, den 
C-Quelltext zu verstehen und wie man die AVR-Register mittels 
Bitmanipulation ausliest bzw. beschreibt.

Stattdessen erschlägt Peter das Problem mit Bitfeldern in Form von 
Structs, die bei einem C-Neuling frühestens in ein paar Monaten 
drangekommen wären.

Folge: Keine Chance für den TO, das auch nur ansatzweise zu verstehen - 
auch wenn der daraus resultierende Quellcode auf den ersten Blick 
erstmal ziemlich simpel aussieht.

von Joe (Gast)


Lesenswert?

ich denke, dass das was Peter gemacht hat, die beste Hilfe ist, die es 
geben konnte.

Wenn jemand in BASCOM denkt, dann sind die Kommentare bestehend aus den 
BASCOM-Anweisungen die beste Erklärung für die Zeilen in C.

Aus meiner Sicht ist das die beste Einstiegsmethode in C, wenn man von 
der BASCOM-Seite kommt.

Alle anderen Kommentare, die sinngemäß zum Inhalt haben "... du musst 
das selbst machen .." sind vergleichbar dem Rat an einen Fahranfänger 
"Du musst dich ins Auto setzten und einfach mal ausprobieren und bloß 
keinen Fahrlehrer fragen"


Frank M. schrieb:
> Stattdessen erschlägt Peter das Problem mit Bitfeldern in Form von
> Structs, die bei einem C-Neuling frühestens in ein paar Monaten
> drangekommen wären.

Peter hat doch die beste Analogie zu BASCOM gewählt.

Frank M. schrieb:
> Zudem es in diesem Stadium taktisch unklug ist

Welcher Klugscheißer gibt denn diesen Rat und leistet selbst keinen 
konstruktiven Beitrag?

Joe

von Yalu X. (yalu) (Moderator)


Lesenswert?

Lothar M. schrieb:
>> Es handelt sich hier um ein Atmega8 der ein 7Segment per taster die
>> ziffern 1 - 9 nacheinander anzeigt.
> Ich hoffe, dir ist klar, dass er das mit rasender Geschwindigkeit tut,
> solange der Taster gedrückt ist.

Das ist ein elektronischer Würfel (der übrigens von 1 bis 6 zählt), der
sich gerne schnell drehen darf, damit auch keiner schummelt :)

von Peter D. (peda)


Lesenswert?

Frank M. schrieb:
> Stattdessen erschlägt Peter das Problem mit Bitfeldern in Form von
> Structs, die bei einem C-Neuling frühestens in ein paar Monaten
> drangekommen wären.

Viele MC-Compiler bringen IO-Bits von Haus aus mit (z.B. Keil C51, 
Codevision), der AVR-GCC leider nicht. Daher finde ich es nicht 
verkehrt, wenn man sie nachrüstet.
Beim IAR sind sie auch dabei, man muß sie allerdings erst einschalten:
1
#define ENABLE_BIT_DEFINITIONS

Es reicht, wenn man h-Files anwenden kann, man muß sie nicht auf Anhieb 
verstehen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Peter D. schrieb:
> Viele MC-Compiler bringen IO-Bits von Haus aus mit (z.B. Keil C51,
> Codevision), der AVR-GCC leider nicht. Daher finde ich es nicht
> verkehrt, wenn man sie nachrüstet.

Versagt aber, sobald man auf ein anderes Register wie zum Beispiel 
TCCR0A zugreift. Spätestens dann muss der TO dann doch die 
Bitmanipulation lernen. Außerdem schadet es nicht, wenn man sie 
beherrscht. Verwirrend wird es dann auch noch - zumindest für den 
Anwender - PORTB anders zu handeln als TCCR0A.

Hier gibt es einen tiefergreifenden Ansatz, als nur die Port-Register 
durch Bitfelder zu bedienen:

  Beitrag "AVR-Register als Bitfields"

Leider habe ich aus Zeitgründen nie geschafft, diesen Weg bis zum Ende 
zu gehen, d.h. das durchgehend für alle AVRs anzubieten.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Könntet ihr das Thema: "Darf Peter auf so eine Frage einen komplett 
fertigen Code abliefern?" bitte in einem getrennten Thread in /dev/null 
diskutieren?

Zur Klärung: die gelöschten Posts haben allesamt nichts zur Sache 
beigetragen, sondern strotzen nur so vor Personalpromomen wie "du, ich, 
er, ihr..."

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.