Hallo an alle,
danke für eure prompten Antworten. Leider bin ich immer noch nicht weiter. Die If-Abfrage muss natürlich in die Endlosschleife. Ich hatte vorher da stehen Zeittick = 0 und in der if-Abfrage if Zeittick == 1
Habe die Abfrage jetzt wieder in die Endlosschleife genommen, aber ohen Erfolg. Auch die Verwendung einer unit8_t Variable brachte keinen Unterschied 
Ich poste mal den gesamten Code, vielleicht hab ich ja doch anderer Stelle einen Denkfehler.....
Code:
#include <../include/avr/io.h>
#include <../include/avr/interrupt.h>
#include <../include/stdlib.h>
#include <../include/util/delay.h>
#define UPPPER_BOUND 10
volatile uint8_t Zeittick ;
int myRand( int UpperBound )
{
int x;
while( (x = rand()) >= RAND_MAX - (RAND_MAX % UPPPER_BOUND) )
;
return x % UPPPER_BOUND;
}
// Eine nichtunterbrechbare Interrupt-Service-Routine
SIGNAL (TIM1_COMPA_vect)
{
// ISR-Code
//PORTB ^= (1<<PB2);
//PORTB |= (1 << PB2); // setzt Bit 3 an PortB auf 1
PORTB &= ~(1 << PB2); // loescht Bit 3 an PortB
Zeittick = Zeittick + 1;
}
SIGNAL (TIM1_OVF_vect)
{
// ISR-Code
//PORTB ^= (1<<PB2);
PORTB |= (1 << PB2); /* setzt Bit 3 an PortB auf 1 */
//PORTB &= ~(1 << PB2); /* loescht Bit 3 an PortB */
Zeittick = Zeittick + 1;
}
void long_delay(uint16_t ms) {
for(uint16_t temp=0; temp<=ms; temp++){ _delay_ms(1);}
}
int main (void) {
//Zeittick = 0;
// allgemein
GTCCR = 0b11100001; // Timer anhalten
SREG |= (1 << 7);
GIMSK = 0b00100000;
PCMSK = 0b00000100;
// Timer 0
TCCR0A = 0b11100001; // Timer0 A und B auf Phasecorrect PWM-Mode
// und löschen bei erreichen des Werte in OC0A bzw.
// OC0B
TCCR0B = 0b00000010; // WGM02-Bit löschen für PWM-POhase-Correct-Mode
// OC0A-Ausgang wird beim hchzählen gesetzt und
// beim runterzählen gelöscht
// und Prescaler auf clk/1024 einstellen
OCR0A = 0b01100011; // Output-Compare-Register einstellen
OCR0B = 0b00101111; // Output-Compare-Register einstellen
// Timer 1
TCCR1 = 0b01000101;
OCR1A = 0b11000000;
OCR1B = 0b00011111;
OCR1C = 0b11111111;
TIMSK = 0b01000100;
// sei();
// OCR1A = 0b01111111;
// OCR1B = 0b00111111;
DDRB = 0b11111111; // PortB auf Ausgabe stellen
GTCCR = GTCCR & 0b11111110 ;//0b00000000; // Timer starten
uint8_t Dauer_LED1 = 2;//myRand(255);
uint8_t Helligkeit_LED1 = 255;//myRand(255);
uint8_t LED1;
while(1) {
if (Zeittick >= 3)
{
//PORTB ^= (1<<PB3);
//Zeittick = 0;
PORTB |= (1 << PB3); // setzt Bit 3 an PortB auf 1
}
/*
for (LED1 = 0; LED1<Helligkeit_LED1;LED1++)
{
OCR1B=LED1;
_delay_ms(Dauer_LED1);
}
//PORTB |= (1 << PB2); // setzt Bit 3 an PortB auf 1
//long_delay(1000);
for (LED1 = 0; (Helligkeit_LED1-LED1)>0;LED1++)
{
OCR1B=255-LED1;
_delay_ms(Dauer_LED1);
}
*/
//PORTB &= ~(1 << PB2); // loescht Bit 3 an PortB
//long_delay(1000);
/*
OCR0A = 100;
long_delay(1000); // Eine Sekunde warten...
OCR0A = 1;
long_delay(1000); // Eine Sekunde warten...
*/
//PORTB |= (1 << PB2); /* setzt Bit 3 an PortB auf 1 */
}
return 0;
}
Ich verstehs nicht. Wenn noch jemand eine Idee hat wäre das klasse. Nur noch als Info, mit diesem Code könnt ihr alle vier PWM Kanäle des Tiny25 nutzen, klappt prima. Nur eben bis auf die Geschichte mit der globalen Variable.
Internette Grüße
Stefan
Lesezeichen