CCDFFT
05.02.2011, 20:24
Hi,
ich habe folgendes Problem/Lösungsansatz:
Der Timer 1A und B sollen exact gleichzeitig schalten, dabei aber invers zueinander sein. Um das zu erreichen habe ich folgenden Code überlegt (Der funktioniert):
OCR1A=0xFFFF; //Set maximum limit
OCR1B=speed;
TCCR1A=0b01010000;
TCCR1B=0b00001101; //CTC mode running,toggle on match, prescaler 1024!!
while(TCNT1<=(speed+6)){} //Wait till PD4 is High-level
TCNT1=0xFFF0; //Set TCNT shortly before overflow
OCR1A=speed; //Pd5 is high, PD4 low level. Set common toggle limit
TIFR |= (1<<OCF1A);
TIMSK |= (1<<OCIE1A); //Enable Interrupt for counting
DDRD |=(1<<PD4);
DDRD |=(1<<PD5);
Klappt soweit sehr schön, braucht aber einige µs um den Timer zu starten.
Jetzt möchte ich den Timer für eine gewisse Zeit ausschalten während ein anderer Timer läuft. Die Pegel von OC1A und B sollen in dieser Zeit beide auf 0V sein.
Das wiedereinschalten des Timers darf aber nicht mehr als 2µs, also ca 8 Takte dauern.
Ich hatte mir nun überlegt, dass ich den Timer einfach Stummschalte, indem ich in ihn stoppe. Wenn ich nun die Ports auf normalbetrieb umschalte um sie beide auf Low zu setzten, laufen sie wenn man den Timer wieder startet paralell.
Deshalb habe ich den Port statdessen als Eingang deklariert und will nun den 0-Pegel einfach mit hilfe eines anderen Ports erzeugen. Ich hab bereits probiert den Timer zu stoppen, als Eingang zu stetzen, wieder zu starten und als Ausgang zu deklarieren. Tut genau was es soll. Timer gibt kein Signal mehr aus und macht anschließend da weiter wo er aufgehört hat. Das ganze dauert auch nur 0,6µs, liegt also gut in der Zeit.
Ich frage mich nun welchen Zustand hat ein Timer als Eingang hat? Kann ich einfach mit 2 anderen Ports die beiden Pins auf 0V ziehen? Ich würde noch einen 50k-widerstand dazwischen löten, damit nicht bei einem Programmfehler 4 Ports miteinander ringen.
(Ich mach keinen Widerstand zur Masse, nachdem ich eventuell auch 5V an den Ports brauche).
Ich kann hier grad keine Zeichung machen, wenn ich daheim bin mach ich noch eine falls das hier noch nicht klar ist.
Danke schonmal
ich habe folgendes Problem/Lösungsansatz:
Der Timer 1A und B sollen exact gleichzeitig schalten, dabei aber invers zueinander sein. Um das zu erreichen habe ich folgenden Code überlegt (Der funktioniert):
OCR1A=0xFFFF; //Set maximum limit
OCR1B=speed;
TCCR1A=0b01010000;
TCCR1B=0b00001101; //CTC mode running,toggle on match, prescaler 1024!!
while(TCNT1<=(speed+6)){} //Wait till PD4 is High-level
TCNT1=0xFFF0; //Set TCNT shortly before overflow
OCR1A=speed; //Pd5 is high, PD4 low level. Set common toggle limit
TIFR |= (1<<OCF1A);
TIMSK |= (1<<OCIE1A); //Enable Interrupt for counting
DDRD |=(1<<PD4);
DDRD |=(1<<PD5);
Klappt soweit sehr schön, braucht aber einige µs um den Timer zu starten.
Jetzt möchte ich den Timer für eine gewisse Zeit ausschalten während ein anderer Timer läuft. Die Pegel von OC1A und B sollen in dieser Zeit beide auf 0V sein.
Das wiedereinschalten des Timers darf aber nicht mehr als 2µs, also ca 8 Takte dauern.
Ich hatte mir nun überlegt, dass ich den Timer einfach Stummschalte, indem ich in ihn stoppe. Wenn ich nun die Ports auf normalbetrieb umschalte um sie beide auf Low zu setzten, laufen sie wenn man den Timer wieder startet paralell.
Deshalb habe ich den Port statdessen als Eingang deklariert und will nun den 0-Pegel einfach mit hilfe eines anderen Ports erzeugen. Ich hab bereits probiert den Timer zu stoppen, als Eingang zu stetzen, wieder zu starten und als Ausgang zu deklarieren. Tut genau was es soll. Timer gibt kein Signal mehr aus und macht anschließend da weiter wo er aufgehört hat. Das ganze dauert auch nur 0,6µs, liegt also gut in der Zeit.
Ich frage mich nun welchen Zustand hat ein Timer als Eingang hat? Kann ich einfach mit 2 anderen Ports die beiden Pins auf 0V ziehen? Ich würde noch einen 50k-widerstand dazwischen löten, damit nicht bei einem Programmfehler 4 Ports miteinander ringen.
(Ich mach keinen Widerstand zur Masse, nachdem ich eventuell auch 5V an den Ports brauche).
Ich kann hier grad keine Zeichung machen, wenn ich daheim bin mach ich noch eine falls das hier noch nicht klar ist.
Danke schonmal