Forum: Mikrocontroller und Digitale Elektronik Atmega8 - Programmierung in C


von Benulba (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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
}

von Purzel H. (hacky)


Lesenswert?

>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 ?

von Benulba (Gast)


Lesenswert?

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.

von Benulba (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.