Forum: Compiler & IDEs Probleme mit ISR


von gccc (Gast)


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
}

von Seltsam (Gast)


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 |

von sven (Gast)


Lesenswert?


von ich (Gast)


Lesenswert?

Das ist kein Fehler, das gehört so! Leere Stellen beim Bitshiften werden 
mit Nullen auf gefüllt!

von gccc (Gast)


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

von Floh (Gast)


Lesenswert?

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

| 1 ?
also einfach:
PORTB = (PORTB<<1) | 1;

von Seltsam (Gast)


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
}

von Seltsam (Gast)


Lesenswert?

> 1111 1110
> 1111 1101
> 1111 1011
  1111 0111
  1110 1111
  1101 1111
  1011 1111
  0111 1111 <===
  1111 1110 <===
  ...

von gccc (Gast)


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
}

von Seltsam (Gast)


Lesenswert?

Informiere dich über das fehlende Schlüsselwort volatile bei der 
Definition von bool bedingung;

von Seltsam (Gast)


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?

von gccc (Gast)


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?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.