Forum: Mikrocontroller und Digitale Elektronik µC als Funktionsgenerator


von Hannes K. (chgruber)


Lesenswert?

Kann ich meinen µC (LPC936) als Funktionsgenerator mit externer 
Versorgung verwenden?
D.h. ich legen an einen Pin 9V und schalte, mittels Timer oder 
ext.Interrupt die 9V am Eingangspin auf einen anderen Ausgangspin.


Ungefähr so:



#include <REG936.h>

#define AUS 0x00;


sbit Ausgang = 0xA0;
sbit Eingang = 0xA1;





void main()
{

 P2M1 &= 0xFE;
 P2M2 |= 0x01;

 TH0 = 0x00;
 TL0 = 0x05;

 TH1 = 0x00;
 TL1 = 0x0A;

 TMOD=0x11;

 ET0 = 1;
 ET1 = 1;
 EA = 1;

 TR0 = 1;


   while(1)
  {}

}


void SpannungAUS () interrupt 1
{

 Ausgang = AUS;

 TH0 = 0x00;
 TL0 = 0x05;
 TR0 = 0;
 TR1 = 1;
}


void SpannungEIN () interrupt 3
{

 Ausgang = Eingang;

 TH1=0x00;
 TL1=0x0A;
 TR1 = 0;
 TR0 = 1;

}

von KST (Gast)


Lesenswert?

Hä???

von holger (Gast)


Lesenswert?

>D.h. ich legen an einen Pin 9V und schalte, mittels Timer oder
>ext.Interrupt die 9V am Eingangspin auf einen anderen Ausgangspin.

Jo, mach mal. Und dreh ein Video von den Rauchwolken.

von Hannes K. (chgruber)


Lesenswert?

Ja deswegen frag ich ja...ich bin ganz neu im µC-Business.

von Michael A. (Gast)


Lesenswert?

Christian Gruber schrieb:
> D.h. ich legen an einen Pin 9V und schalte, mittels Timer oder
> ext.Interrupt die 9V am Eingangspin auf einen anderen Ausgangspin.

Hört sich spannend an. GUck mal in Abschnitt 10 des Datenblatts

von Harald W. (wilhelms)


Lesenswert?

Christian Gruber schrieb:

> Kann ich meinen µC als Funktionsgenerator verwenden?

http://de.wikipedia.org/wiki/Funktionsgenerator
Gruss
Harald

von Hannes K. (chgruber)


Lesenswert?

Dann schalte ich eben mit dem µC einen Transistor und über diesen dann 
die 9V

von ich (Gast)


Lesenswert?

Dann hast Du aber bestenfalls einen Rechteck-Generator

von Hannes K. (chgruber)


Lesenswert?

ich schrieb:
> Dann hast Du aber bestenfalls einen Rechteck-Generator

So soll es auch sein. ;-)

von Wastl F. (rescuetigerchen)


Lesenswert?

Benutz doch einfach einen Timer-Overflow (Interrupt). Da kannst du ganz 
bequem die Frequenz vorgeben, an und ausschalten kannst du bei Bedarf 
auch. Bei Atmel hat man zumindest diese Option.

von Helmut S. (helmuts)


Lesenswert?

Hallo Christian,
Ein Funktionsgenerator kann z. B. Sinus, Dreieck, Rampe, Rechteck und 
eventuell auch beliebige Kurvenformen.
Was du suchst nennt sich Pulsgenerator.

von Philk (Gast)


Lesenswert?

Wozu einen µC für so eine primitive Aufgabe nehmen?

nimm einen NE555 und beschalte ihn als Astabile Kippstufe:

http://de.wikipedia.org/wiki/NE555#Astabile_Kippstufe

von Hannes K. (chgruber)


Lesenswert?

Philk schrieb:
> Wozu einen µC für so eine primitive Aufgabe nehmen?
>
> nimm einen NE555 und beschalte ihn als Astabile Kippstufe:

Das ist natürlich die eleganteste Lösung, nur brauche ich diesen 
Pulsgenerator nur kurz für einen Test. Und NE555 hab ich keinen bei der 
Hand.

von Thomas E. (thomase)


Lesenswert?

Philk schrieb:
> Wozu einen µC für so eine primitive Aufgabe nehmen?
Weil dem Controller das sowas von egal ist.

> nimm einen NE555 und beschalte ihn als Astabile Kippstufe:
Grauenhaft. Mit einem µC braucht man gar keine externe Beschaltung.

