Kesandal
01.07.2011, 21:19
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?!
while(PINB&_BV(1));
freq++;
while(!(PINB&_BV(1)));
2. Mit Timer0 in bestimmten Zeitabständen (kleiner als 1 Sekunde) OC0 toggeln.
OCR0=180; // 1/20
TCNT0=0;
TCCR0=(1<<WGM01)|(1<<CS12)|(1<<CS00)|(1<<COM00); // CTC, pr=1024, bei Match OC0 toggle
Warum 180?
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 :D
Also habe ich hier 20hz.
3. Da OC0 mit ICP1 verbunden ist kann ich den "Input Capture" Modus vom Timer1 verwenden.
// Timer 1
TCNT1=0;
TCCR1B=(1<<WGM13)|(1<<WGM12)|(1<<CS12)|(1<<CS10)|(1<<ICNC1)|(1<<ICES1);
CTC wenn externes Signal, steigende Flanke und Noice-Canceler einschalten.
Sooooo.
das ganze sieht dann folgendermaßen aus (Punkt2 und 3. Punkt1 weiß ich noch nicht wie ich es implementieren soll :( )
#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
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?!
while(PINB&_BV(1));
freq++;
while(!(PINB&_BV(1)));
2. Mit Timer0 in bestimmten Zeitabständen (kleiner als 1 Sekunde) OC0 toggeln.
OCR0=180; // 1/20
TCNT0=0;
TCCR0=(1<<WGM01)|(1<<CS12)|(1<<CS00)|(1<<COM00); // CTC, pr=1024, bei Match OC0 toggle
Warum 180?
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 :D
Also habe ich hier 20hz.
3. Da OC0 mit ICP1 verbunden ist kann ich den "Input Capture" Modus vom Timer1 verwenden.
// Timer 1
TCNT1=0;
TCCR1B=(1<<WGM13)|(1<<WGM12)|(1<<CS12)|(1<<CS10)|(1<<ICNC1)|(1<<ICES1);
CTC wenn externes Signal, steigende Flanke und Noice-Canceler einschalten.
Sooooo.
das ganze sieht dann folgendermaßen aus (Punkt2 und 3. Punkt1 weiß ich noch nicht wie ich es implementieren soll :( )
#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