Forum: Mikrocontroller und Digitale Elektronik C Code in AVR umwandeln


von Paavo V. (paavo_v)


Lesenswert?

Hallo zusammen,

ich habe eine frage zum AVR Studio 6. Ich hab mir für mein Projekt was 
ich gerade mache ein C Programm geschrieben und will dieses jetzt im AVR 
einfügen. ich bekommen nen Haufen Fehlermeldungen bzgl der includes. Wie 
könnte man diese Bibliotheken (zB include <conio.h>, etc) ins AVR Studio 
einfügen? Bzw. was müsste ich tun, damit ich diesen Quellcode 
implementieren kann?

Ich bin noch zimelicher Leie was AVR Studio angeht...sonst immer nur C 
geprogt.

Kurze Erklärung: Ich hab ein 64 Bit Muster was ich in meinem µC 
zwischenspeichern will, um es dann an 8 schieberegister 74hc595 zu 
senden.
Mit dem Quellcode erzeuge ich mir ein beliebiges 64 Bit-Muster! Dieses 
soll dann ambesten im Ram gespeichert werden, da dieser beim ATMEGA 32, 
welchen in verwende, ja 2 KByte groß ist. Ich habe im Programm das 64 
Bit Wort in 2 x 32 Bits aufgeteilt. Ist aber eigetnlich nicht notwenig 
oder ist es nicht möglcihe in 64 Bitword direkt im ATEMGA32 abzulegen? 
Wenn es doch möglich sein sollte, wo kann ich es dann ablegen?
Das Bitwort soll Bitweise in die 8 in Reihegeschalteten 595 
reingeschoben werden.

Vielen Dank für´s Durchlesen ich freu mich über jeden Antort!:D

Mfg
1
//#include <stdio.h>
2
//#include <stdlib.h>
3
//#include <conio.h>
4
//#include <string.h>
5
//#include <ctime>
6
//#include <iostream>
7
//#include <cstdlib>
8
#include <avr/delay.h>
9
#include <ctype.h>
10
#include <avr/io.h>
11
using namespace std;
12
13
string zufallscode()
14
{
15
    char table[] = "ABCDEF0123456789";
16
17
     srand(time(NULL));
18
        string salat;
19
20
        for (int i=0; i<16; i++)
21
        {
22
                int c = rand()%15;
23
                salat.push_back(table[c]);
24
        }
25
      // cout << salat << '\n';
26
       return salat;
27
}
28
29
30
31
int Bitfolge (void)
32
{
33
  int i,Bit;
34
  char Bitfolge[17];
35
  string Zufall;            //ist noch kein ascii folge
36
  Zufall = zufallscode();
37
  char sLOW32[9],sHigh32[9];
38
  char Nullen[17] = "0000000000000000";
39
  //char buffer [sizeof(long)*8+1];
40
  char s64[17], Helfer[17]="";
41
  long lLow32,lHigh32;
42
    //printf ("Enter a number: ");
43
    //  scanf ("%d",&i);
44
    //  ltoa (i,s64,16);
45
46
    zufallscode();
47
    strcpy (s64,Zufall.c_str());          //(ziel, Quelle) (s64, ausgabewert der funktion oben)
48
  printf ("hexadecimal: %s\n",s64);
49
  Nullen[16-strlen(s64)] = '\0';
50
  strcpy(Helfer,Nullen);
51
  strcat(Helfer,s64);
52
  strcpy(s64,Helfer);
53
54
  //ltoa (i,s64,2);
55
  strcpy (sLOW32, s64+8);   //strcpy( Ziel, Quelle)
56
  s64[8]='\0';              //setze an der 8 stelle des Hexwert
57
  strcpy (sHigh32,s64);
58
  lLow32 = strtoul(sLOW32,NULL,16);
59
  lHigh32 = strtoul(sHigh32,NULL,16);
60
  
61
62
  for(Bit = 0; Bit <= 31 ;Bit++)            
63
64
    {
65
    PORTD |= (1<<PD4) & lHigh32 >> Bit & 1;     // Daten auf PD4
66
    PORTD = PORTD & 0x40;            // Takt auf PD6
67
  }
68
    PORTD = 0;                  // Takt und Daten löschen
69
    PORTD = 0x20;                //Registerclock
70
    PORTD = 0;                  // Takt, Daten und LOAD löschen
71
    
72
  }
73
 for(Bit = 0; Bit <= 31 ;Bit++)              
74
75
  {
76
    PORTD |= (1<<PD4) & lLow32 >> Bit & 1;     // Daten auf PD4
77
    PORTD = PORTD & 0x40;            // Takt auf PD6
78
  }
