www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik µC Generator Programmierung?


Autor: Silwi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi

ich habe grade in der schule mein abschluss projekt.

ich möchte eine sinus-spannung mittels µc erzeugen.

habe auch schon alles fertig(platinen und so).

jetzt hackt es an der programmierung in c.

benutze rigel reads51 zum programmieren. das programm soll auf einen 
8051 laufen.

da ich erst montag meinen dac bekomme kann ich das programm im moment 
nur mit reads51 prüfen.

glaube das es nicht richtig läuft. weiß auch nicht wie ich das genau 
prüfen könnt.

ist mein erstes elektronik/µc projekt! habe zwar schon viel gelötet und 
geäzt aber halt nur nach vorlage.

wär nett wenn mal wer mit mehr ahnung als ich :) mir ein paar tipps 
geben könnt!

vielen dank schonmal
// ------------- READS51 generated header -------------- 
// module  : d:\Rigel\Reads51\Work\gwenerator_beta\generator_beta.c
// created : 10:44:21, Friday, January 23, 2009
// ----------------------------------------------------- 
//#include<reg515.h>
//#include<stdio.h>
#include <sfr51.h>
//#include<Sio52.h>
#include <cSio51.h>
#define TICKS_PER_SEC 112

//sfr ausgang=0xB0; // Port P3 wird der Digital-Ausgang


int nTick;
int nTime;
int x;

unsigned char Sinus[72]=    //array für sinus werte
{ 127,138,149,160,170,181,191,200,209,217,224,231,237,242,246,250,252,
253,254,253,252,250,246,242,237,231,224,217,209,200,191,181,170,160,
149,138,127,116,105,95,84,73,64,54,45,37,30,23,17,12,7,
4,2,1,0,1,2,4,7,12,17,23,30,37,45,54,64,73,84,95,105,116
};

void SetupTimer0(void){
// initialize Timer 0 (configure TMOD low nibble)
// TMOD &= 0xF0;              // Mode=0, 13-bit timer

TMOD = 0x01; // Mode=1, 16-bit timer

// TMOD = (TMOD&0xF2) | 0x02; // Mode=2, reload timer
// TH0  = 0x20;               // change for a different period

  ET0=1;         // enable Timer 0 interrupt (IE bit)
  TR0=1;         // start Timer 0 (TCON bit)
  TF0=0;         // Timer 0 overflow flag (TCON bit)
  EA=1;          // finally... master interrupt enable (IE bit)
  TH0=0xb7;
  TL0=0xff;
}

void interrupt(0x0B) T0Isr(void){
// The ISR increments the global variable nTick.
// If nTick reaches TICKS_PER_SEC, then nTick
// is reset (=0) and the global variable nTime 
// is incremented.


if(nTick++>=TICKS_PER_SEC)
  {
   nTick=0;
   nTime++;
   }
}


void main(void)
{
if(x==73)
{
x=0;
}
while(1)
{
   printf("\nhere we go...\n");
   x++;
   P3=Sinus[x];
}
}

