Nigthlord
19.11.2007, 15:29
Hallo Leute,
Sorry dass ich euch wiedermal auf die Nerwen falle aber ich brauche "mal wieder" eure Hilfe.
Ich habe folgendes Programm:
// Timer_Interrupt_TEST_2.c Programm //
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
int A;
int Delai;
// Routine d'interruption
//-----------------------
ISR (TIMER1_COMPB_vect) {
if(A==0x00){
PORTB=0x05;
}
if(A==0x01){
PORTB=0x00;
}
if(A==0x0A){
PORTB=0x0A;
}
if(A==0x0B){
PORTB=0x00;
}
A=A++;
OCR1B=TCNT1+Delai;
if(A==0x14){
A=0;
}
}
// Programme principal:
//---------------------
int main () {
A=0;
DDRB=0xFF; // PORTB mis en sortie
DDRC=0xFF;
Delai=3686000/20/20/165;
TCCR1B=(3<<CS10); // timer1 source: ck/64
OCR1B=TCNT1+Delai; // initialisation du registre de comparaison
TIMSK|=(1<<OCIE1B); // autorisation de l'interruption
sei (); // autorisation de toutes les interruptions
while (1){
}
}
Dieses Program funktioniert auch prima nur ich muss es noch soweit ergänzen , dass die ISR Routine durchlaufen wird wenn PORTA == 0x01 ist.
d.h. erst wenn Pin 0 am portA betätigt wird, soll die unterrupt routine durchlaufen werden und dann erst beim nachsten betätigen von Pin 0 wieder von vorn durchlaufen werden.
Dieses Programm soll für eine B2 Schaltung mit Thyristoren sein.
Am Pin0 vom port A soll ein Rechtecksignal anliegen der immer dann 1 wird, wenn der Nulldurchgang der Positiven halbwelle erfolgt und während 2-5ms anliegt.
Da der Nulldurchgang aber immer nur 1x pro Periode kommt , soll nach ablaufren der ISR der Programm in der While(1) schleifr "nix tuhn" bis wieder der Pin0 am portA betätigt wird.
hab es schon mit sei (); in einer If schleife probiert und mit einer cli(); im "if(A==0x14){
A=0;
}" probiert, ist aber nix draus geworden :-(
Ich habe mir überlegt , wenn man eine if schleife schreiben würde, wo man den Timer1 startet und am ende der ISR routine :
" if(A==0x14){
A=0;
}"
den Timer1 wieder Stoppen würde, dann müsste es gehen, da bei dem nachsten betätigen von Pin0 am PortA der Timer ja wieder gestartet werden würde. Das Problem ist ich weiss nicht wie ich den timer Stoppen und Starten kann.
Wass kann ich denn jetzt tun
Ein Newbie fragt den Forengötter um rat.
Euer Nightlord
Sorry dass ich euch wiedermal auf die Nerwen falle aber ich brauche "mal wieder" eure Hilfe.
Ich habe folgendes Programm:
// Timer_Interrupt_TEST_2.c Programm //
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
int A;
int Delai;
// Routine d'interruption
//-----------------------
ISR (TIMER1_COMPB_vect) {
if(A==0x00){
PORTB=0x05;
}
if(A==0x01){
PORTB=0x00;
}
if(A==0x0A){
PORTB=0x0A;
}
if(A==0x0B){
PORTB=0x00;
}
A=A++;
OCR1B=TCNT1+Delai;
if(A==0x14){
A=0;
}
}
// Programme principal:
//---------------------
int main () {
A=0;
DDRB=0xFF; // PORTB mis en sortie
DDRC=0xFF;
Delai=3686000/20/20/165;
TCCR1B=(3<<CS10); // timer1 source: ck/64
OCR1B=TCNT1+Delai; // initialisation du registre de comparaison
TIMSK|=(1<<OCIE1B); // autorisation de l'interruption
sei (); // autorisation de toutes les interruptions
while (1){
}
}
Dieses Program funktioniert auch prima nur ich muss es noch soweit ergänzen , dass die ISR Routine durchlaufen wird wenn PORTA == 0x01 ist.
d.h. erst wenn Pin 0 am portA betätigt wird, soll die unterrupt routine durchlaufen werden und dann erst beim nachsten betätigen von Pin 0 wieder von vorn durchlaufen werden.
Dieses Programm soll für eine B2 Schaltung mit Thyristoren sein.
Am Pin0 vom port A soll ein Rechtecksignal anliegen der immer dann 1 wird, wenn der Nulldurchgang der Positiven halbwelle erfolgt und während 2-5ms anliegt.
Da der Nulldurchgang aber immer nur 1x pro Periode kommt , soll nach ablaufren der ISR der Programm in der While(1) schleifr "nix tuhn" bis wieder der Pin0 am portA betätigt wird.
hab es schon mit sei (); in einer If schleife probiert und mit einer cli(); im "if(A==0x14){
A=0;
}" probiert, ist aber nix draus geworden :-(
Ich habe mir überlegt , wenn man eine if schleife schreiben würde, wo man den Timer1 startet und am ende der ISR routine :
" if(A==0x14){
A=0;
}"
den Timer1 wieder Stoppen würde, dann müsste es gehen, da bei dem nachsten betätigen von Pin0 am PortA der Timer ja wieder gestartet werden würde. Das Problem ist ich weiss nicht wie ich den timer Stoppen und Starten kann.
Wass kann ich denn jetzt tun
Ein Newbie fragt den Forengötter um rat.
Euer Nightlord