79
    PORTD = 0;                  // Takt und Daten löschen
80
    PORTD = 0x20;                //Registerclock
81
    PORTD = 0;                  // Takt, Daten und LOAD löschen
82
  
83
  }
84
85
}

von Peter II (Gast)


Lesenswert?

das ist kein C sonder C++

using namespace std;
String


wirst du auf dem kleinen µC vergessen können, schreibe reines C dann 
geht es auch.

von Karl H. (kbuchegg)


Lesenswert?

Paavo Varniery schrieb:

> ich habe eine frage zum AVR Studio 6. Ich hab mir für mein Projekt was
> ich gerade mache ein C Programm geschrieben und will dieses jetzt im AVR
> einfügen. ich bekommen nen Haufen Fehlermeldungen bzgl der includes. Wie
> könnte man diese Bibliotheken (zB include <conio.h>, etc)

Ähm.
Gar nicht?

Um beim Beispiel zu bleiben: conio.h enhtält die Header von 
Konsolenfunktionen, also Dinge wie Cursorsteuerung etc.


Auf einem AVR hast du keine Konsole.
Und wenn du eine hast, dann musst du dir die Konsolenfunktionen selber 
machen, weil deine Hardware nun mal signifikant anders funktioniert als 
die Konsole auf einem PC

> Ich bin noch zimelicher Leie was AVR Studio angeht...sonst immer nur C
> geprogt.

Echt.

>         string salat;
>
....

>                 salat.push_back(table[c]);

glaub ich nicht.
Das ist C++

von Paavo V. (paavo_v)


Lesenswert?

Hey,

ja ihr habt ja recht c++,sorry. die Conio.h kann ich ja auch locker 
rausschmeissen, da ich kein printf oder sowas verwende:D

von Karl H. (kbuchegg)


Lesenswert?

Du kannst da eine Menge rauswerfen.

Darf ich vorschlagen, dass du dort anfängst, wo alle anfangen?
Bei den allereinfachsten Grundlagen:
Die DDR Register und welche Bedeutung sie haben
Wie man einen Ausgangspin auf 1 bzw 0 stellt.

Dann hängst du mal 1 LED an einen Pin und spielst mit der.
LED leuchten lassen, LED nicht leuchten lassen, LED blinken lassen.
Dann das ganze mit mehreren LED
Eventuell vielleicht mal ein Lauflicht

Irgendwann kommt dann mal ein Taster dazu.

etc. etc.

Und dann, irgendwann mal, kommt ein Schieberegister.

AVR-GCC-Tutorial

von Peter II (Gast)


Lesenswert?

time

ist auch schön auf einem µC - woher soll er denn bitte schön die zeit 
wissen?

von Εrnst B. (ernst)


Lesenswert?

Wow. Wo stammt das Programm her?
Wild per Copy&Paste aus dem Internet zusammengewürfelt? Dabei C und C++ 
Code vermischt?
Und dabei noch die Schlechtest-mögliche variante gewählt? Oder ist das 
ein Scherz?
Per C++-String-Operationen eine Hexadezimal-Schreibweise eines Longs zu 
erzeugen, um diese dann mit einer undurchsichten C - 
strcat/cpy/.../strtoul Orgie in zwei Longs zu verwusten, nur um eine 
Zufallszahl darin abzulegen?

Lass mich raten: Das Programm stammt aus einem anderen Forum(s-Thread), 
und dort hat sich jemand einen Scherz erlaubt?

von Reinhard #. (gruebler)


Lesenswert?

Peter II schrieb:
> soll er denn bitte schön die zeit wissen?

»Zeit ist das, was man an der Uhr abliest.«
Alberst Einstein

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


Lesenswert?

Paavo Varniery schrieb:
1
PORTD |= (1<<PD4) & lHigh32 >> Bit & 1;
Da wäre ich mir jetzt auf Anhieb gar nicht so sicher, was da rauskommt. 
Ich würde da deutlich mehr Klammern nehmen...

Und das ist für einen uC auch nicht schlecht:
1
   string salat;
2
   :
3
   salat.push_back(table[c]);

von Paavo V. (paavo_v)


Lesenswert?

Εrnst B✶ schrieb:
> Wow. Wo stammt das Programm her?
> Wild per Copy&Paste aus dem Internet zusammengewürfelt? Dabei C und C++
> Code vermischt?
> Und dabei noch die Schlechtest-mögliche variante gewählt? Oder ist das
> ein Scherz?
> Per C++-String-Operationen eine Hexadezimal-Schreibweise eines Longs zu
> erzeugen, um diese dann mit einer undurchsichten C -
> strcat/cpy/.../strtoul Orgie in zwei Longs zu verwusten, nur um eine
> Zufallszahl darin abzulegen?
>
> Lass mich raten: Das Programm stammt aus einem anderen Forum(s-Thread),
> und dort hat sich jemand einen Scherz erlaubt?

