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?!
Code:
while(PINB&_BV(1));
freq++;
while(!(PINB&_BV(1)));
2. Mit Timer0 in bestimmten Zeitabständen (kleiner als 1 Sekunde) OC0 toggeln.
Code:
    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
Also habe ich hier 20hz.



3. Da OC0 mit ICP1 verbunden ist kann ich den "Input Capture" Modus vom Timer1 verwenden.

Code:
// 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 )

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