Vielleicht könntest du mal zeigen womit du nicht zurecht kommst, ist sicher einfacher.
Moin zusammen!
Ich möchte mit einem ATMEGA 32/16Mhz an PB0 externe Rechteckimpulse zählen(für ene bestimmte Zeit )also zusätzlich noch einen internen Timer benutzen!(Drehzahl Bestimmung max 16000 impulse pro Minute)
Nun werde ich wohl um das Thema Interrupt routinen und Timer nicht herumkommen!
Ich habe mich nun intensivst mit den beiden Themen beschäftigt aber nach nun knapp einer Woche bin ich leider zu noch überhaupt keinem Ergebnis gekommen!
Ich verstehe das mit den Registern und den Timern ...etc. einfach nicht!
Dabei benötige ich ja eigentlich nur wenige Befehle!
Ich programmiere in C!
Weiterhin möchte ich eine Spannnung an PA7 abfragen und dann einen Schaltzustand an einem Port erwirken!
Wenn PA7 zwischen 1000 und 1024(High) dann soll PC4 HIGH sein
...aber nach nochmaligen betätigen soll PC4 wieder LOW sein!
Die Abfrage der Ports und das Schalten der Zustände ist klar , aber bei meinen Programmierversuchen funktioniert immer nur der Zustand der in der Syntax als erstes steht!Habe es mit Pointern probiert um die AN/AUS Bedingungen gegeneinander zu verriegeln aber geht auch nicht!!!
Ich befürchte das hier eine Interrupt Routine angebracht ist aber auch mit diesem Thema habe ich wahrlich noch keine Fortschritte erzielen können!
Habe nun schon viele Tutorien durch, verstehe aber nichts!
Vielleicht könnt Ihr mir ja etwas auf die Sprünge helfen!
Viele Grüße Stephan
Vielleicht könntest du mal zeigen womit du nicht zurecht kommst, ist sicher einfacher.
Ich weiß nicht , wie ich die Funktion :
int zähl_Pulse(void)
mit Pulsen an PB0 für 500 ms zählen...
und einen Interrupt programmieren soll der mir bei der Betätigung eines Tasters (High an PB7) einen anderen Port auf HIGH/LOW schaltet
Grüße Stephan
Im Timer0 gibt es die Option Ext. Clock Source.
Interrupt Timer Overflow aktivieren, im Interrupt eine Variable hochzählen.
Mit Timer1 eine Zeitbasis generieren mit alle 0,5sec. ein Interrupt.
Mit Start von Timer1 wird auch Timer0 gestartet, nach 0,5sec werden beide Timer gestoppt.
Anzahl der Überläufe von Timer0 *256 + dem Zählerstand von Timer0 ergibt die Anzahl der Takte in 0,5sec.
Tastenerkennung machst du am besten durch pollen, prellen der Taste berücksichtigen.
Erstmal vielen Dank für die Antwort! Aber ich weiß einfach nicht welche Befehle ich für welchen Timer nehmen muß oder welche Register ich wann auslesen muß und wie die heißen!Ich habe echt null Ahnung von Timern und Interrupts!Auch was Polling ist weiß ich nicht!
Egal was ich darüber lese ich kann aus keinem Tutorial etwas sinnvolles für mich herausfiltern!
Viele Grüße Stephan
So, ich habe mal was probiert aber es klappt nicht!!!
int drehzahl_MOT(void)
{
int n = 0;
OCR1AH = 0x0c; //Torzeit festlegen 200ms (16Mhz/1024)/5
OCR1AL = 0x35;
TCCR1A = TCCR1A | ~(1<< COM1A1) | ~(1<< COM1A0); //TIMER 1 NORMAL PORT OPERATIONS
TCCR0 = TCCR0 | (1<< CS02) | (1<< CS01) | (1<< CS00); //TIMER0:EXT. Takt an PB0 Steigende Flanke zählen
TCCR1B = TCCR1B | (1<< CS12) | ~(1<< CS11) | (1<< CS10); //TIMER1:PRESCALE 16MHZ/1024 START
while((1<< OCF1A))n = TCNT0; //Abfrage COMPARE Register Timer 1 wenn TORZEIT erreicht ---->dann weiter
TCCR0 = TCCR0 | ~(1<< CS02) | ~(1<< CS01) | ~(1<< CS00); //TIMER0 STOPP
TCCR1B = TCCR1B | ~(1<< CS12) | ~(1<< CS11) | ~(1<< CS10); //Timer1 STOPP
TIFR = TIFR | (1<< OCF1A); //COMPARE-FLAG rücksetzen
TCNT0 = 0x00;
TCNT1H = 0x00;
TCNT1L = 0x00;
return n;
}
ich weiß echt nicht weiter !Ich kappiere das einfach nicht mit den Timern und den Interrupts!!!
WER KANN MIR HELFEN???
Viele Grüße Stephan
Zum einen verwendest du hier keinen Interrupt.
Bits in einem Register löscht man so:
TCCR1B &= ( ~(1<< CS12) | ~(1<< CS11) | ~(1<< CS10)); //Timer1 STOPP
Schau dir mal diese Tutorial an:
http://www.mikrocontroller.net/artic...R-GCC-Tutorial
Hier kannst auch mal reingucken (aufmerksam lesen und versuchen es zu verstehen) http://www.rn-wissen.de/index.php/Timer/Counter_(Avr)
Also ich habe diese tutorials jetzt zum xten mal durch aber mir erschließt sich einfach nicht das Zusammenspiel der Timer und der Interrupts und die Anwendung der dazugehörigen Befehle!!!!
Ich möchte doch nur für eine frei wählbare Zeit Pulse an PB0 zählen!
Tut mir leid ich verstehe das alles nicht!
Vielen Dank für eure Hilfe und viele Grüße Stephan
So, der letzte Versuch!! Was mache ich falsch der Compiler macht nichts daraus!!!
Vielleicht könnt ihr mir ja mal etwas tatkräftiger unter die Arme greifen anstatt dauernd auf die Tutorials zu verweisen!!!Das hilft mir auch nicht allzusehr weiter!
int n = 0;
TCCR1A = 0x00; //TIMER1 kein PWM ,Normale Portfunktion
TCCR1B = 0xcd; //Fette Modifizierung
OCR1AH = 0x30; //Schreiben Torzeit Kompare-Register High-Byte
OCR1AL = 0xd4; //Schreiben Torzeit Kompare-Register Low-Byte
TCCR0 = 0x07; //Grob:TIMER0 zähler bei steigender Flanke
TIMSK |= (1<<OCIE1A); // Compare Interrupt erlauben
sei(); // Global Interrupts aktivieren
ISR (TIMER1_COMPA_vect)
{
n = TCNT0;
TCNT0 = 0;
TCCR0 = 0x07; //Grob:TIMER0 zähler bei steigender Flanke
}
das habe ich mitten in die Main gepflanzt und habe gehofft das nun n von jeder Stelle im Programm gelesen werden könnte!
Viele Grüße Stephan
Lesezeichen