Danke für dein gutes Kommentar! Es war wirklich sehr hilfreich!

von Εrnst B. (ernst)


Lesenswert?

Paavo Varniery schrieb:
> Es war wirklich sehr hilfreich!

Denk ich mir. Jetzt kannst du dem, der dir diesen Scherz gespielt hat, 
auf die Finger klopfen.

Tipp zum Thema:
Lass das ganze std::string, char[], strcopy, strtoul -Zeuchs weg. Ja, 
alles!
Dann erzeuge dir die Zufalls*Zahlen* als Zahl. Ohne 
String-Zwischenschritt.

Dann gib deine Zahlen Bitweise aus.


Tipp2 dazu: Shift-Operationen mit variabler Shift-Weite mag der AVR 
garnicht gerne.
Lieber jeden Schleifendurchlauf immer das erste Bit der Zahl ausgeben, 
anschließend die ganze Zahl um eins weitershiften.

von Paavo V. (paavo_v)


Lesenswert?

Ich hab´s jetzt erstmal ganz einfach gemacht...denk ich jedenfalls...

#define F_CPU 8000000
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <inttypes.h>
#define SHIFT_DATA PD4
#define SHIFT_CLOCK PD6
#define SHIFT_REG PD5


void send_char( uint64_t Bitmuster);



ISR(TIMER1_COMPA_vect)
{

  PORTA = PORTA >>1 ;
  if(PORTA == 0x00)
  PORTA = 0x80;
}


int main(void)

{
  uint64_t Bitmuster;
  DDRA |= 0xFF;
  DDRD |= 0xFF;
  //-----------Timer konfigurieren-----------
  TCCR1B |= (1<<WGM12) | (1<<CS11); //CTC Mode mit WGM12,Prescaler von 8 
mit CS11
  //TCNT1 = 64286;
  TIMSK |= (1<<OCIE1A);
  OCR1A =1249;          //Vergleichswert zur Bestimmung von 1,25ms

  TCCR1A |= (1<<COM1A0);

  send_char(Bitmuster);

  sei();

  while(1)
  {



void send_char( uint64_t Bitmuster)
{
  uint8_t n;
  uint64_t Bitmuster[64] 
={0,0,1,0,0,0,0,1,0,0,1,1,0,1,1,0,0,0,1,0,0,1,1,0,1,0,1,0,1,1,1,1,0,0,1, 
0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,1,1,1,1,1,0,1,0,1,0,1,1,1};

  for ( n = 0, n <= 64; n++)
    {
      PORTD |= (1<<SHIFT_DATA) & Bitmuster[i];         // Daten auf PD4
      PORTD = PORTD & 0x40;              // Takt auf PD6
    }
      PORTD = 0;                    // Takt und Daten löschen
      PORTD = 0x20;                  //Registerclock
      PORTD = 0;                    // Takt, Daten und LOAD löschen
    }
}
}

von Karl H. (kbuchegg)


Lesenswert?

Paavo Varniery schrieb:

Was bitte ist an

