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; }
>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.
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
Christian Gruber schrieb: > Kann ich meinen µC als Funktionsgenerator verwenden? http://de.wikipedia.org/wiki/Funktionsgenerator Gruss Harald
Dann schalte ich eben mit dem µC einen Transistor und über diesen dann die 9V
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.
Hallo Christian, Ein Funktionsgenerator kann z. B. Sinus, Dreieck, Rampe, Rechteck und eventuell auch beliebige Kurvenformen. Was du suchst nennt sich Pulsgenerator.
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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.