Atmega8 Pin defekt?

OP #3046051
Lesenswert?

Hallo Leute,

ich erzeuge mit dem Atmega8 und dem Timer1 ein Taktsignal (T = 0,2ms Ton 
= 0,1ms). Dazu habe ich den Timer so eingestellt das es alle 0,1ms zu 
einem Overflow kommt und die entsprechende ISR aufgerufen wird. In 
dieser ISR toggle ich die Pins PD6 und PD7 (Beide als Ausgang 
geschaltet). Analog Comperator habe ich explizit deaktiviert. An die 
Ausgänge ist soweit noch nichts angeschlossen, nur das Oszi (anbei das 
Bild).

PD7 im Bild die untere Wellenform
PD6 im Bild die obere Wellenform

Sieht wohl danach auch das sich der Pin PD7 verabschiedet hat, könnt ihr 
das bestätigen?
Angehängte Dateien:
#3046072
Lesenswert?

Patrick L. schrieb:

> Sieht wohl danach auch das sich der Pin PD7 verabschiedet hat, könnt ihr
> das bestätigen?

Das könnte genauso ein nicht auf Ausgang geschalteter Pin sein, dem du 
den Pullup zu und wegschaltest und dessen Ausgangsspannung deshalb durch 
kleine Kapazitäten sich nur langsam abbaut.

So ein µC hält schon ein etwas aus. So schnell ist der nicht hinüber.
Zeig halt mal dein Programm, dann kann man genaueres sagen. Aber aus der 
Erfahrung heraus: in mehr als 95% sitzt das Problem vor dem Bildschirm 
und nicht auf der Platine.
OP #3046095
Lesenswert?

Hier mal der Code...
1
ISR(TIMER1_OVF_vect)
2
{
3
  TCNT1 = -50; // overflow every 0,1ms
4
  PORTD ^= (1 << PD6);
5
  PORTD ^= (1 << PD7);
6
}
7

8
int main(void)
9
{
10
  cli(); // disable global interrupts
11

12
  DDRD |= (1 << DDD6) | (DDD7); // PD6, PD7 as Output
13

14
  ACSR = (1 << ACD); // disable analog comperator
15

16
  // initialization
17
  initTimer1();
18
  
19
  sei(); // enable global interrupts
20

21
  while(1)
22
  {
23
  }
24
}
25

26
void initTimer1(void)
27
{
28
  // timer 1
29
  TCCR1A = 0; // No Compare Output Mode or Waveform Generation
30
  TCCR1B = (1 << ICNC1) | (1 << CS11); // Input Capture Noise Canceler, Falling Edge,  Vorteiler 8 -> 4MHz / 8 = 500kHz Timer Frequenz 
31
  TCNT1 = -50; // Timer Register wird mit einem Wert vorbelegt
32
  TIMSK = (1 << TICIE1) | (1 << TOIE1); // Input Capture Interrupt Enable, Overflow Interrupt Enable 
33
}
#3046152
Lesenswert?

Noch eine Kleinigkeit: Die beiden Befehle
1
PORTD ^= (1 << PD6);
2
PORTD ^= (1 << PD7);
kannst Du auch in einer Anweisung machen:
1
PORTD ^= (1 << PD6) | (1 << PD7);
Dann passiert es gleichzeitig statt kurz nacheinander.

Außerdem wäre der CTC-Modus des Timers geeigneter. Dann kannst Du Dir 
das Laden des Counter-Registers sparen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren