Gast
#2288366
Hallo, ich hab ein kleines Programm geschrieben und habe noch zwei
Problem.
Die Funktion: OUTPUT_PWM_INIT soll einfach nur einen Pin ein und
ausschalten. mit ca. 2000 Hz (1000 bis 5000Hz sind OK). Kurz um, geht so
noch nicht!
Das zweite Problem ist in der main, im while loop. Ich möchte einen
sollwert aus dem PORTC einlesen. Und diesen Wert für das Zählen des
Interrupt ereignisses nutzen. Das lesen geht so nicht. Was muss ich
machen?
Hier der Code.
Danke Liloba
PS. ich bin Anfänger, bitte bei der Antwort berücksichtigen!
#include <avr/io.h>
#include <avr/interrupt.h>
//unsigned char
typedef enum {FALSE,TRUE} logic;
logic HolzIstNeu;
int sollwert=4;
int istwert=0;
void Init(void);
void output_H(void);
void output_L(void);
void OUTPUT_PWM_INIT(void);
SIGNAL(SIG_INTERRUPT0){ // Laser Singnal
if (HolzIstNeu == 1){
istwert++;
if(istwert>=sollwert){
HolzIstNeu = FALSE;
istwert=0;
output_L();
}
}
else{
output_L();
}
}
SIGNAL(SIG_INTERRUPT1){ // Holz Singnal
HolzIstNeu = TRUE;
output_H();
}
void Init(void){
DDRB=0xff;
// MCU Contol Register
MCUCR |= 0b00001111; //-steigende Flanke
//General Interrupt Control Register
GICR |= (1 <<INT0);
GICR |= (1 <<INT1); // 1 meint Frei, 0 meint gesperrt
sei(); // alle interrupt frei
OUTPUT_PWM_INIT();
}
void OUTPUT_PWM_INIT(void){
TCCR1A |= (1 << COM1A0); //Invertierende PWM
TCCR1A |= (1 << COM1A1); //Der Ausgangspin wird gelöscht beim
Herunterzählen und gesetzt beim Hochzählen
TCCR1A = (1<<COM1A1) | (1<<WGM11);
//PWM, Phase Correct, 9-Bit
TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS10);
// | (1<<CS12); //Teiler auf 64 gesetzt
OCR1A = 0b00001111; //verglichswert für Timer
(Abschaltungszeitpunkt)
}
void output_H(void){
PORTB |= (1 << PB0);
}
void output_L(void){
PORTB &= ~(1<<PB0);
}
int main(void)
{
Init(); // Init starten
do{ sollwert = 10*PORTC; // einlesen von "sollwert"
}while(1);
}