mfg.

von Bernhard S. (b_spitzer)


Lesenswert?

Also zu allererst sollte Dir klar sein, dass dein Controller Spannungen 
über 5V weder am Eingang mag noch am Ausgang erzeugen kann. Ich habe mal 
vor einiger Zeit einen per serieller Schnittstelle steuerbaren 
Impulsgenerator programmiert. Nach Übertragung eines Textstrings erzeugt 
er das gewünschte Signal.
Ohne Gewähr: (die LCD-Funktionen kann man ganz weglassen oder du musst 
sie anpassen)
1
/*  Pulsgenerator
2
   Erzeugen eines unsymmetrischen Rechtecksignals am Ausgang
3
   Die Puls- und Pausendauer kann per serieller Schnittstelle 
4
  in Schritten von 100us-100ms konfiguriert werden.
5
  Protokoll dazu mit 9600Baud:
6
  Piiii.pppp z.B. P0015:0200 erzeugt ein Servo-Signal mit 1,5ms/20ms
7
*/
8
#include <stdio.h>            //  für sprintf                          
9
#include <intrins.h>            //  Intrinsische Funktionen z.B._nop_()                  
10
11
#include <defines.h>            // Abkürzungen
12
13
#include <at89c5131.h>          //  Registeradressen  
14
//#include <at89s4051.h>          //  Registeradressen  
15
16
#include "..\..\lcd.h"
17
18
/****************   Definitionen *********************************************/
19
/* Zustände der Zeichenprüfung */
20
#define  Idle      0
21
#define  Start      1
22
#define  Puls1      2
23
#define  Puls2      3
24
#define  Puls3      4
25
#define  Puls4      5
26
#define  Separator  6
27
#define  Pause1    7
28
#define  Pause2    8
29
#define  Pause3    9
30
#define  Pause4    10
31
#define  Ende      11
32
#define  Fehler    99
33
34
/****************   Globale Variablen ****************************************/
35
data at 0x7E uI16  Ticks;
36
data uI16 Puls, Pause, Periode;
37
 
38
sbit Ausgang1 = P2^0;      // Signalausgang 1
39
40
//****************   Funktionen ***********************************************
41
void init(void);
42
void Timer0_Tick(void) interrupt 1;
43
void Timer_init(uC8 Timer, uC8 Mode, uC8 High, uC8 Low);
44
45
// Ausgabe einer 4-Stelligen Zahl ab Pos
46
void myprintf40(uC8 Pos, uI16 Zahl);
47
// Ausgabe einer 3.1-Stelligen Zahl ab Pos      
48
void myprintf31(uC8 Pos, uI16 Zahl);
49
//****************  Hauptprogramm  *******************************************
50
51
void main(void)
52
{  uC8 Zeichen, Zustand=Idle, Buf[20];
53
  //uC8 Tausender, Hunderter, Zehner, Einer, Zehntel;
54
  uI16 Temp;
55
56
  init();
57
  Periode=0;
58
  
59
  while(1)
60
  {
61
    if(RI)
62
    {
63
      RI = 0;
64
      Zeichen = SBUF;
65
      switch (Zustand)
66
      {
67
        case Idle  : if(Zeichen == 'P') Zustand=Puls1; break;
68
        /* Pulsdauer aus 4 ASCII-Zeichen zusammensetzen */
69
        case Puls1  : Temp = Zeichen - 0x30; Zustand=Puls2; break;
70
        case Puls2  : Temp = Temp * 10 + (Zeichen - 0x30); Zustand=Puls3; break;
71
        case Puls3  : Temp = Temp * 10 + (Zeichen - 0x30); Zustand=Puls4; break;
72
        case Puls4  : Temp = Temp * 10 + (Zeichen - 0x30); Zustand=Separator; break;
73
        /* Separator : prüfen */
74
        case Separator  :   if(Zeichen == ':')
75
                     {   Puls = Temp;       // Korrekt, Puls übernehmen
76
                       Zustand=Pause1;     // danach Pause lesen
77
                        break;
78
                      }
79
                      else 
80
                      {  Zustand = Fehler;
81
                        break;                      
82
                      }
83
        case Pause1  : Temp = Zeichen - 0x30; Zustand=Pause2; break;
84
        case Pause2  : Temp = Temp * 10 + (Zeichen - 0x30); Zustand=Pause3; break;
85
        case Pause3  : Temp = Temp * 10 + (Zeichen - 0x30); Zustand=Pause4; break;
86
        case Pause4  : Temp = Temp * 10 + (Zeichen - 0x30); Zustand=Ende; break;
87
        /* Ende CR: prüfen */
88
        case Ende  :   if(Zeichen == ' ')        // Zeilenschaltung
89
                     {   Pause = Temp;       // Korrekt, Puls übernehmen
90
                       Periode = Puls + Pause;
91
                       Zustand=Idle;       // fertig
92
                       //sprintf(Buf,"ti:%4d, tp:%4d",Puls, Pause);
93
                       sprintf(Buf,"%4d+%4d=%4d",Puls, Pause,Periode);
94
                       textlcd(Buf, 2);
95
                        break;
96
                      }
97
                      else 
98
                      {  Zustand = Fehler;
99
                        break;                      
100
                      }
101
        case Fehler  :   Zustand=Idle; textlcd("Formatfehler", 2); break;
102
        default: break;
103
      }
104
    }
105
  }
106
}
107
108
109
/* System-Ticks alle 100us
110
  Puls wird bei Beginn der Periode gesetzt, nach Pulsdauer wieder gelöscht */
