Liebe Community, ich will folgendes programmieren (erste Stufe): Folgender Pseudocode ist gedacht. - Schalter an PinB1 abfragen - Bei High (also gedrückt) soll uController anderen Pin abfragen, an dem eine Nulldurchgangserkennung hängt. Diese wechselt bei - nach + auf Low und bei + auf - auf High. Das Low Signal soll weiterverarbeitet werden (bzw. der Flankenwechsel von High auf Low) ICNC1 - Sobald die Flanke von High auf Low erkannt wurde, startet ein Timer, der 20ms verzögert und dann den Ausgang an dem im Moment ein Diode hängt auf High schaltet. Der uController taktet mit 4MHz. Leider komme ich im Moment nicht weiter...irgendwo ist der Fehler. Ich bin noch Programmieranfänger, also verzeigt mir den Stil.
Dann fang erst mal damit an, deinen Code in einem vernünftigem Format hier einzustellen. Das ist doch ein Unding, Code in ein PDF zu verpacken. Du kannst ruhig dein 20 Zeilen C-File hier als Attachment direkt anhängen (für dich am einfachsten, für uns am einfachsten) oder den Code einkopieren
1 | #include <avr/io.h> |
2 | #include <stdint.h> |
3 | #include <inttypes.h> |
4 | #include <avr/interrupt.h> |
5 | |
6 | void port_init (void) |
7 | {
|
8 | DDRC = 0b00000011; |
9 | PORTC = 0b00000000; |
10 | |
11 | DDRB = 0b00000001; |
12 | PORTB = 0b00000000; |
13 | }
|
14 | |
15 | void timer_init (void) |
16 | {
|
17 | TIMSK = (1<<TOIE1); |
18 | TCNT1 = 65536-10000; |
19 | |
20 | sei(); |
21 | }
|
22 | |
23 | void uController_init (void) |
24 | {
|
25 | if(bit_is_clear(PINB, PB0)) |
26 | {
|
27 | timer_init(); |
28 | }
|
29 | }
|
30 | |
31 | ISR(TIMER1_OVF_vect) |
32 | {
|
33 | PORTC |= (1<<PC0); |
34 | TIMSK &= ~(1<<TOIE1); |
35 | }
|
36 | |
37 | int main(void) |
38 | {
|
39 | port_init(); |
40 | |
41 | TCCR1B = (1<<ICNC1)|(0<<ICES1)|(1<<CS11); |
42 | |
43 | while(1) |
44 | {
|
45 | if(bit_is_set(PINB, PB1)) |
46 | uController_init(); |
47 | }
|
48 | }
|
>Bei High (also gedrückt) Nee. Mach Null=gedrueckt. Dann kannst du einen Widerstand sparen. >anderen Pin abfragen, an dem eine Nulldurchgangserkennung hängt. Nulldurchgang kann prellen, und kann auch nicht kommen. Was soll dann geschehen ?
Im Prinzip darf die Diode dann keinesfalls angehen, sobald der Nulldurchgang nicht richtig erkannt wurde. Es handelt sich dabei um die Spannungsnulldurchgangserkennung bei 50Hz, über den Timer soll eine zeitliche Verzögerung eingestellt werden (für die korrekte Funktionsweise der restlichen Schaltung), die aber von diesem erkannten Nulldurchgang abhängt.
Im Moment geschieht folgendes: Wird der Taster in der positiven Halbwelle betätigt, leuchtet die LED im direkt darauffolgenden Nulldurchgang auf. Hier soll aber bis zur Detektion des Nulldurchgangs gewartet werden, dann erst startet der Timer und nach 20ms soll die LED leuchten, also im nächsten Nulldurchgang, den der uController aber nicht mehr detektieren muss. Die Timereinbindung soll zuerst einmal nur das grundlegende Verständnis bringen. Wird der Taster in der negativen Halbwelle betätigt, leuchtet die LED sofort auf, egal in welcher Phasenlage die zu erfassende Spannung sich gerade befindet. Die LED darf aber nur leuchten, wenn der Wechsel von – nach + in der Spannung (Sinus) erfolgt. In der Hinsicht muss ich mir noch etwas überlegen. Es geht hier jetzt erst einmal darum, dass der Timer korrekt funktioniert. In dem oben angehängten C-File habe ich bereits kleinere Fehler ausgebessert, wie die Zuordnung der Pins als Ein- bzw. Ausgang.
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.