PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Compare Register



chouifi
28.10.2005, 11:52
Hallo,
ich brauche dringend Hilfe , ich bin neue Mikrokontroller_einsteiger.ich arbeite momentan mit avr AT90s8515 . ich möchte OC1 steuren duch TCNT1H/L und Vergleichsregister OCR1A aber es hat nicht geklappt . "ich habe Datenblatt gelesen aber hat nicht geholfen",ich möchte OC1 nur mit Timer setzen und zurücksetzen für 1s und COMPARE INTERRUPT muss Timer stopen.

viel Güsse Majid

kater
28.10.2005, 13:06
Na zeig mal dein bisheriges Programm.

chouifi
28.10.2005, 14:30
hallo ,
ich bedanke mich, für deinen Antwort.

/************************************************** ***********************
* ______ _______
* PORTA _______| |_______________| |________
* .C ____ ____
* OC1 ___________| |_________________| |_________
************************************************** ************************/

#include <avr\io.h> // Wir brauchen Zugriff auf die I/O's des Controllers
#include <avr\signal.h>
#include <avr\interrupt.h>
#include <avr\eeprom.h> // Und auf das Flash
#include <inttypes.h>



volatile int timer_flag1, timer_flag;
long t1s;
#define FCLOCK 8000000
#define TCNT0_Reload 6
/************************************************** ***********************
*
* für Quartz 8.000MHz
*
************************************************** ***********************/
SIGNAL(SIG_OVERFLOW0) {
outb(TCNT0, TCNT0_Reload);
timer_flag=1;
}



INTERRUPT(SIG_OUTPUT_COMPARE1A){ /* Compare Match INTERRUPT */
outb(TCCR1B, 0x00); // Timer stoppen
}



int main(void) {
outb(DDRA, 0xff); /* A als Ausgang*/
outb(DDRD, 0xff); /* D als Ausgang OC1A*/

outb(TCNT0, TCNT0_Reload);
outb(TCCR0, 0x03); // CPU/64

outb(TCNT1H,0xC2);
outb(TCNT1L,0xF7);

outb(TCCR1B, 0x03);// ab hier fängt Zähler zu zählen

outb(TIMSK, inb(TIMSK) | BV(TOIE0)); /* enable T0 IRQ */
outb(TIMSK, inb(TIMSK) | BV(OCIE1A)); /* wenn dieses Bit gesetzt ist, wird beim Erreichen
// des Vergleichswert ein Compare Match INTERRUPT ausgelöst*/
outb(OCR1AH, 0x3D); /* vergleichwert wird in Vergleichregister (OCR1A) gelegt */
outb(OCR1AL, 0x09);

outb(TCCR1A, (1<<COM1A1)|(1<<COM1A0));
sei(); /* hier wird Interrupt1 gesetzt*/

/************************************************** ***********************
* MAIN_Loop
*/
for(;;) { // ... ever

while(timer_flag==0) {

}
timer_flag=0;

t1s++;
if(t1s>=1000){
t1s=0;
if(bit_is_clear(PORTA, PINA0)){
sbi(PORTA, 0);
sbi(PORTA, 2);
sbi(PORTA, 4);

}else{
cbi(PORTA, 0);
cbi(PORTA, 2);
cbi(PORTA, 4);

}

}

} // for(;;)
return 0;
}

kater
28.10.2005, 15:19
Was mir sofort auffaelt ist, dass du PORTA als Ausgang eingestellt hast, aber hier: if(bit_is_clear(PORTA, PINA0)) benutzt du PINA. Da sollte schon PA0 stehen. Man benutzt ueberigends auch kein cbi, sbi und out mehr.
Versuch mal folgendes Tutorial durchzuarbeiten, dann findest sicher noch mehr Fehler. Vorallem Kapitel 8 sollte interesannt sein:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

chouifi
31.10.2005, 13:47
hi,
danke für dein Tips