Hy! Arbeite mit einem Atmega8 und hab nen Quarztakt von 16Mhz. Undzwar hätt ich ne Frage in Bezug auf die Timers. Ich brauch einen Timer der auf 1µs genau geht. Jetzt stellt sich die Frage welchen Timer ich nehmen soll und weiters ist es überhaupt möglich 1µs zu schaffen?????
Hi, Wenn Du den Timer von 0 auf 15 zählen lässt, dauert das genau 1/16000000*16=0,000001s =1us Gruß Andreas
Egal welcher Timer. Wenn Du bei 16MHz Vorteiler = 16 verwendest, zählt er pro uS eins weiter. Ist also möglich.
type ctc | prescaler 1 | value 1000000.000 Hz | delta 0.000% | ctc 15 type ctc | prescaler 8 | value 1000000.000 Hz | delta 0.000% | ctc 1
ich würde gerne den 16 Bit Timer (16Mhz Quarztakt) verwenden und hab schon einiges ausprobiert und im Datenblatt nachgeschaut, jedoch ohne erfolg!! Es wäre hilfreich wenn mir jemand den Code (in C) der für die Timereinstellung benötigt wird posten könnte pls
Hallo, mit AVR's kenne ich mich als einer der wenigen hier nicht aus (PIC-Nutzer). Prinzipiell sollte es aber so z.B. funktionieren (ohne Interrupts): -Du wählst die Clock Source für Timer0 im TCCR0 Register als "1" -Jetzt schreibst du ins TCNT0 Register den Wert "240" -und machst eine leere while(TCNT0); Schleife damit zählt Timer0 von 240 bis 255 hoch und springt dann auf 0 zurück. Das sind 16 Zählschritte bei 16MHz was dann 1µs ist.
1 | void pause(void) |
2 | {
|
3 | TCCR0 = 1; |
4 | TCNT0 = 240; |
5 | while(TCNT0); |
6 | }
|
wenn du jetzt die Funktion pause() aufrufst wartet der Prozessor 1µs Man möge mich korrigieren wenn ich schwachfug geschrieben habe.
Danke @ Alex! Mein Aufgabe ist es, dass ich einen Pin am Port von 1µs bis 200ms auf low bzw high halten muss. Kann ich da einfach ich die funktion void pause() biliebig lang aufrufen und startet der timer0 von meinem Atmega8 einfach mit while(TCNTO)?????
Ach so, ich hatte dich so verstanden, dass du nur genau 1µs brauchtest.
1 | void pause(long delay) |
2 | {
|
3 | TCCR0 = 1; |
4 | while(delay) |
5 | {
|
6 | TCNT0 = 240; |
7 | while(TCNT0); |
8 | delay--; |
9 | }
|
10 | }
|
Jetzt kannst du z.B. pause(100) aufrufen und hast dann eine Verzögerung von 100µs. Reicht es für deine Anwendung, wenn du: PORTA.0 high setzt, pause(100); anwendest PORTA.0 low setzt? Oder musst du während der Port high ist noch andere Sachen erledigen?
>Eine Frage noch: kann man den Timer starten, anhalten und stoppen
auch???
Wo ist der Unterschied zwischen Anhalten und Stoppen?
Der Timer hört auf zu zählen, wenn du TCCR0 = 0; setzt.
Guck' dir mal das Datenblatt an, da steht alles über die Timer drin. Eine variable Wartezeit kannst du komfortabel und genau über den Output-compare-INT machen. Bei der Schleife oben ist 1. der µC für die Pause 'blockiert', 2. stimmt die Zeit nicht mehr wenn andere INTs aktiv sind und 3. hast du wegen der Laufzeit der Befehle bei 100 Durchläufen auch eine Abweichung.
@Mellon Teste das aber sorgfältig. Ich denke nämlich nicht das das hier sauber funktioniert.
1 | void pause(long delay) |
2 | {
|
3 | TCCR0 = 1; |
4 | while(delay) |
5 | {
|
6 | TCNT0 = 240; |
7 | while(TCNT0); |
8 | delay--; |
9 | }
|
10 | }
|
Wenn der Timer mit einem Vorteiler von 1 läuft ist es mehr oder weniger Zufall, wenn du ihn in while(TCNT0); genau dann erwischt, wenn er 0 geworden ist. Wenn es nur darum geht einen einzelnen Impuls mit definierter Länge zu erzeugen, würde ich den Timer1 (da 16 Bit) dafür hernehmen und schauen das ich das mit einem zusätzlichen Pin Toggle am Timer hinkriege.
Hab diesen Sofwareteil implementiert und der Timer zählt brav!! Beim Testen ist mir aufgefallen, dass ich er nur einmal bis 255 zählt und nicht wieder anfängt!!!! Kann mir irgendwer bitte helfen, wichtig!!!
Das ist fast das ganze Programm(ohne output()) und ich hoffe irgendwer findet den Fehler(Timer zählt nur einmal, das bedeutet nur bei i=0, bei i=1 zählt er nicht mehr)!
1 | #include <mega8.h> |
2 | |
3 | void settimer(); |
4 | void output(); |
5 | |
6 | unsigned long int delaytime=5000000; |
7 | |
8 | void settimer() |
9 | { unsigned long int i=0; |
10 | |
11 | for(i=0;i<delaytime;i++) |
12 | {
|
13 | TCNT0=240; |
14 | TCCR0=1; |
15 | while(TCNT0); |
16 | }
|
17 | }
|
18 | |
19 | void main(void) |
20 | { TIMSK=0x00; |
21 | TCCR0=0x01; |
22 | |
23 | for(;;) |
24 | {
|
25 | if(!(PINB&0x02)) //Abfrage, ob PIN(PB1) High ist |
26 | { settimer(); |
27 | output(); |
28 | }
|
29 | }
|
30 | }
|
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.