µC als Funktionsgenerator

OP #2776535
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;

}
#2777308
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

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