An T1=PB1 wird ein Rechtecksignal mit variabler Frequenz angelegt.
Diese kann man mit Timer1 zählen.
Erzeugen Sie dann eine Torzeit mit Timer0 im CTC-Modus welche kleiner als 1 Sekunde sein soll.
Dann verbinden Sie OC0=PB3 mit ICP1=PD6, um am Ende der Torzeit automatisch einen Input Capture den momentanen Stand von Timer1 auszulesen [...]
Leider habe ich ein wenig Probleme mit der Aufgabenstellung.
So wie ich das verstanden habe muss ich folgendes tun:
1. Irgendwie PB1 verarbeiten. Ich denke hiermit ist nicht soetwas gemeint?!
2. Mit Timer0 in bestimmten Zeitabständen (kleiner als 1 Sekunde) OC0 toggeln.Code:while(PINB&_BV(1)); freq++; while(!(PINB&_BV(1)));
Warum 180?Code:OCR0=180; // 1/20 TCNT0=0; TCCR0=(1<<WGM01)|(1<<CS12)|(1<<CS00)|(1<<COM00); // CTC, pr=1024, bei Match OC0 toggle
Nun.. Da es ja ein 8bit-Register ist kann ich nicht höher als 256 gehen.
Und in der Aufgabenstelung ist von kleiner als 1 Sekunde die Rede![]()
Also habe ich hier 20hz.
3. Da OC0 mit ICP1 verbunden ist kann ich den "Input Capture" Modus vom Timer1 verwenden.
CTC wenn externes Signal, steigende Flanke und Noice-Canceler einschalten.Code:// Timer 1 TCNT1=0; TCCR1B=(1<<WGM13)|(1<<WGM12)|(1<<CS12)|(1<<CS10)|(1<<ICNC1)|(1<<ICES1);
Sooooo.
das ganze sieht dann folgendermaßen aus (Punkt2 und 3. Punkt1 weiß ich noch nicht wie ich es implementieren soll)
Code:#define SYSTEMCLOCK 3686400 #define F_CPU 3686400UL #define LCD_PORT PORTC #include <avr/io.h> #include <avr/interrupt.h> #include "display.inc" volatile unsigned long freq = 0; volatile unsigned int tim0_cnt = 0; int main(void){ DDRC=0xff; DDRB=0xff; lcd_init(); PORTB=0xff; lcd_setcursor(0,0); lcd_putstring("Freq: "); OCR0=180; // 1/20 TCNT0=0; TCCR0=(1<<WGM01)|(1<<CS12)|(1<<CS00)|(1<<COM00); // CTC, pr=1024, bei Match OC0 toggle // Timer 1 TCNT1=0; TCCR1B=(1<<WGM13)|(1<<WGM12)|(1<<CS12)|(1<<CS10)|(1<<ICNC1)|(1<<ICES1); TIMSK=(1<<OCIE0); TIFR=(1<<ICF1); while(1){ if((TIFR&_BV(ICF1))!=0){ TIFR=(1<<ICF1); lcd_setcursor(6,0); lcd_putdez_uint(ICR1); } } return 0; }
Problem
Ich glaube er kommt nichtmal in die If-Schleife (innerhalb der While) rein![]()
Besten Dank
Kesandal







Zitieren

Lesezeichen