Forum: Mikrocontroller und Digitale Elektronik Atmega8 Pin defekt?


von Patrick L. (crashdemon)


Angehängte Dateien:

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?

von Karl H. (kbuchegg)


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.

von Patrick L. (crashdemon)


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
}

von Zip (Gast)


Lesenswert?

Den gleichen infomationsgehalt des Bildes kann man doch sicher in < 5kB 
unterbringen?

von Spess53 (Gast)


Lesenswert?

Hi

>DDRD |= (1 << DDD6) | (DDD7);

Damit schaltest du PD6,PD2,PD1 und PD0 auf Ausgang.

MfG Spess

von mrc (Gast)


Lesenswert?

nur schonmal vorweg:
DDRD |= (1 << (DDD6 | DDD7));
wäre auch falsch ;-)
Grundlagen!

von Raff (Gast)


Lesenswert?

Patrick L. schrieb:
> DDRD |= (1 << DDD6) | (DDD7); // PD6, PD7 as Output

versuchs mal mit DDRD |= (1 << DDD6) | (1 << DDD7)

von Patrick L. (crashdemon)


Lesenswert?

Ach, verdammt bin ich Blind, soll natürlich so aussehen:

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

Jetzt fluppt es, peinlich peinlich.
Danke für die schnelle Hilfe.

von Fabian O. (xfr)


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.

von marixstorm (Gast)


Lesenswert?

Menschen, nutzt mehr Makros ;-) :

DDRD |= _BV(DDD6) | _BV(DDD7);

(Wollte nur auch was dazu sagen ;-) )

von Patrick L. (crashdemon)


Lesenswert?

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

Ja, danke für den Tipp.

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.