> void send_char( uint64_t Bitmuster)
> {
>   uint8_t n;
>   uint64_t Bitmuster[64]
> ={0,0,1,0,0,0,0,1,0,0,1,1,0,1,1,0,0,0,1,0,0,1,1,0,1,0,1,0,1,1,1,1,0,0,1, 
0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,1,1,1,1,1,0,1,0,1,0,1,1,1};

einfach?
1
void send_char( uint64_t Bitmuster)
2
{
3
  uint8_t n;
4
5
  for( n = 0; n < 64; n++ )
6
  {
7
    if( Bitmuster & 0x01 )
8
      PORTD |= ( 1 << SHIFT_DATA );
9
    else
10
      PORTD &= ~( 1 << SHIFT_DATA );
11
12
    PORTD |= ( 1 << SHIFT_CLOCK );
13
    PORTD &= ~( 1 << SHIFT_CLOCK );
14
15
    Bitmuster >>= 1;
16
  }
17
18
  PORTD |= ( 1 << SHIFT_REG );
19
  PORTD &= ~( 1 << SHIFT_REG );
20
}

Das wäre einfach. Und neben bei bemerkt auch noch richtig, was man von 
deiner Port-Orgie nicht gerade behaupten kann.

Noch einfacher (auch für den AVR) wäre es, eine Funktion zu schreiben, 
die lediglich 8 Bit raustaktet, und die dann einfach 8 mal mit den 
einzelnen Bytes aufzurufen. Sonst schiebt sich der AVR mit den 64-Bit 
Variablen zu Tode (aber ok. so schlimm ist das auch wieder nicht)

von Paavo V. (paavo_v)


Lesenswert?

Ich will ja aber aus dem Bitmuster[] die einzelnen nullen und einsen 
haben und die rüberschieben!? Also will ich mit der for-Anweisung die 
jeweiligen Einträge des Arrays abarbeiten.

von Karl H. (kbuchegg)


Lesenswert?

Paavo Varniery schrieb:
> Ich will ja aber aus dem Bitmuster[]

und wozu brauchst du das Array?
Oder bist du Array-Fetischist?

Wozu ein Array aus 64 Stück uint64_t basteln, wenn es ein einziger(!) 
uint64_t auch tut, den man dann eben Bit für Bit raustaktet.


Oder was glaubst du, was die Kombination aus

  for( n = 0; n < 64; n++ )
  {
    if( Bitmuster & 0x01 )
...

    Bitmuster >>= 1;
  }

macht?

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Paavo Varniery schrieb:
>> Ich will ja aber aus dem Bitmuster[]
>
> und wozu brauchst du das Array?
> Oder bist du Array-Fetischist?
>
> Wozu ein Array aus 64 Stück uint64_t basteln, wenn es ein einziger(!)
> uint64_t auch tut

Nur um das ins rechte Licht zu rücken.
Du verbrauchst 64 * 8, gleich 512 Bytes, wo du mit einer 8-Byte Variable 
auch auskommst.
Wieviel SRAM Speicher hat noch mal dein µC?

von kbuchegg (Gast)


Lesenswert?

wobei sich ja auch noch die frage erhebt, wozu du da ueberhaupt uint64-t 
brauchst? musst du etwas mit 64  bit berechnen?

von otti (Gast)


Lesenswert?

Oh, hier haben wir einen besser ausgebildeten, hochqualifizierten
Spezialisten, der dringend von Bundesregierung und Industrie gesucht und 
angeworben wird gefunden.

von Paavo V. (paavo_v)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Karl Heinz Buchegger schrieb:
>> Paavo Varniery schrieb:
>>> Ich will ja aber aus dem Bitmuster[]
>>
>> und wozu brauchst du das Array?
>> Oder bist du Array-Fetischist?
>>
>> Wozu ein Array aus 64 Stück uint64_t basteln, wenn es ein einziger(!)
>> uint64_t auch tut
>
> Nur um das ins rechte Licht zu rücken.
> Du verbrauchst 64 * 8, gleich 512 Bytes, wo du mit einer 8-Byte Variable
> auch auskommst.
> Wieviel SRAM Speicher hat noch mal dein µC?

2Kbytes Internal SRAM

sollte also langen:D

Ich habe jetzt das uint64_t Bitmuster = 0xDE0BFCE86252724; festgelegt.

Und gebe es mit :

{  for ( n = 0; n <= 64; n++)
      {
        if( Bitmuster & 0x01 )
        PORTD |= ( 1 << SHIFT_DATA );
        else
        PORTD &= ~( 1 << SHIFT_DATA );

        PORTD |= ( 1 << SHIFT_CLOCK );
        PORTD &= ~( 1 << SHIFT_CLOCK );

        Bitmuster >>= 1;
      }

      PORTD |= ( 1 << SHIFT_REG );
      PORTD &= ~( 1 << SHIFT_REG );
    }
  }

aus!

hab´s mal debugt und es sieht ganz gut aus bis darafu, dass mir AVR beim 
bitmuster etwas merkwürdige werte anzeigt! erst kommt wie erwartet eine 
bitfolge von 010101010100010 etc doch dann folgen darauf irgendwie 
dezimal aussehende zahlen...duch &0x01 gucke ich mir ja immer nur das 
erste Bit an(ob 0 oder 1) dann wird es rübergeschickt.

von iTroll (Gast)


Lesenswert?

Paavo Varniery schrieb:
> Ich bin noch zimelicher Leie was AVR Studio angeht...sonst immer nur C
> geprogt.

AVR Studio ist eine Entwicklungsentgebung, C eine Programmiersprache.

Paavo Varniery schrieb:
> ja ihr habt ja recht c++

Nur weil der Name zweier Programmiersprachen mit dem selben Buchstaben 
anfängt, muss das Zeug noch lange nicht durch den selben Compiler 
passen.

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.