PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage über OCF0 Checking in ATmega16 Timer0



PaMan
30.07.2007, 20:01
Hallo Zusammen,

Ich habe über Timer0 in CTC Mode versucht. Und zwar wollte OCF0 Flag
überprüfen, ob Set oder nicht Set ist.

Ich habe ein Programm versucht zu schreiben, aber nicht funktioniert..
T.T
In If Loop funktioniert nicht richtig.
Könnten Sie mir ein Vorschlag geben, was ich machen sollte

Gruß

PaMan O:)



#include <avr/interrupt.h>
#include <avr/io.h>
#include <stdint.h>
/************************************************** ****************************/

int main (void)
{
DDRA = 0xFF; // Set PortA as Output

DDRB = 0b11111010; // PB3( OC0 as Output) PB0(T0 as Input)
PB2(SW as Input)
PORTB = 0b00000101;


while(PINB & (1<<PINB2)); // wait switch clear to start

//Initial Timer/Counter0
TCNT0 = 0x00; // Clear counter
OCR0 = 0xFF; // Match at Top
TIFR |= (1<<OCF0); //

while(1)
{
TCCR0 = 0b00011110; // Start T/C0, CTC Mode, extclk T0

if (OCF0==1)
{ PORTA |= (1<<PORTA1); // show OK at PortA1 }

else
{ PORTA |= (1<<PORTA2); // show NOK at PortA2 }
}
}

uwegw
30.07.2007, 20:32
So
if (OCF0==1)
kann man einzelne Bits nicht abfragen.

Besser so:
if (TIFR&(1<<OCF0))

[Hintergrund: das OCF0 wird von Präprozessor durch eine 1 ersetzt, weil dies die Position dieses Bits in TIFR ist. Der Vergleich wäre also immer wahr gewesen. Die korrwekte Varinate prüft, ob das Bit an der Position 1(=OCF0) in TIFR gesetzt ist.]

izaseba
30.07.2007, 20:43
Außerdem mußt Du den Flag per Hand löschen, etwa so:


TIFR=(1<<OCF0);


Gruß Sebastian

PaMan
30.07.2007, 22:08
ohhhh so ist das, "kann man einzelne Bits nicht abfragen"

Danke für eure Hilfe ... O:)

PaMan