Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
microcontrollertechnik:skript [2024/10/28 04:14] mexleadminmicrocontrollertechnik:skript [2024/10/28 05:04] (aktuell) mexleadmin
Zeile 253: Zeile 253:
         - halb so schnell weil doppelte Rampe         - halb so schnell weil doppelte Rampe
         - mitten zentriert         - mitten zentriert
-    - +    - weitere Register des TC anschauen 
 +      - TCNT1H/TCNT1L: ist der eigentliche Counter Wert 
 +      - OCR1AH/OCR1AL: ist Vergleichswert für den ersten Vergleich 
 +      - OCR1BH/OCR1BL: ist Vergleichswert für den zweiten Vergleich 
 +      - ICR1H/ICR1L: ist "Zwischenspeicher" der mit dem Counter-Wert gesetzt wird, sobald Pin ICP1 sich ändert 
 +      - erst TIFR1:  
 +        - zeigt Ereignisse an (über Flags): z.B. Vergleichswert ist erreicht, oder Maximalwert ist erreicht 
 +        - wenn ein Ereignis eintritt, dann kann ein Interrupt ausgelöst werden 
 +      - TIMSK1 : Ist eine Maske, die angibt, welcher Interrupt aktiv ist 
 +  - Mal Overflow Interrupt testen: 
 +    - bei Initialisierung: ''TIMSK2 |= (1<<TOIE1);'' 
 +    - außerhalb von main: 
 +      - ''ISR()'' --> suchen nach ISR (Goto implementation) liefert keine praktikable Antwort was das tut (Interrupt Service routine erklären) 
 +      - wir brauchen zumindest einen "vector" (Zeiger auf die Sprungadresse welche im Interruptfall abgearbeitet werden soll) 
 +      - woher bekommen?  
 +        - am besten da nachschauen, wo auch PORTB und PB1 definiert ist 
 +        - suchen nach vector 
 +        - ''TIMER1_OVF_vect''
 +      - Eingeben von ''ISR(T'' bietet schon ''TIMER1_OVF_vect'' an 
 +      - ''ISR(TIMER1_OVF_vect)'' \\ ''{'' \\ ''}'' 
 +      - was machen wir da drin? am besten z.B. Port B3 toggeln 
 +      - ''PORTB ^= (1 << PB3);'' einfügen 
 +    - testen --> toggelt! 
 +    - Wie könnte man nun die Ausgabe nur alle paar Zentelsekunden ausführen lassen? 
 +      - Alle Zeilen in den Interrupt? --> bloß nicht! 
 +      - SW_Flag in ISR setzen und in main auswerten 
 +        - ''uint8_t IntFlag=0;'' als globale Variable 
 +        - ''IntFlag=1;'' in die Interrupt Routine 
 +        - ''if(IntFlag==1)'' \\ ''{'' \\ ''IntFlag=0;'' \\ ... \\ ''}'' 
 +      - Geschwindigkeit zu langsam? 
 +        - statt ''TCCR1B |= 1<<CS12;'' besser ''TCCR1B |= 1<<CS11;'' 
 +      - Aber wie kommt man z.b. genau auf eine Millisekunde? 
 +      - Man nehme: 
 +        - Takt: 18.432 MHz  
 +        - 8-Bit Counter: zählt bis 256 (16 Bit geht nicht genau auf...) 
 +        - --> zählt 72'000x pro Sekunde bis 256 und löst Interrupt aus 
 +        - Prescaler von 8: zählt 8x so langsam, also nur 9'000 pro Sekunde und löst interrupt aus 
 +        - Im Interrupt von 9 herunterzählen: bei jeder 0 wäre es eine Millisekunde 
 +    - up-Down-Counter ansehen