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?
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.
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 | }
|
Den gleichen infomationsgehalt des Bildes kann man doch sicher in < 5kB unterbringen?
Hi
>DDRD |= (1 << DDD6) | (DDD7);
Damit schaltest du PD6,PD2,PD1 und PD0 auf Ausgang.
MfG Spess
nur schonmal vorweg: DDRD |= (1 << (DDD6 | DDD7)); wäre auch falsch ;-) Grundlagen!
Patrick L. schrieb: > DDRD |= (1 << DDD6) | (DDD7); // PD6, PD7 as Output versuchs mal mit DDRD |= (1 << DDD6) | (1 << DDD7)
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.
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.
Menschen, nutzt mehr Makros ;-) : DDRD |= _BV(DDD6) | _BV(DDD7); (Wollte nur auch was dazu sagen ;-) )
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.