111
void  Timer0_Tick(void) interrupt 1
112
{  Ticks++; 
113
  if(Ticks>=Periode)
114
  {  Ticks=0;
115
    Ausgang1 = 1;      // Ausgang setzen, 1 Periode ist vorbei
116
  }
117
  if(Ticks==Puls)
118
  {
119
    Ausgang1 = 0;      // Pulsdauer vorbei
120
  }
121
}
122
123
/* Initialiserung für Timer 0 oder 1
124
  Übergabe von Timernummer, Mode und Startwerten */
125
void  Timer_init(uC8 Timer, uC8 Mode, uC8 High, uC8 Low)
126
{
127
  if (Timer==1) 
128
  {
129
    TMOD |= (Mode & 0x0F) << 4;
130
    TH1 = High;
131
    TL1 = Low;
132
    TR1 = 1;
133
  }
134
  else
135
  {
136
    TMOD |= (Mode & 0x0F);
137
    TH0 = High;
138
    TL0 = Low;
139
    TR0 = 1;
140
  }
141
}
142
143
/* Initialiserung serielle Schnittstelle
144
  nutzt den Baudratengenerator des AT89C5131 */
145
void  init_seriell(void)
146
{
147
  PCON|= 0x80;      // SMOD setzen
148
  BDRCON = 0x1F;      // Baudratengenerator nutzen
149
  BRL = 236;        // 217: 9600 Baud 236: 19200
150
  SCON = 0x52;      // 8Bit UART, TI gesetzt
151
}
152
153
/* Ausgabe einer 4-Stelligen Zahl ab Pos*/
154
void myprintf40(uC8 Pos, uI16 Zahl)
155
{        
156
  cursorpos(Pos);
157
  // Tausender
158
  charlcd(0x30 + Zahl/1000);
159
  Zahl = Zahl%1000;
160
  // Hunderter
161
  charlcd(0x30 + Zahl/100);
162
  Zahl = Zahl % 100;
163
  // Zehner
164
  charlcd(0x30 + Zahl /10);
165
  // Einer
166
  charlcd(0x30 + Zahl % 10);
167
}
168
169
/* Ausgabe einer 3.1-Stelligen Zahl ab Pos */
170
void myprintf31(uC8 Pos, uI16 Zahl)
171
{
172
  cursorpos(Pos);
173
  // Hunderter
174
  charlcd(0x30 + Zahl/1000);
175
  Zahl = Zahl % 1000;
176
  // Zehner
177
  charlcd(0x30 + Zahl /100);
178
  Zahl = Zahl % 100;
179
  // Einer
180
  charlcd(0x30 + Zahl / 10);
181
  charlcd(',');
182
  charlcd(0x30 + Zahl % 10);
183
}
184
185
/* Init-Funktion, wird für Konfiguration der Peripherie verwendet */
186
void init(void)
187
{
188
  initlcd();
189
  textlcd("Pulsgenerator   ",1);
190
  textlcd("V 1.0           ",2);
191
  init_seriell();
192
  // Timer 0, Mode 2, 100us Reload = (256-100)
193
  Timer_init(0,2,156,156);
194
  ET0 = 1;    // Timer-Interrupt
195
  EA = 1;    // Gloable Freigabe
196
}

tschuessle
Bernhard

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.