Forum: Mikrocontroller und Digitale Elektronik Atmega 328P LED will nicht richtig über Interrupts blinken


von Markus (Gast)


Lesenswert?

Liebe Genies,

ich versuch schon den ganzen tag simpelst eine LED über interrupts 
blinken zu lassen. Ich habe gefühlt 100 beiträge gelesen, finde dennoch 
meinen Fehler nicht. der Atmega 328 lauft auf einer platine auf 20MHz.
Vielleicht findet ja einer von euch meine(n) Fehler?
tausend Dank im Vorraus

Markus



#include <avr/io.h>
#include <asf.h>
#include <math.h>
#include <stdlib.h>
#ifndef F_CPU
#define F_CPU 20000000UL
#endif
#include <util/delay.h>
#include <avr/interrupt.h>


void servo_init(void);

#define SERVOPIN 1
#define SERVOPORT PORTD
#define DDRSERVO DDRD

int t=0;


ISR(TIMER0_COMPA_vect)        //interrupt
  {

    t++;

  }

void servo_init(void)
{
  TIMSK0|=(1<<OCIE0A);                 //interrupts
  TCCR0B |= (1<<CS00);                 //Prescale=1,
  TCCR0A |= (1<<WGM01);                 // CTC mode
  OCR0A = 199;                   //alle 10µs ein IRQ 0,00001s
  DDRSERVO|=(1<<SERVOPIN);               //LED Pin als ausgang

}

int main (void)
{


  servo_init();
  sei ();                //iknterrups an

  while(1)
  {

  if (t<20000)SERVOPORT|=(1<<SERVOPIN);  //bis zum 20000. durchlaufen 
des Interrupts LED AN (200ms)
  else SERVOPORT |=~(0<<SERVOPIN);  //ab dann LED AUS
  if(t>40000) t=0;      // bei 40000. interruptdurchlauf t zurücksetzen 
(insg. 400ms)

    }
  }

von Stefan E. (sternst)


Lesenswert?

Markus schrieb:
> Ich habe gefühlt 100 beiträge gelesen

Und in keinem bist du über "volatile" gestolpert?


Und so nebenbei: "if (t>40000)" wird niemals wahr.

: Bearbeitet durch User
von Markus (Gast)


Lesenswert?

Und genau des versteh Ich Net. Warum des?
Vilen dank schonmal. Genau danach sahs aus und Ich kapier Net warum.

von Georg G. (df2au)


Lesenswert?

Markus schrieb:
> else SERVOPORT |=~(0<<SERVOPIN);  //ab dann LED AUS

auch diese Zeile tut bestimmt nicht das, was du von ihr erwartest. Eine 
geschobene Null bleibt eine Null, egal, wie oft man schiebt.

von Stefan E. (sternst)


Lesenswert?

Markus schrieb:
> Und genau des versteh Ich Net. Warum des?

Weil ein int gar nicht so groß werden kann um die Bedingung wahr werden 
zu lassen.

von Grauenhaft (Gast)


Lesenswert?

Markus schrieb:

> Und genau des versteh Ich Net. Warum des?
> Vilen dank schonmal. Genau danach sahs aus und Ich kapier Net warum.


Zwei Buchempfehlungen:

Kernighan & Ritchie: Programmieren in C

Duden: Die deutsche Rechtschreibung

von I am the Wunderer, yeah the Wunderer (Gast)


Lesenswert?

Andere Empfehlung:
Die Schweinesprache "C" in den Skat drücken und etwas weniger 
Fehlerträchtiges erlernen.

von Markus (Gast)


Lesenswert?

die int wars...
ich idiot habs im Internet gesucht wie groß ne int is und da hab ichs 
anscheinend falsch aus der Tabelle gelesen.
Vielen dank an die Schreiber.

von 老头儿 (Gast)


Lesenswert?

I am the Wunderer, yeah the Wunderer schrieb:
> Die Schweinesprache "C" in den Skat drücken und etwas weniger
> Fehlerträchtiges erlernen.

Dieses Relikt aus dem vorigen Jahrtausend ist wohl nicht so einfach tot 
zu kriegen.

von Vn N. (wefwef_s)


Lesenswert?

I am the Wunderer, yeah the Wunderer schrieb:
> Andere Empfehlung:
> Die Schweinesprache "C" in den Skat drücken und etwas weniger
> Fehlerträchtiges erlernen.

Süß. Blöderweise sind so dinge wie die geschobene Null oder die Größe 
eines Integers erstmal sprachunabhängig.

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.