Forum: Compiler & IDEs Timer Compare Match Problem


von Ilea U. (auftrag2007)


Lesenswert?

ich brauche ein periodische Ein-Aussignal am Ausgang PORTD1
hier ist der Code

#include <inttypes.h>
#include <avr/interrupt.h>
#include <avr/io.h>

#ifndef F_CPU
#define F_CPU 16000000UL     // Quarz mit 16.0000 Mhz
#endif

unsigned int i;

ISR(TIMER0_COMP_vect){
  if (i == 0){
    PORTD |= (1<<PORTD1);  //PIND1 als 1 setzen
    i++;
  }
  else{
    PORTD &= ~(1<<PORTD1);  //PIND1 als 0 zurücksetzen
    i = 0;
  }
}

int main(void){

  TCCR0 |= (1<<WGM01) | (1<<CS01);  // CTC Modus, 16/8 MHz,
  TIMSK |= (1<<OCIE0);    Compare Match Interrupt enable

  //wenn Wert aus TCNT0 Register gleich 255, Interrupt ausgelöst
  OCR0 = 0xFF;

  sei();

  while(1){
    return 0;
  }
}

Der Vorgehensweise nach meine Meinung würde so laufen...

am Anfang i = 0;

für erste Auslösen der Interrupt
weil i gleicht 0 ==> PD1 = High
"gleichzeitig" ist Inhalt in TCNT0 wieder gelöscht, Zeitzähler Register 
zurück auf 0
danach inkrementiert i auf 1

für zweite Auslösen der Interrupt
weil i gleicht 1 ==> PD1 = Low
"gleichzeitig" ist Inhalt in TCNT0 wieder gelöscht, Zeitzähler Register 
zurück auf 0, und natürlich ist i wieder nach 0 zurückgesetzt

für dritte...  periodisch
für vierte...  periodisch


leider liegt die Ausgangspannung PD1 immer an null, welche Gedankfehler 
habe ich hier gemacht?

von Johannes M. (johnny-m)


Lesenswert?

> welche Gedankfehler habe ich hier gemacht?
Wie wäre es, wenn Du Dich dem vernachlässigten Register DDRD widmest und 
den Portpin als Ausgang konfigurierst?

von kosmonaut pirx (Gast)


Lesenswert?

hallo,
ich vermute auch, das dein Data Direction Register noch auf Default 
steht. Ergo ist der Port als eingang definiert. und dort wird nur der 
pull-up gezogen, wenn du auf eins setzt.

ergo: DDRD |= 1<<DDD1)

bei sowas ..
1
while(1){
2
    return 0;
3
  }
graut es mir. gut, dass die libgcc so nett ist und das programm am leben 
lässt.
bye kosmo

von Ilea U. (auftrag2007)


Lesenswert?

Menschskind, es tut endlich wieder!!!!!

Danke für deine Hilfe

bin schon zweistellige Stunden aufgehängt, endlich geschafft

Definition der Datenrichtung ist nicht "nachverlässig"!!!!

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.