Hallo, mit den Timer0 und Timer2 des ATmega32 steuere ich, 2 Galvanometer an um einen Laserstrahl abzulenken. Den Atmega32 verwende ich mit dem Pollinboard. ****Kleine Erklärung***** X-Achse: OCR0 von 0 bis 255 --> x1; bis x255; Definiert in "Namen.h" Y-Achse: OCR2 von 0 bis 255 --> y1; bis y255; Definiert in "Namen.h" OCR0 = 0 --> Punkt an der Projektionsfläche; links unten OCR0 = 1 --> kleiner Strich, Zunahme von links nach rechts, bei +1; OCR0 = 40 --> Strich fast komplette X-Achse im Bereich größer 40 bis 220, nur minimale Zunahme oder Abnahme, kaum merklich. Logarithmische Zu- und Abnahme. OCR0 221 bis 254 Strich Abnahme von links nach rechts OCR0 =255 --> Punkt rechts unten. Das selbe Verhalten gilt für die Y-Achse mit OCR2. ************************** Nun habe ich mir ein kleines Testprogramm geschrieben, um zu jedem OCR0 und OCR2 Wert die Spannung und den Strom messen zu können. Bei Betätigung von Taste1 (PD2) erhöht sich der OCR0-Wert jeweils um den von mir vorgegebenen Wert. Bei Betätigung von Taste2 (PD2) erhöht sich der OCR2-Wert jeweils um den von mir vorgegebenen Wert.
1 | **********************************************************************
|
2 | * Test Programm, zur Überprüfung der X-Achsen und Y-Auslenkung |
3 | *
|
4 | * x0 bis x255 OCR0 Werte von Timer0 für die X-Achse |
5 | * y0 bis y255 OCR2 Werte von Timer2 für die Y-Achse, ab Line 1000 |
6 | *
|
7 | * d1 entspricht delay von 15ms |
8 | * d2 entspricht delay von 50ms |
9 | * Werte können in "Namen.h" abgeändert werden |
10 | *
|
11 | ************************************************************************
|
12 | */
|
13 | #define F_CPU 16000000UL
|
14 | #include <avr/io.h> |
15 | #include <util/delay.h> |
16 | #include "Namen.h" |
17 | |
18 | #define Wartepin PIND
|
19 | #define Wartebit PD2 //Taste 1
|
20 | #define Wartebit2 PD3 //Taste 2
|
21 | |
22 | |
23 | int main(void) |
24 | {
|
25 | DDRB |=(1<<PB3); //PB3 als Ausgang |
26 | DDRD |=(1<<PD7); //PD7 als Ausgang |
27 | |
28 | |
29 | OCR0 = 0; //Start-Wert bei 0, X-Achse |
30 | OCR2 = 0; //Start-Wert bei 0, Y-Achse |
31 | |
32 | //Timer0 Phase Correct PWM /set OC0 on Comp Mat when up, clear when down //Prescaler 64
|
33 | TCCR0 |=(1<<WGM00)|(1<<COM01)|(1<<CS01)|(1<<CS00); |
34 | |
35 | //Timer2 Phase Correct PWM /set OC2 on Comp Mat when up, clear when down //Prescaler 64
|
36 | TCCR2 |=(1<<WGM20)|(1<<COM21)|(1<<COM20)|(1<<CS22); |
37 | |
38 | while(1) |
39 | {
|
40 | loop_until_bit_is_set(Wartepin, Wartebit); |
41 | |
42 | while((Wartepin & (1<<Wartebit))); //warte auf Taste1 |
43 | {
|
44 | x0;d2; // |
45 | }
|
46 | while((Wartepin & (1<<Wartebit))); |
47 | {
|
48 | x1;d2; // |
49 | }
|
50 | while((Wartepin & (1<<Wartebit))); |
51 | {
|
52 | x2;d2; // |
53 | }
|
54 | //usw.........
|
55 | while((Wartepin & (1<<Wartebit2))); //warte auf Taste2 |
56 | {
|
57 | y0;d2; // |
58 | }
|
59 | while((Wartepin & (1<<Wartebit2))); |
60 | {
|
61 | y1;d2; // |
62 | }
|
63 | while((Wartepin & (1<<Wartebit2))); |
64 | {
|
65 | y2;d2; // |
66 | }
|
67 | //usw..........
|
68 | }
|
69 | }
|
Jetzt ist es aber so, dass ich erst alle X-Werte mit Taster 1 durchdrücken muss, bevor ich mit Taster 2 die Y-Werte ändern kann. Gedacht hatte ich mir es so, dass ich zB. Taster1 5mal drücke, dann Taster2 2mal. Und somit dann bei x4; und y1; bin. Und wenn ich Taster1 noch 3mal und Taster2 10mal drücke ich x7; und y11; erhalte. Bin leider gerade etwas ratlos, in der Schule konnte mir auch niemand helfen und das Internet hat mich auch nicht weiter gebracht.