C Code in AVR umwandeln

OP #3192317
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
}
#3192326
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++
#3192332
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
#3192344
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?
OP #3192357
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!
#3192386
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.
OP #3192431
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
    }
}
}
#3192437
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)
#3192504
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?
#3192516
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?
OP #3192669
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren