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