Forum: Mikrocontroller und Digitale Elektronik µC Generator Programmierung?


von Silwi (Gast)


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
1
// ------------- READS51 generated header -------------- 
2
// module  : d:\Rigel\Reads51\Work\gwenerator_beta\generator_beta.c
3
// created : 10:44:21, Friday, January 23, 2009
4
// ----------------------------------------------------- 
5
//#include<reg515.h>
6
//#include<stdio.h>
7
#include <sfr51.h>
8
//#include<Sio52.h>
9
#include <cSio51.h>
10
#define TICKS_PER_SEC 112
11
12
//sfr ausgang=0xB0; // Port P3 wird der Digital-Ausgang
13
14
15
int nTick;
16
int nTime;
17
int x;
18
19
unsigned char Sinus[72]=    //array für sinus werte
20
{ 127,138,149,160,170,181,191,200,209,217,224,231,237,242,246,250,252,
21
253,254,253,252,250,246,242,237,231,224,217,209,200,191,181,170,160,
22
149,138,127,116,105,95,84,73,64,54,45,37,30,23,17,12,7,
23
4,2,1,0,1,2,4,7,12,17,23,30,37,45,54,64,73,84,95,105,116
24
};
25
26
void SetupTimer0(void){
27
// initialize Timer 0 (configure TMOD low nibble)
28
// TMOD &= 0xF0;              // Mode=0, 13-bit timer
29
30
TMOD = 0x01; // Mode=1, 16-bit timer
31
32
// TMOD = (TMOD&0xF2) | 0x02; // Mode=2, reload timer
33
// TH0  = 0x20;               // change for a different period
34
35
  ET0=1;         // enable Timer 0 interrupt (IE bit)
36
  TR0=1;         // start Timer 0 (TCON bit)
37
  TF0=0;         // Timer 0 overflow flag (TCON bit)
38
  EA=1;          // finally... master interrupt enable (IE bit)
39
  TH0=0xb7;
40
  TL0=0xff;
41
}
42
43
void interrupt(0x0B) T0Isr(void){
44
// The ISR increments the global variable nTick.
45
// If nTick reaches TICKS_PER_SEC, then nTick
46
// is reset (=0) and the global variable nTime 
47
// is incremented.
48
49
50
if(nTick++>=TICKS_PER_SEC)
51
  {
52
   nTick=0;
53
   nTime++;
54
   }
55
}
56
57
58
void main(void)
59
{
60
if(x==73)
61
{
62
x=0;
63
}
64
while(1)
65
{
66
   printf("\nhere we go...\n");
67
   x++;
68
   P3=Sinus[x];
69
}
70
}

von Generator (Gast)


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];
}

von Pieter (Gast)


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

von Andreas K. (ergoproxy)


Lesenswert?

Warum benutzen die meißten auf Teufel komm raus keine for-Schleifen ?

1
void main(void)
2
{
3
printf("\nhere we go...\n");
4
while(1)
5
{
6
   for(x=0;x<72;x++)
7
   {
8
     P3=Sinus[x];
9
   }
10
}

Gruß ErgoProxy

von Kopfschüttel (Gast)


Lesenswert?

> der schule mein abschluss projekt

Was ist das für eine Schule?

von Silwi (Gast)


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

von Andreas K. (ergoproxy)


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

von Silwi (Gast)


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
1
// ------------- READS51 generated header -------------- 
2
// module  : d:\Rigel\Reads51\Work\gwenerator_beta\generator_beta.c
3
// created : 10:44:21, Friday, January 23, 2009
4
// ----------------------------------------------------- 
5
#include <sfr51.h>
6
#include <cSio51.h>
7
#define TICKS_PER_SEC 1
8
9
int nTick;
10
int nTime;
11
int x;
12
13
unsigned char Sinus[72]=
14
{127,138,149,160,170,181,191,200,209,217,224,231,237,242,246,250,252,
15
253,254,253,252,250,246,242,237,231,224,217,209,200,191,181,170,160,
16
149,138,127,116,105,95,84,73,64,54,45,37,30,23,17,12,7,
17
4,2,1,0,1,2,4,7,12,17,23,30,37,45,54,64,73,84,95,105,116};
18
19
void SetupTimer0(void){
20
// initialize Timer 0 (configure TMOD low nibble)
21
// TMOD &= 0xF0;              // Mode=0, 13-bit timer
22
23
TMOD = 0x01; // Mode=1, 16-bit timer
24
25
// TMOD = (TMOD&0xF2) | 0x02; // Mode=2, reload timer
26
// TH0  = 0x20;               // change for a different period
27
28
  ET0=1;         // enable Timer 0 interrupt (IE bit)
29
  TR0=1;         // start Timer 0 (TCON bit)
30
  TF0=0;         // Timer 0 overflow flag (TCON bit)
31
  EA=1;          // finally... master interrupt enable (IE bit)
32
  TH0=0xb7;
33
  TL0=0xff;
34
}
35
36
void interrupt(0x0B) T0Isr(void){
37
// The ISR increments the global variable nTick.
38
// If nTick reaches TICKS_PER_SEC, then nTick
39
// is reset (=0) and the global variable nTime 
40
// is incremented.
41
if(nTick++>=TICKS_PER_SEC)
42
  {
43
   nTick=0;
44
   nTime++;
45
   }
46
}
47
48
49
main()
50
{
51
int nOldTime;
52
53
InitSerialPort0(DEF_SIO_MODE);
54
cputs("\nhere we go...\n");
55
 nTick=0;
56
 nTime=0;
57
 nOldTime=0;
58
59
 SetupTimer0();
60
61
while(1)
62
{
63
 
64
  if(nOldTime!=nTime)
65
    {
66
    nOldTime=nTime;
67
       if(x<72)
68
       {
69
       x++;
70
       }
71
       else
72
       {
73
        x=0;
74
       }
75
        P3=Sinus[x];
76
       cprintf("%d\n",Sinus[x]);
77
    }
78
}
79
}

von eProfi (Gast)


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

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.