Autor: Generator (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja dein Programm wird nicht richtig laufen.
Denn was apssiert, wenn x den Wert 71 hat, beim nächsten 
Schleifendurchlauf? genau, x wird weiter inkrementiert - und liegt damit 
ausserhalb des gültigen Bereichs für dein Sinus-Array.
Der Code muss wenn schon lauten:

while(1)
{
   printf("\nhere we go...\n");
   if(x<72)
      x++;
   else
      x=0;
   P3=Sinus[x];
}

Autor: Pieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
moin moin,

{
if(x==73) wird nur einmal zu Start aufgerufen
{
x=0;
}
while(1) //in dieser Schleife bleibt der µc
{
   printf("\nhere we go...\n");
   x++;
   P3=Sinus[x];
}
}

void SetupTimer0(void)
Das wird nie aufgerufen!

Hast also mindestens 2 Baustellen.

Mit Gruß
Pieter

Autor: Andreas K. (ergoproxy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum benutzen die meißten auf Teufel komm raus keine for-Schleifen ?

void main(void)
{
printf("\nhere we go...\n");
while(1)
{
   for(x=0;x<72;x++)
   {
     P3=Sinus[x];
   }
}

Gruß ErgoProxy

Autor: Kopfschüttel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> der schule mein abschluss projekt

Was ist das für eine Schule?

Autor: Silwi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi

vielen dank schonmal für eure hilfe!

ja das setuptimer 0 hab ich rausgenommen und vergessen wieder 
reinzupacken.

for schleife werwende ich nicht, da mein lehrer mir gesagt hat der 
controller nicht alzu viel speicher hat und ich es klein und einfach 
halten soll.

ich bin auf einem berufkolleg für technik und gestaltung und mache 
meinen informationtechnischen assisten und fachinformatiker.

meld mich morgen nochmal wenn ich fit bin und nochmal drüber gegcukt 
habe und eure tips angewand hab.

cu

Autor: Andreas K. (ergoproxy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok ich muss zugeben ich weiß jetzt nicht wieviel genau der 
Codeunterschied zwischen einer if + while + inrement usw zu ner 
forschleife ist aber eigendlich sollte er gleich sein es ist nur 
wesentlich übersichtlicher. Und ich kann mir ned vorstellen das das Teil 
von einer for Schleife überfordert wird.

Kompromisse muss man manchmal machen aber manches ist irgendwie unsinnig 
und verschlechtert nur die Lesbarkeit des Codes.
Gruß ErgoProxy

Autor: Silwi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi

ich habe nochmal drüber geguckt und ein paar sachen geändert.

soweit ichs sehn kann müsste es jetzt laufen.

habe aber noch 2 probleme.

1. wie stell ich die interrupt zeit auf 20ms(50hz)?(11.059mhz)

2. was muss ich machen damit ich beim simtty fenster den sinus[x] wert 
angezeigt bekomm? bekomme da immer nur nullen oder komsiche zeichen!

vielen dank euch schonmal

cu

// ------------- READS51 generated header -------------- 
// module  : d:\Rigel\Reads51\Work\gwenerator_beta\generator_beta.c
// created : 10:44:21, Friday, January 23, 2009
// ----------------------------------------------------- 
#include <sfr51.h>
#include <cSio51.h>
#define TICKS_PER_SEC 1

int nTick;
int nTime;
int x;

unsigned char Sinus[72]=
{127,138,149,160,170,181,191,200,209,217,224,231,237,242,246,250,252,
253,254,253,252,250,246,242,237,231,224,217,209,200,191,181,170,160,
149,138,127,116,105,95,84,73,64,54,45,37,30,23,17,12,7,
4,2,1,0,1,2,4,7,12,17,23,30,37,45,54,64,73,84,95,105,116};

void SetupTimer0(void){
// initialize Timer 0 (configure TMOD low nibble)
// TMOD &= 0xF0;              // Mode=0, 13-bit timer

TMOD = 0x01; // Mode=1, 16-bit timer

// TMOD = (TMOD&0xF2) | 0x02; // Mode=2, reload timer
// TH0  = 0x20;               // change for a different period

  ET0=1;         // enable Timer 0 interrupt (IE bit)
  TR0=1;         // start Timer 0 (TCON bit)
  TF0=0;         // Timer 0 overflow flag (TCON bit)
  EA=1;          // finally... master interrupt enable (IE bit)
  TH0=0xb7;
  TL0=0xff;
}

void interrupt(0x0B) T0Isr(void){
// The ISR increments the global variable nTick.
// If nTick reaches TICKS_PER_SEC, then nTick
// is reset (=0) and the global variable nTime 
// is incremented.
if(nTick++>=TICKS_PER_SEC)
  {
   nTick=0;
   nTime++;
   }
}


main()
{
int nOldTime;

InitSerialPort0(DEF_SIO_MODE);
cputs("\nhere we go...\n");
 nTick=0;
 nTime=0;
 nOldTime=0;

 SetupTimer0();

while(1)
{
 
  if(nOldTime!=nTime)
    {
    nOldTime=nTime;
       if(x<72)
       {
       x++;
       }
       else
       {
        x=0;
       }
        P3=Sinus[x];
       cprintf("%d\n",Sinus[x]);
    }
}
}

Autor: eProfi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Tag,
überlege mal, welchen Vorteil es hätte, wenn die Länge der Tabelle ein 
Vielfaches von 2 wäre.

Dann könnte es nämlich so aussehen:
unsigned int x;
while(1)
{
  if(nOldTime!=nTime)
    {
    nOldTime=nTime;
    P3=Sinus[(++x)%64];//Index geht von 0..63   oder %128 für 0..127
    cprintf("%d\n",P3);
    }
}

x läuft dann von 0 .. 65535, aber das stört ja niemanden, da die Bits 6 
bis 15 wegmaskiert werden.
Bei unsigned int kannst Du statt  %64  auch  &63  schreiben.


Hast Du schon   Jespers Poor Man's DDS    gelesen?
www.myplace.nu/avr/minidds/index.htm

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.