Atmega8 - Programmierung in C

Gast #2613280
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.
Angehängte Dateien:
#2613286
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
}
#2613295
>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 ?
Gast #2613320
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.
Gast #2614046
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.