Probleme mit ISR

Gast #2055688
Lesenswert?

Hallo

ich könnte zwei Tipps gebrauchen. Sobald man ins ISR springt ist Bit8 
immer auf LOW. Wieso?

Ein Fehler tritt auch beim << auf. Wie kann ich die hinteren Stellen 
wieder auf 1 setzen?
1
int main (void)
2
{
3
  DDRB = 0xFF;
4
  PORTB = 0xFF;
5
  
6

7
  TCCR1A |= (0<<COM1A1) | (1<<COM1A1);
8
  TCCR1B |= (1<<WGM12) | (1<<CS12);
9
  TIMSK1 |= (1<<OCIE1A);
10

11
  OCR1A = 1952;
12

13
  sei();
14
    
15

16
  while(1)
17
  {}
18
}
19

20

21
ISR(TIMER1_COMPA_vect)
22
{
23
  PORTB = PORTB<<1;
24
}
Gast #2055704
Lesenswert?

> Sobald man ins ISR springt ist Bit8 immer auf LOW. Wieso?

Bit8 von was?

> Ein Fehler tritt auch beim << auf.

Welcher?

> Wie kann ich die hinteren Stellen wieder auf 1 setzen?

DazuODERn mit dem bitweisen ODER Operator |
Gast #2056725
Lesenswert?

Das ist mir klar

Wenn ich aber 1111 1110 shiften will, wie kann ich wieder die hinteren 
Stellen mit 1 auffüllen.

1111 1110
1111 1101
1111 1011

Bei mir ist auch das Problem, wenn der Debugger das erste mal ins ISR 
springt ist die erste Stelle immer 0 obwohl ganz am Anfang  PORTB = 
0xFF;
steht.

0111 1111
Gast #2056786
Lesenswert?

> Wenn ich aber 1111 1110 shiften will, wie kann ich wieder die hinteren
> Stellen mit 1 auffüllen.
>
> 1111 1110
> 1111 1101
> 1111 1011
1
ISR(TIMER1_COMPA_vect)
2
{
3
  uint8_t carry;
4
  uint8_t tmp;
5
  tmp = PORTB;
6
  carry = tmp>>7;
7
  tmp <<= 1;
8
  tmp |= carry;
9
  PORTB = tmp;
10
}
Gast #2056879
Lesenswert?

Der Fehler ist, jedesmal wenn es ins ISR springt wird Bit8 von PortB=0
0111 1110

Wenn es in die while-Schleife kommt wird es wieder 1111 1101 und bei 
nächsten ISR wieder 0111 1011

1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <stdbool.h>
4

5

6

7
bool bedingung;
8

9
int main (void)
10
{
11
  DDRB = 0xFF;
12
  PORTB = 0xFF;
13
  
14

15
  PORTD = 0x04;
16
  DDRD = 0x04;
17

18
  TCCR1A |= (0<<COM1A1) | (1<<COM1A1);
19
  TCCR1B |= (1<<WGM12) | (1<<CS12);
20
  TIMSK1 |= (1<<OCIE1A);
21

22
  OCR1A = 1952;
23

24
  sei();
25
    
26
  PORTB = 0xFE;
27

28
  while(1)
29
  {
30
    if (bedingung == true)
31
    {
32
      PORTB = (PORTB<<1) | 1;
33

34
      if(PORTB == 0xF7)
35
      {
36
        PORTB = 0xFE;
37
      }
38

39
      bedingung = false;
40
    }
41
  }
42
}
43

44
ISR(TIMER1_COMPA_vect)
45
{
46
  bedingung = true;
47
}
Gast #2057004
Lesenswert?

>  TCCR1A |= (0<<COM1A1) | (1<<COM1A1);
>  TCCR1B |= (1<<WGM12) | ...

Sieh nach: Welchen Effekt haben diese Konfigurationsbits?

Haben die bei deinem mir unbekannten AVR eine Auswirkung auf den Pin PB7 
- Hardware-PWM vielleicht, die den Pin toggelt?
Gast #2057211
Lesenswert?

>(Output Compare and PWM Output A for Timer/Counter0, Output
>Compare and PWM Output C for Timer/Counter1 or Pin Change Interrupt 7)

Es ist Output Compare and PWM Output C for Timer/Counter1. Es ist für 
Output C ich benütze aber Output A.

Was mich noch interessieren würde, kann man Timer und PWM auf 
Timer/Counter1 gleichzeitig benützen?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren